NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3878 most downloaded on pub.dev
A Flutter plugin for sending and receiving MIDI messages between Flutter and physical and virtual MIDI devices.
Last release 24 days ago
14 Sep 2026
Ships unpredictably
gaps range from 8 days to 1.2 years
Nearly every release is documented
notes for 59 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
74 releases · first in 2018
FIX: resolve MIDI running status correctly on every transport. A device that sends a status byte once and then only data bytes — an M-VAVE SMK-25 Mini
MidiMessageSplitter in flutter_midi_command_platform_interface is the shared MIDI-assembly stage every transport now feeds, and MidiPacket documents the contract they all satisfy: data is exactly one complete MIDI message with all transport framing removed.MidiMessageParser aborts an open SysEx on a status byte rather than burying it in the payload, and bounds its buffer.^1.3.0.One column per quarter.
FIX: addVirtualDevice, removeVirtualDevice and setNetworkSessionEnabled return Future instead of void. The platform call was previously discarded, so
addVirtualDevice, removeVirtualDevice and setNetworkSessionEnabled return Future<void> instead of void. The platform call was previously discarded, so a failure such as PlatformException(AUDIOERROR, Error -2 while create MIDI virtual source) escaped as an unhandled asynchronous error that no try/catch around the call could see. Await them to handle failures. Existing calls that ignore the result keep compiling; custom MidiCommandPlatform implementations must widen these three overrides from void.setNetworkSessionEnabled(true) rather than at plugin init, so apps using only Bluetooth, USB or virtual MIDI never trigger it. Thanks to @aleksei-svezhevskii for the fix.^1.2.0.FIX(ble): retry a connection sequence whose link was torn down mid-handshake. universal_ble reports that as deviceDisconnected rather than a GATT stat
deviceDisconnected rather than a GATT status, so the retry shipped in 1.1.1 did not apply. Unlike a GATT status the code cannot arise from a peripheral that was never reachable, so it is honoured on every platform.^1.1.2.FIX(ble): retry the whole connection sequence through transient Android GATT_ERROR 133 failures, including failures during service discovery and notif
GATT_ERROR 133 failures, including failures during service discovery and notification subscription.stopScan failures when Bluetooth is switched off during a scan instead of surfacing an unhandled asynchronous error.^1.1.1.FIX(darwin): read every packet of a coalesced MIDIPacketList from the original list memory. Packets after the first were read from unrelated memory an
MIDIPacketList from the original list memory. Packets after the first were read from unrelated memory and anything over 256 bytes was truncated, affecting virtual devices; native devices already had a correct implementation. Virtual device timestamps now report nanoseconds, matching native devices.MidiCommand.sendDataAwaitingDelivery, completing once the transport has written the data rather than queued it, so a bulk transfer can pace against the link rather than a fixed delay. Only the BLE transport observes delivery; platform-routed devices complete immediately, as with sendData.UniversalBleMidiTransport flags useNegotiatedMtu and requestHighPerformanceConnection opt out. These apply on Android, Windows and Linux; on iOS and macOS a connected device is handed over to CoreMIDI, which then owns the write path.MidiCommand.onBleWriteFailure, reporting BLE writes the platform rejected. sendData is fire-and-forget, so this is the only signal that a packet was dropped. Bulk transfers that split a payload across many SysEx messages should treat any event as a corrupted transfer. Silent on Apple platforms for devices handed off to CoreMIDI, which has no equivalent per-write signal, so it complements rather than replaces device-level acknowledgements.0xF7 in every SysEx packet. It was omitted whenever the remaining body was exactly one byte short of the packet size.MidiBleTransport gained onWriteFailure. Classes using implements MidiBleTransport must declare it; extends and all API consumers are unaffected. See the platform interface changelog.^1.1.0.FIX(ble): stop the opportunistic MTU request from stalling Android connections. It was issued from the connection callback and, because universal_ble
GATT_ERROR 133 (surfaced as Unknown Error 133).GATT_ERROR 133, and keep the device in the transport cache across that retry so received data still resolves to it.^1.0.9.FIX(darwin): report CoreMIDI destinations as inputPorts and sources as outputPorts so port direction matches Android and the public device-owned API c
inputPorts and sources as outputPorts so port direction matches Android and the public device-owned API contract (#164).^1.0.8.FIX: export MidiPairingInfoRemovedException from package:flutter_midi_command/flutter_midi_command.dart.
MidiPairingInfoRemovedException from package:flutter_midi_command/flutter_midi_command.dart.^1.0.7.FIX: a disconnect that races an in-flight connect no longer surfaces as an unhandled async error on PlatformDispatcher.onError (#160).
PlatformDispatcher.onError (#160).MidiPairingInfoRemovedException when a peripheral has removed its pairing information (iOS CBErrorPeerRemovedPairingInformation), best-effort clearing the stale bond, instead of leaking a raw UniversalBleException.ConnectedDevice teardown now survives the IOException: EPIPE from a removed device (#158).FIX(ios): keep usable non-bonding BLE MIDI connections alive when no CoreMIDI counterpart appears, and perform bonded-device handoff as an optional at
flutter_midi_command v1.0.4
flutter_midi_command v1.0.4
flutter_midi_command v1.0.3
flutter_midi_command v1.0.3
flutter_midi_command v1.0.2
flutter_midi_command v1.0.2
fix(darwin) fix corebluetooth to coremidi handover
Resolved the Windows example build failure caused by deprecated coroutine headers in older universal_ble releases.
3.44.2 so the newer BLE dependency resolves in GitHub Actions.universal_ble releases.flutter_midi_command_ble) and optional BLE wiring via configureBleTransport.MidiDeviceType, MidiHostDevice, MidiPort, MidiPacket) across platform bridges.flutter_midi_command_web) using browser Web MIDI.connectToDevice completes on connection).MidiMessageParser and MidiMessage.parse) with support for running status, realtime interleaving, SysEx, and NRPN/RPN message flows.Refresh Devices and Scan BLE controls.Nothing published for this version
Adds a runtime check to ensure MIDI is available on the android device before starting. See #125 for further details. Make plugin work with Flutter 3.
Adds a runtime check to ensure MIDI is available on the android device before starting. See #125 for further details. Make plugin work with Flutter 3.27.0 and Android Studio Lady Bug. #127 Removed package name from AndroidManifest.xml #126 Fix reconnect issue #120
Added Recorder to Example App Merge PR #118, Thanks to Donkermand
Added Recorder to Example App Merge PR #118, Thanks to Donkermand
Added BLE support on Windows
Added BLE support on Windows
Updated Android Gradle
Updated Android Gradle
Fixed SysEx error on macOS when sending big data chunks of SysEx
Fixed SysEx error on macOS when sending big data chunks of SysEx
Fixed more threading bugs on iOS Added iOS specific API for enabling Network Session (not implemented on other platforms)
Fixed more threading bugs on iOS Added iOS specific API for enabling Network Session (not implemented on other platforms)
Updated FFI dependency for Linux to ^2.0.0
Updated FFI dependency for Linux to ^2.0.0
Fixed Linux package dependency
Fixed Linux package dependency
Fixed threading issue on iOS Added MIDI Sense and Clock messages
Fixed threading issue on iOS Added MIDI Sense and Clock messages
Merge PRs from anzbert, bringing example app and gradle settings up to date
Merge PRs from anzbert, bringing example app and gradle settings up to date
Fixed NRPN Messages Added NRPN to example app
Fixed NRPN Messages Added NRPN to example app
Updated Android permissions. Example fix
Updated Android permissions. Example fix
Fixed an issue where BLE devices would disappear from the device list on iOS, once connected.
Fixed an issue where BLE devices would disappear from the device list on iOS, once connected.
Added null_checks for latest flutter sdk (kotlin) fixed NRPN / added RPN
Added null_checks for latest flutter sdk (kotlin) fixed NRPN / added RPN
Added Pitch bend message type More controls in example app
Added Pitch bend message type More controls in example app
Fixed issue with single messages, credit to https://github.com/anzbert
Fixed issue with single messages, credit to https://github.com/anzbert
added android:exported="true" to manifest
added android:exported="true" to manifest
Fixed BLE congestion issues on iOS
Fixed BLE congestion issues on iOS
Fixed issues with timestamp and network sessions in Swift
Fixed issues with timestamp and network sessions in Swift
Fixed missing future from native
Fixed missing future from native
Fixed reflection bug on Android
Fixed reflection bug on Android
Added virtual midi device support on Android
Added virtual midi device support on Android
Fixed an issue with receiving consecutive SysEx messages on iOS Split packet into the (max) size reported by the connected device instead of fixed to
Fixed an issue with receiving consecutive SysEx messages on iOS Split packet into the (max) size reported by the connected device instead of fixed to 20 bytes, on iOS
Added support for virtual MIDI devices on iOS
Added support for virtual MIDI devices on iOS
Fixes in iOS timestamp values
Fixes in iOS timestamp values
Aligned behavior of running messages across iOS and Android. Running messages are sent to the app layer as individual messages.
Aligned behavior of running messages across iOS and Android. Running messages are sent to the app layer as individual messages.
Updated to new connectDevice function which return a future Aligned status updates from native across platforms
Updated to new connectDevice function which return a future Aligned status updates from native across platforms
Better workaround for an issue with receiving sysex messages on Android via BLE
Better workaround for an issue with receiving sysex messages on Android via BLE
Workaround for an issue with receiving long sysex messages on Android via BLE
Workaround for an issue with receiving long sysex messages on Android via BLE
Fixed an issue with BLE device IDs on Android Fixed an issue where BLE devices would appear in device list as native devices as well as bluetooth devi
Fixed an issue with BLE device IDs on Android Fixed an issue where BLE devices would appear in device list as native devices as well as bluetooth devices after being connected
Changed permissions to fine location for BLE on Android, required when targeting sdk 29+
Changed permissions to fine location for BLE on Android, required when targeting sdk 29+
Fixed nullable error in kotlin
Fixed nullable error in kotlin
Fixed BLE timestamp on iOS
Fixed BLE timestamp on iOS
Fixed device disconnect on iOS
Fixed device disconnect on iOS
Added linux support
Added linux support
Fix example app on macos
Fix example app on macos
Fix MIDI Session Support on iOS Simulator
Fix MIDI Session Support on iOS Simulator
iOS Pod fix
iOS Pod fix
Android compile fix
Android compile fix
Cleanup and docs
Cleanup and docs
Added macOS implementation. Cleaned iOS code (shared with macOS).
Added macOS implementation. Cleaned iOS code (shared with macOS).
Migrated to federated plugin using platform interface.
Migrated to federated plugin using platform interface.
Bugfix - sending cabled MIDI on iOS
Bugfix - sending cabled MIDI on iOS
Bugfix, android setup/plugin init
Bugfix, android setup/plugin init
Your coding agent can read these notes before it upgrades. Set up the MCP server →