API Backwards Compatibility

Our intention is for developers to begin adopting Windows MIDI Services in place of the older WinMM, WinRT, and (deprecated) DirectMusic APIs in their applications. All new MIDI features, transports, and more will be implemented in Windows MIDI Services and the new API. A select number of features, slightly more than their current baseline, will be available to WinMM and WinRT APIs through our backwards-compatibility shims and abstractions, but this is simply to ensure existing applications continue to function on systems using Windows MIDI Services. Please note that we are not providing backwards compatibility to support DirectMusic MIDI APIs.

The existing MIDI APIs on Windows talk (almost) directly to MIDI 1.0 drivers through kernel calls. In Windows MIDI Services, the architecture is built around a central Windows Service, much like our audio system today. It also uses a much faster IO mechanism for communication with the USB driver vs what our MIDI 1.0 API uses today. This provides much more flexibility, including the potential for multi-client use, and good baseline speed with our new class driver. We are working on shims and abstractions which will allow some of the existing MIDI 1.0 APIs to talk to the service rather than directly to the driver.

Here is where we currently stand with planned backwards compatibility. Backwards compatibility for WinMM and WinRT APIs will be a post-1.0 feature, but shortly after that first release.

API What you should expect
Windows MIDI Services This project. 100% of all supported features for MIDI 1.0 and MIDI 2.0, including multi-client. API/SDK uses UMP as its internal data format even for MIDI 1.0 devices. Transports and the service handle translation.
WinMM (Win32 API most apps use today) Access to MIDI 1.0 and most MIDI 2.0 devices, at a MIDI 1.0 compatibility level only.
WinRT (MIDI API Introduced with Windows 10) Access to MIDI 1.0 and most MIDI 2.0 devices, at a MIDI 1.0 compatibility level only.
DirectMusic No compatibility planned. Not part of our testing.
Any 32 bit API No compatibility planned. No part of our testing.

Note that we are also investigating and experimenting with how to best incorporate the existing in-box Roland GS / General MIDI Synth into this architecture. It’s likely we will handle it as an additional transport, but we need to test some of the MIDI file players today as many of them make assumptions about which synth index is the GS synth, so this compatibility may come after the initial release.

Here’s the current short-term plan for when the API redirection is in-box. Each of the features listed is from the viewpoint of an application using the API.

Feature Windows MIDI Services API Win32 WinMM API WinRT MIDI 1.0 API
Basic Protocols      
MIDI 2.0 Protocol (UMP) No No
MIDI 1.0 Protocol (UMP) No No
MIDI 1.0 Protocol Bytestream No
Enhancements      
Multi-Client MIDI (more than one app can use a MIDI endpoint)
MIDI Timestamps (incoming) No No
MIDI Timestamps (outgoing, scheduled) No No
Device connect/disconnect notifications No (as today)
MIDI 2.0 Features      
High resolution UMP messages No No
Send/Receive with MIDI 1.0 USB devices
Send/Receive with MIDI 2.0 USB devices ✅* ✅*
Work with devices using MIDI CI
Access Function Blocks and Endpoint Metadata No No
Built-in MIDI Transports      
Send/Receive with Virtual MIDI Device
Create Virtual MIDI Device No No
Send/Receive with Loopback MIDI Device
Create Loopback MIDI Device No No
Send/Receive with Bluetooth MIDI 1.0 After Initial Release
Send/Receive with Network MIDI 2.0 After Initial Release
Application Types      
64-bit Win32 (Desktop) App
64-bit UWP App No
64-bit Windows App SDK App No
32-bit desktop app No

Arm64 and x86-64 (“x64” or “amd64”) are both equally supported by the 64 bit APIs. There is no support for 32-bit operating systems. We are evaluating 32-bit applications on 64-bit Windows.

✅ Feature is supported ❓We are investigating

  • Messages are translated between MIDI 1.0 protocol and MIDI 2.0 protocol