Android had no standard midi protocol before Marshmallow. Even after a standard MIDI event API for a developer to build android app which does midi synthesis by itself is a great feature!. In 2016 i compiled FluidSynth 1.6 for Android and created a SoundFont Midi Player with USB keyboard support. This app can play midi, rmi files and can send midi events via USB MIDI Keyboard, Normal USB keyboard to fluidsynth to synthesize sound. Due to latency and high CPU consumption issues i decided to look at other options. One good option was WildMidi.
WildMidi - https://www.mindwerks.net/projects/wildmidi/
It says -
"The WildMIDI library uses Gravis Ultrasound patch files to convert MIDI files into audio which is then passed back to the calling application for further processing or output
Library Features
In Player features Android sound system is not mentioned and that doesn't mean it cannot be used in Android. I compiled WildMidi for Android and the link to download the binary package is mentioned later in this page. I tested WildMidi on Ubuntu-Studio which had inbuilt "FreePats". The Gravis Ultrasound Patch files are used by WildMidi to synthesize sound. We can use WildMidi player to play midi files on Android by modifying its player code by sending PCM buffer to Android OpenSLES or AudioTrack.
Can wildmidi be used for sending MIDI events to build piano like app with fast response? Currently NO as per wildmidi source!
Looking at source code of wildmidi inside wildmidi_lib.h. It says "Not Yet Implemented". That "latency" thing! everywhere.
This can be used to build a midi player for android using wildmidi synthesizer. The build script is same as libpng build script mentioned on my other article.
Download wildmidi arm binary from here:
https://github.com/bindeshkumarsingh/android-native-libs
WildMidi - https://www.mindwerks.net/projects/wildmidi/
It says -
"The WildMIDI library uses Gravis Ultrasound patch files to convert MIDI files into audio which is then passed back to the calling application for further processing or output
Library Features
- RIFF MIDI file support
- MIDI format 0, 1 and 2 support
- MIDI-like formats: KAR, HMI, HMP, MUS and XMI
- Cross Platform: Linux, Windows, OSX, FreeBSD and etc.
- Thread safe
- host-Endian native streaming
- WAV file output
- Linear and gauss re-sampling
- Final output reverb engine
- Timidity.cfg compatibility
- OSS and Alsa Output (Linux/FreeBSD)
- Windows Sound System support (Windows)
- OpenAL (OSX/Others)
- SoundBlaster 16 (DOS)"
In Player features Android sound system is not mentioned and that doesn't mean it cannot be used in Android. I compiled WildMidi for Android and the link to download the binary package is mentioned later in this page. I tested WildMidi on Ubuntu-Studio which had inbuilt "FreePats". The Gravis Ultrasound Patch files are used by WildMidi to synthesize sound. We can use WildMidi player to play midi files on Android by modifying its player code by sending PCM buffer to Android OpenSLES or AudioTrack.
Can wildmidi be used for sending MIDI events to build piano like app with fast response? Currently NO as per wildmidi source!
Looking at source code of wildmidi inside wildmidi_lib.h. It says "Not Yet Implemented". That "latency" thing! everywhere.
Preview:
/* NOTE: Not Yet Implemented Or Tested Properly */ /* Due to delay in audio output in the player, this is not being developed futher at the moment. Further Development will occur when output latency has been reduced enough to "appear" instant. WM_SYMBOL int WildMidi_Live (midi * handle, uint32_t midi_event); */ /* reserved for future coding * need to change these to use a time for cmd_pos and new_cmd_pos WM_SYMBOL int WildMidi_InsertMidiEvent (midi * handle, uint8_t char midi_cmd, *char midi_cmd_data, unsigned long int midi_cmd_data_size, unsigned long int *cmd_pos); WM_SYMBOL int WildMidi_DeleteMidiEvent (midi * handle, uint8_t char midi_cmd, unsigned long int *cmd_pos); WM_SYMBOL int WildMidi_MoveMidiEvent (midi * handle, , uint8_t char midi_cmd, unsigned long int *cmd_pos, unsigned long int *new_cmd_pos); */
This can be used to build a midi player for android using wildmidi synthesizer. The build script is same as libpng build script mentioned on my other article.
Download wildmidi arm binary from here:
https://github.com/bindeshkumarsingh/android-native-libs