NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #5285 most downloaded on pub.dev
The `flutter_midi_pro` plugin provides functions for loading SoundFont (.sf2) files, changing instruments and playing notes with midi commands.
Last release 3 months ago
10 Jul 2026
Release timing varies
gaps range from 4 weeks to 1.1 years
Nearly every release is documented
notes for 21 of 23 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
23 releases · first in 2023
- #56 fix.
Readme updated to point to the new example directory.
No longer applies the Kotlin Gradle Plugin on Flutter versions with built-in Kotlin support (AGP 9+); on older versions it is applied conditionally, s
One column per quarter.
kotlinOptions block was replaced with the kotlin.compilerOptions DSL accordingly.The audio session is re-activated before restarting the engine, and playNote self-heals a stopped engine as a last resort (thanks @avour, #55).
playNote self-heals a stopped engine as a last resort (thanks @avour, #55).Upgraded FluidSynth from 2.4.8 to 2.5.6 (official Android binaries), which includes fixes for six security vulnerabilities in SF2/MIDI/DLS file parsin…
init() must be called before any other method. Calling any method before init() throws a StateError.dispose() now fully shuts the synthesizer down and requires the package to be initialized; calling it while not initialized throws a StateError. After dispose() you can call init() again — the init/dispose cycle can be repeated any number of times.init() while already initialized throws a StateError instead of silently re-initializing.isInitialized getter to query the current lifecycle state.MidiPro is now a true singleton: every MidiPro() call returns the same instance.init() is hot-restart safe: a native engine surviving a Flutter hot restart is reset and re-created cleanly.init() and kept alive, instead of opening/closing an audio stream on every load/unload.ANDROID_STL=c++_shared (the official binaries require the NDK's libc++_shared.so), and the unused OpenMP runtime is no longer packaged.android/src/main/cpp/fluidsynth is supported for offline builds. This shrinks the pub.dev package and the repository dramatically.cmake.dir on Linux).loadSoundfontData wrote a new timestamped file on every call and never deleted it. Temporary soundfont copies are now tracked and deleted when the soundfont is unloaded or dispose() is called, and leftovers from crashed sessions are cleaned up on init().dispose().playNote/stopNote/selectInstrument/controlChange were called with an unknown soundfont ID or an out-of-range channel; these calls are now silently ignored, matching the Android behavior. stopAllNotes/unloadSoundfont with an unknown ID no longer return an error either.pitchBend(value, channel, sfId): 14-bit pitch wheel messages (0-16383, center 8192) on all platforms.setPitchBendRange(semitones, channel, sfId): pitch bend sensitivity per channel (RPN 0 on iOS/macOS).channelPressure(pressure, channel, sfId) and keyPressure(key, pressure, channel, sfId): channel and polyphonic aftertouch.setMasterGain(gain): global output volume as a linear multiplier (1.0 default; boost supported).panic(): instantly silences every channel of every loaded soundfont and recenters pitch bend, without touching selected instruments.sendMidiEvent(status, data1, data2, sfId): raw MIDI channel message passthrough for bridging hardware MIDI input.init() now accepts configuration options: sampleRate (match the device's native rate to lower latency), bufferSize (audio period size in frames) and polyphony (maximum simultaneous voices). On iOS these map to the audio session's preferred sample rate / IO buffer duration.getPresets(sfId) returns the (bank, program, name) list of a loaded soundfont, and the static MidiPro.parseSoundfontPresets(bytes) parses raw sf2 data. Pure Dart, works on all platforms.setReverb(enabled, roomSize, damping, width, level) and setChorus(enabled, voiceCount, level, speed, depth). Currently Android-only (FluidSynth); no-op on iOS/macOS for now.setReverb/setChorus are called. If you relied on the old default Android reverb, call setReverb(enabled: true) after init.loadMidiFile/loadMidiAsset/loadMidiData, playMidi/pauseMidi/stopMidi, seekMidi(tick), setMidiTempo(factor) (pitch-preserving speed for practice), setMidiLoop(count) and getMidiPlayerState() (status, position, BPM, PPQ). Player events are routed into the target soundfont's channels, so instrument selection and expression controls apply to file playback.configureAudioSession(category, mixWithOthers, duckOthers) (iOS only): control how the synth coexists with other audio — keep background music playing, survive video/ad session takeovers, ignore the ring/mute switch with the playback category. Callable at any time.setReverb now works on iOS/macOS too: roomSize maps to the closest reverb preset, level to the wet/dry mix (damping/width remain Android-only).setEqualizer(enabled, bassGain, midGain, trebleGain), setDelay(enabled, time, feedback, lowPassCutoff, wetDryMix) and setDistortion(enabled, preset, preGain, wetDryMix) — iOS/macOS only, no-op on Android.selectInstrument no longer sends a redundant program change that used the wrong (melodic) bank for percussion and could undo the selection. macOS also gained the percussion bank (128) mapping that iOS already had.dispose()/init() cycles. Stream open/close transitions pop on some devices even in silence, so init/dispose cycles now reuse the running audio stream instead of closing and reopening it: dispose() fades the output, silences and resets the engine but keeps the stream warm; the stream is actually closed ~30 s after dispose or when the plugin detaches, and any real close is preceded by a fade + silence drain.stopAllNotes method updated to turn off sustain before stopping notes.
- Support for 16kb page size - Version bump for android side
- Cmake minsdkversion fix
- Sound level fix.
1 second delay added when loading sf2 file.
Low sound level on Android was fixed.
Click sound when loading sf2 file was fixed.
- Readme updated.
Android sythesizer method changed to fluidsynth for better performance, stability and sound quality.
- Stop all notes added.
Faster and more stable especially for Android.
- Instance error fixed.
Nothing published for this version
Class name FlutterMidiPro to MidiPro
- Minor fix.
Nothing published for this version
- Readme added.
- Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →