# MIDI 2.0 Preview Branch

**URL:** <https://forum.juce.com/t/midi-2-0-preview-branch/66453>\
**Category:** News and Announcements\
**Created:** [June 25, 2025, 11:26am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453 "2025-06-25T11:26:35Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![t0m](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/t0m/32/16413_2.png) [@t0m](https://forum.juce.com/u/t0m)\
**Post date:** [June 25, 2025, 11:26am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/1 "2025-06-25T11:26:35Z")

</div>

Hello everybody,

We’re excited to announce the first batch of MIDI 2.0 support is now available on the `midi2` branch:

> **[GitHub - juce-framework/JUCE at midi2](https://github.com/juce-framework/JUCE/tree/midi2)**
>
> midi2

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`.

 ![DemoRunner - 2025-06-24.54@2x](https://us1.discourse-cdn.com/flex026/uploads/juce/original/3X/1/b/1bd9ecea818ae4cf57db2f9153cbd7d396ff070f.jpeg)

## 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](https://devblogs.microsoft.com/windows-music-dev/announcing-windows-midi-services-customer-preview-1/). 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.

---

<div class="post-metadata">

**Author:** ![t0m](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/t0m/32/16413_2.png) [@t0m](https://forum.juce.com/u/t0m)\
**Post date:** [June 25, 2025, 11:26am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/2 "2025-06-25T11:26:57Z")

</div>



---

<div class="post-metadata">

**Author:** ![bgporter](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/bgporter/32/12710_2.png) [@bgporter](https://forum.juce.com/u/bgporter)\
**Post date:** [June 25, 2025, 12:39pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/3 "2025-06-25T12:39:53Z")

</div>

This is **outstanding** news! Looking forward to digging into it.

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [June 25, 2025, 3:07pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/4 "2025-06-25T15:07:14Z")

</div>

Forgot to mention: the new branch also includes support for creating virtual MIDI ports on Android, which is a feature that’s been missing from JUCE up until now. This makes it easier to route MIDI between apps, e.g. a synth app might want to expose a virtual MIDI input, and controllers/sequencers may decide to export a virtual MIDI output. The virtual inputs and outputs can be set up to behave like a full UMP endpoint, exposing function blocks and other metadata.

---

<div class="post-metadata">

**Author:** ![ibisum](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/ibisum/32/21288_2.png) [@ibisum](https://forum.juce.com/u/ibisum)\
**Post date:** [June 25, 2025, 3:27pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/5 "2025-06-25T15:27:17Z")

</div>

Excellent news, well done JUCE team! I will be putting this into some lab testing in the next few days .. exciting feature!

---

<div class="post-metadata">

**Author:** ![drmr-2](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/drmr-2/32/19860_2.png) [@drmr-2](https://forum.juce.com/u/drmr-2)\
**Post date:** [June 26, 2025, 6:10am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/6 "2025-06-26T06:10:42Z")

</div>

This branch incorrectly merged features and now completely breaks JACK:

> **[JUCE/modules/juce\_audio\_devices/native at midi2 · juce-framework/JUCE](https://github.com/juce-framework/JUCE/tree/midi2/modules/juce_audio_devices/native)**
>
> JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins. - juce-framework/JUCE

> <https://github.com/juce-framework/JUCE/blob/midi2/modules/juce_audio_devices/juce_audio_devices.cpp#L262>

---

<div class="post-metadata">

**Author:** ![t0m](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/t0m/32/16413_2.png) [@t0m](https://forum.juce.com/u/t0m)\
**Post date:** [June 26, 2025, 8:09am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/7 "2025-06-26T08:09:37Z")

</div>

Apologies - this one slipped through as we rebased the MIDI work onto the `develop` branch.

It is fixed here:

> <https://github.com/juce-framework/JUCE/commit/b3c471a0584dbaece1a8b476960ee1bedb186a90>

Thank you for reporting.

---

<div class="post-metadata">

**Author:** ![drmr-2](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/drmr-2/32/19860_2.png) [@drmr-2](https://forum.juce.com/u/drmr-2)\
**Post date:** [June 26, 2025, 11:43am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/8 "2025-06-26T11:43:33Z")

</div>

Ah I see. That was already fixed before I reported it, but not yet pushed 😉

Hope this rebasing didn’t break anything else :#

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [June 26, 2025, 11:45am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/9 "2025-06-26T11:45:58Z")

</div>

> [@drmr-2](#):
>
> Hope this rebasing didn’t break anything else :#

Me too! 🤞

---

<div class="post-metadata">

**Author:** ![leehu](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/leehu/32/3280_2.png) [@leehu](https://forum.juce.com/u/leehu)\
**Post date:** [June 27, 2025, 10:38am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/10 "2025-06-27T10:38:47Z")

</div>

Intruiging - something to maybe make me move to JUCE 8 finally - quick Q, are virtual ports and multi-client supported on Windows? thx

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [June 27, 2025, 11:48am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/11 "2025-06-27T11:48:33Z")

</div>

> [@leehu](#):
>
> are virtual ports and multi-client supported on Windows

This depends on the MIDI backend you use. Current versions of Windows don’t support these features, but the upcoming Windows MIDI Services (WMS) does. Currently, in order to use WMS you’ll need to install a “canary” preview build of Windows 11, and install the WMS SDK from github. Eventually, WMS will be supported on upcoming releases of Windows 10 and 11.

---

<div class="post-metadata">

**Author:** ![leehu](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/leehu/32/3280_2.png) [@leehu](https://forum.juce.com/u/leehu)\
**Post date:** [June 27, 2025, 12:56pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/12 "2025-06-27T12:56:51Z")

</div>

thx for the update, will give that a go. finally having milti-client windows MIDI is going to be amazing. Is this something that can be detected at runtime through enquiry?

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [June 27, 2025, 3:27pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/13 "2025-06-27T15:27:43Z")

</div>

You can use [`ump::Endpoints::getBackend()`](https://github.com/juce-framework/JUCE/blob/midi2/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h#L217) to determine which MIDI implementation is currently in use. If you’re on Windows, and the backend isn’t WMS, then you can operate in a reduced functionality mode using the old MIDI APIs, and/or direct users to go and install the appropriate runtime. Another option might be to update your product’s installer to also install the WMS runtime.

---

<div class="post-metadata">

**Author:** ![leehu](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/leehu/32/3280_2.png) [@leehu](https://forum.juce.com/u/leehu)\
**Post date:** [June 28, 2025, 7:46am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/14 "2025-06-28T07:46:37Z")

</div>

thanks

---

<div class="post-metadata">

**Author:** ![Psychlist1972](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/psychlist1972/32/20891_2.png) [@Psychlist1972](https://forum.juce.com/u/Psychlist1972)\
**Post date:** [June 30, 2025, 12:00am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/15 "2025-06-30T00:00:45Z")

</div>

When making decisions based on detection, it’s important to note that Windows MIDI Services comes in two parts:

- The service and transports, distributed in-box (currently only in Insider Canary builds).
- The Windows MIDI Services SDK Runtime and Tools (includes the SDK runtime, the command-line MIDI tools, MIDI PowerShell cmdlets, and the MIDI Settings app.). This is delivered out-of-band, and will be updated more frequently than Windows.

If you use WinMM APIs, and Windows MIDI Services is in-box, you get multi-client for free. You’ll also have access to MIDI 2.0 hardware, but downscaled to MIDI 1.0 and translated to the MIDI 1.0 byte format, so with reduced fidelity compared to MIDI 2.0 UMP.

If you want to use MIDI 2.0 features, create loopback endpoints, use the new app-to-app MIDI SDK, etc. You’ll need the new SDK. I’d need to look at the JUCE code to be sure, but I assume the initialization tries to initialize the SDK and falls back if that fails.

If you want finer-grained control:

This code shows how to detect if Windows MIDI Services in-box components are installed, without using anything in the Windows MIDI Services SDK. It’s just COM.

> <https://github.com/microsoft/MIDI/blob/main/samples/cpp/detectmidi/main.cpp>

This code shows the full initialization routine (start up the service, initialize the SDK)

> <https://github.com/microsoft/MIDI/blob/main/samples/cpp-winrt/full-init/main_full_init.cpp>

This docs page explains how to distribute the runtime

> **[How to distribute the Windows MIDI Services runtime and tools](https://microsoft.github.io/MIDI/kb/distribute-runtime/)**
>
> How to distribute the Windows MIDI Services runtime and tools with your app

This docs page explains what happens during initialization, and why we did it this way

> **[What is SDK initialization doing?](https://microsoft.github.io/MIDI/kb/what-is-sdk-initialization-doing/)**
>
> An explanation of what the SDK initialization calls are doing under the covers

I’ll have a new “Customer Preview 3” release of the SDK out soon. Just trying to finish up some of the version checking and network MIDI 2.0 client code. It required some small breaks to the versioning to work correctly across both in-box and out-of-box components, and changes to UUIDs requiring a recompile, but that information will all be included in the release notes. It’s release-candidate quality at this point.

Main docs site:

> **[About Windows MIDI Services](https://microsoft.github.io/MIDI/)**
>
> Microsoft Windows MIDI Services API, SDK, and tools

Discord server, including the last couple developer-focused previews

> **[Join the Windows MIDI / Audio Discord Server!](https://discord.com/invite/NNJgpDuYNe)**
>
> Check out the Windows MIDI / Audio community on Discord - hang out with 412 other members and enjoy free voice and text chat.

PS, @reuk @t0m and team, fantastic work 🙂

Pete  
Microsoft

---

<div class="post-metadata">

**Author:** ![leehu](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/leehu/32/3280_2.png) [@leehu](https://forum.juce.com/u/leehu)\
**Post date:** [June 30, 2025, 8:27am UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/16 "2025-06-30T08:27:42Z")

</div>

thx for all the info!

---

<div class="post-metadata">

**Author:** ![Psychlist1972](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/psychlist1972/32/20891_2.png) [@Psychlist1972](https://forum.juce.com/u/Psychlist1972)\
**Post date:** [July 28, 2025, 7:55pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/17 "2025-07-28T19:55:03Z")

</div>

New release of Windows MIDI Services today, with what we expect to be the final set of breaking changes.

> **[Release Preview 11 · microsoft/MIDI](https://github.com/microsoft/MIDI/releases/tag/preview-11)**
>
> Preview 11 Quick start
> Recommended Windows Build: Windows Insider Canary 27902 or later.
> IMPORTANT NOTE
> The service and SDK have a breaking change to support optionally waiting for messages to full...

Until the service makes its way to Windows Insider Canary (takes a few weeks to a month), the install will have several steps, as mentioned in the release notes. Once that service is out in the Windows builds, the install gets much simpler.

We have one set of bugs we’re currently tackling, and that is all around surprise removal of devices like USB (or other kernel streaming drivers). That is being actively worked on. Main bug for tracking is here. More than a quarter of all the remaining issues are directly related to this.

> <https://github.com/microsoft/MIDI/issues/706>
>
> Bug to track all related surprise removal / connection cleanup issues.

These releases do still require Windows Insider Canary. We’ll begin rolling it out to retail Windows 11, assuming the surprise removal bugs are fixed soon, this fall. We’ve already done all the infrastructure work requires to support that roll-out.

Pete

---

<div class="post-metadata">

**Author:** ![DaAwesomeP](https://avatars.discourse-cdn.com/v4/letter/d/cab0a1/32.png) [@DaAwesomeP](https://forum.juce.com/u/DaAwesomeP)\
**Post date:** [September 7, 2025, 10:00pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/18 "2025-09-07T22:00:25Z")

</div>

Just to confirm, there is no support yet for `MidiMessage`, right? Will that come when the plugin APIs are implemented?

Also to confirm, the MIDI 2.0 Flex data message has not been implemented yet, right?

I built the docs in the `midi2` branch, though it doesn’t look like any of the new classes are being recorded by Doxygen. Struggling to find the `ump::Input` class in the sources.

Thanks!

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [September 17, 2025, 12:36pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/20 "2025-09-17T12:36:51Z")

</div>

Sorry, I missed your comment previously!

> [@DaAwesomeP](#):
>
> Just to confirm, there is no support yet for `MidiMessage`, right? Will that come when the plugin APIs are implemented?

`MidiMessage` isn’t going to see any changes, it’s always going to represent a MIDI 1.0 bytestream message. If you want to send/receive bytestream messages through `ump::Input` or `ump::Output`, you’re responsible for converting between UMP and bytestream representations on either side. JUCE includes some mechanisms to assist: there’s `GenericUMPConverter` for conversion from bytestream to UMP-formatted MIDI 1.0 or MIDI 2.0; to go in the other direction, you can use `ToBytestreamConverter`. The new implementations of `MidiInput` and `MidiOutput` do this conversion internally, so you can look at those implementations for pointers if necessary.

We do intend to add some improved setters and getters for properties of MIDI 2.0 messages in UMP format, but those aren’t present in the initial release.

> [@DaAwesomeP](#):
>
> Also to confirm, the MIDI 2.0 Flex data message has not been implemented yet, right?

We don’t have a ‘flex data message’ type. But, there’s nothing stopping you from reading/writing flex data messages to a `ump::Input` or `ump::Output`. You may need to write your own helpers to pack/unpack plain data into UMP flex-data format. We already supply similar facilities for packing/unpacking 7-bit sysex data, so those might serve as a starting point.

> [@DaAwesomeP](#):
>
> I built the docs in the `midi2` branch, though it doesn’t look like any of the new classes are being recorded by Doxygen. Struggling to find the `ump::Input` class in the sources.

That’s odd, thanks for letting us know!

---

<div class="post-metadata">

**Author:** ![reuk](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/reuk/32/21494_2.png) [@reuk](https://forum.juce.com/u/reuk)\
**Post date:** [September 17, 2025, 12:42pm UTC](https://forum.juce.com/t/midi-2-0-preview-branch/66453/21 "2025-09-17T12:42:38Z")

</div>

Update: the `midi2` preview branch has now been rebased and merged to `develop`. The `midi2` tag will stick around for a bit on Github, but we encourage you to switch to referencing `develop` instead at your earliest convenience.

[Next page](https://forum.juce.com/t/midi-2-0-preview-branch/66453.md?page=2)
