Hello everybody,
We’re excited to announce the first batch of MIDI 2.0 support is now available on the midi2 branch:
This preview branch introduces OS/Hardware level MIDI 2.0 support across all JUCE supported platforms.
If you are working on a DAW, a plugin host or a standalone app and are interested in MIDI 2.0, please do give this preview branch a spin — it’s a great opportunity to provide feedback before the work lands on develop.
We’d also appreciate anyone using the MidiInput and MidiOutput classes (for example, standalone synths) to help confirm behavior is unchanged.
Higher-resolution note/channel message format
MIDI 2.0 brings a new format for MIDI messages: “Universal MIDI Packet” or UMP. Each message contains more data than a classic MIDI 1.0 message. For example, Velocity and CC can now express a large 16-bit range (0-65,535) instead of the classic 7-bit (0-127).
This branch adds the ump::Input and ump::Output types that speak the new UMP MIDI format. These types can send MIDI 1.0 or MIDI 2.0 channel-voice messages. There’s also some other quality-of-life improvements, like being able to detect when a particular input or output gets disconnected.
Because the new types support everything that the old MidiInput and MidiOutput supports (aka MIDI 1.0 messages), we’ve re–implemented MidiInput and MidiOutput entirely in terms of the new types — a big under-the-hood change.
New UMP demo
To help you debug UMP, a new Demo is available in DemoRunner.app > Audio > UmpDemo.
Session API
The new Session API manages MIDI 2.0 Inputs and Outputs.
Session also takes advantage of Microsoft’s new OS-level API, called Windows Midi Services, currently in preview. On “Canary” builds of Windows with the SDK installed, this allows management of separate documents (i.e. multiple DAW sessions or browser tabs) independently.
Endpoint API handles device discovery/negotiation
MIDI 2.0 brings a new way of reporting detailed information about connected MIDI devices.
Endpoints::getStaticDeviceInfo reports detailed immutable information such as manufacturer, product name, transport type — all information available from the OS before a MIDI connection is established.
After establishing a connection, MIDI device discovery can report more information via Endpoints::getEndpoint. This includes advanced information about the MIDI 2.0 “function block layout,” allowing developers to discover and present user-friendly naming when dealing with connector routing.
Android support
JUCE’s MIDI 2.0 implementation for Android was more involved than other platforms.
On Windows/Linux/Apple, multiple apps can send/receive messages to the same device at the same time — it makes sense then that the OS handles the device discovery, so each app can share the discovery results.
On Android, output connections are exclusive. Only one app can send messages to a device at a time. This makes the OS-level API simpler, but means that each app must handle the discovery and negotiation details. JUCE handles this piece of the work for you in this branch.
JUCE’s MIDI 2.0 roadmap
We are working on MIDI 2.0 from the outside-in. If you imagine where a plugin sits in relation to physical hardware, there are (at least) two layers of APIs:
- The OS APIs — to get messages between the computer and hardware
- The plugin APIs — to send messages between the plugin and the DAW
This preview branch’s scope is OS-level APIs.
MIDI 2.0 work will continue. Keep in mind that MIDI 2.0 isn’t just one thing — it’s a bunch of different features that can be mixed and matched. Synth plugin developers can eventually expect to see AudioProcessor support UMP (Universal MIDI Packets), etc.
In the meantime, if OS-level MIDI 2.0 support is something that interests you, please do checkout the branch and let us know how it’s working.

