Expression & MIDI 2.0
MIDI-CI: Capability Inquiry
MIDI-CI lets two devices find each other, see what the other supports, and agree on how to work together, all without user setup. It is made of Universal System Exclusive messages, so it works over MIDI 1.0 byte streams as well as over UMP.
MIDI-CI covers four areas:
- Management: discovery, MUIDs, ACK/NAK.
- Profile Configuration: switch on standard behaviors such as "Drawbar Organ", "MPE" or "Orchestral Articulation".
- Property Exchange: get and set structured data (patch lists, device info, parameter state) as JSON.
- Process Inquiry: ask a device for its current MIDI state, such as controller values (added in v1.2).
Scope of this page
This is a structural summary of MIDI-CI 1.2 meant for orientation. Field-level layouts, timeouts and the full Property Exchange resource definitions are in the official specifications (M2-101-UM and the M2-103/M2-105 Property Exchange documents), which are free to download after registering at midi.org.
Message layout
Every MIDI-CI message starts with the same header:
| Byte(s) | Value | Meaning |
|---|---|---|
| 1 | F0 | Start of SysEx |
| 2 | 7E | Universal SysEx, non-real time |
| 3 | dd | Device ID / destination: 00–0F = a MIDI channel, 7E = the whole group, 7F = the whole Function Block (earlier versions: the whole port) |
| 4 | 0D | Sub-ID#1: MIDI-CI |
| 5 | ss | Sub-ID#2: the message (tables below) |
| 6 | vv | MIDI-CI message version/format (01 = v1.1, 02 = v1.2) |
| 7–10 | MUID | Source MUID, 28 bits as four 7-bit bytes, LSB first |
| 11–14 | MUID | Destination MUID (7F 7F 7F 7F = broadcast) |
| 15… | … | Message-specific data |
| last | F7 | End of SysEx |
MUIDs
A MUID (MIDI Unique Identifier) is a random 28-bit number that a device makes for itself when
it starts MIDI-CI. It identifies the device for the rest of the session. 0x0FFFFFFF is reserved for
broadcast and 0x0FFFFF00–0x0FFFFFFE are reserved. If a device sees another device using
its MUID, it picks a new one and sends Invalidate MUID.
Management and discovery
| Sub-ID#2 | Message | Notes |
|---|---|---|
0x70 | Discovery | Inquiry broadcast to find MIDI-CI devices; carries identity and capabilities |
0x71 | Reply to Discovery | Responder identity, capabilities and its MUID |
0x72 | Inquiry: Endpoint Information | Ask for endpoint data such as a product instance ID (v1.2) |
0x73 | Reply to Endpoint Information | (v1.2) |
0x7D | ACK | Generic acknowledgement with status code and optional text (v1.2) |
0x7E | Invalidate MUID | Tell others to forget a MUID (e.g. on reset or collision) |
0x7F | NAK | Negative acknowledgement; v1.2 adds status codes and an optional message |
Discovery is the first step. An Initiator broadcasts a Discovery Inquiry, and each Responder answers with its own MUID, its identity (SysEx manufacturer ID, family, model and software revision, the same fields as a Device Inquiry reply), a capability category bitmap saying which MIDI-CI areas it supports, and the largest SysEx message it can receive. After that, the two devices address each other directly by MUID.
Protocol Negotiation is deprecated
MIDI-CI 1.1 had messages for switching between the MIDI 1.0 and MIDI 2.0 Protocols. MIDI-CI 1.2 deprecated them. Protocol selection now uses UMP Stream Configuration messages.
Profile Configuration
A Profile is a published agreement about how a device of some kind responds to MIDI: which
controllers do what, how notes map, and similar rules. Turning a profile on is a promise to behave that way.
Profiles are named by a 5-byte Profile ID. Standard profiles begin with 7E;
manufacturer-specific ones begin with the manufacturer's SysEx ID. A profile can apply to a single channel,
several channels, a whole group, or a whole Function Block.
| Sub-ID#2 | Message |
|---|---|
0x20 | Profile Inquiry |
0x21 | Reply to Profile Inquiry |
0x22 | Set Profile On |
0x23 | Set Profile Off |
0x24 | Profile Enabled Report |
0x25 | Profile Disabled Report |
0x26 | Profile Added Report |
0x27 | Profile Removed Report |
0x28 | Profile Details Inquiry |
0x29 | Reply to Profile Details Inquiry |
0x2F | Profile Specific Data |
Adopted and in-progress profiles include the MPE Profile, Drawbar Organ, Rotary Speaker, Orchestral Articulation, Default Control Change Mapping, and others. See midi.org for the current list.
Property Exchange
Property Exchange (PE) moves structured data between devices: what patches exist, what the device is called, what its parameters are. Each request has a JSON header naming a resource, and an optional body that is usually JSON too. Large payloads are split into numbered chunks to fit the receiver's maximum SysEx size.
| Sub-ID#2 | Message |
|---|---|
0x30 | Inquiry: Property Exchange Capabilities |
0x31 | Reply to Property Exchange Capabilities |
0x34 | Inquiry: Get Property Data |
0x35 | Reply to Get Property Data |
0x36 | Inquiry: Set Property Data |
0x37 | Reply to Set Property Data |
0x38 | Subscription |
0x39 | Reply to Subscription |
0x3F | Notify |
A Get for the device info resource looks roughly like this (shown with the JSON header as text):
F0 7E 7F 0D 34 02 <src MUID> <dst MUID>
01 request ID
19 00 header length (25, 14-bit LSB first)
{"resource":"DeviceInfo"}
01 00 number of chunks = 1
01 00 this chunk = 1
00 00 property data length = 0
F7
Commonly used resources:
| Resource | Contains |
|---|---|
ResourceList | Which resources this device supports. Usually the first thing requested. |
DeviceInfo | Manufacturer, family, model and version strings, serial number |
ChannelList | Which channels are in use and what each one is for |
ProgramList | Patch names with their bank and program numbers |
State | Opaque snapshot of a device's state, for save and recall |
| Controller lists | Names, ranges and defaults of controllers, so a host can label them automatically |
With Subscription, an Initiator can ask to hear about changes to a resource, and the Responder sends updates as they happen. A DAW can use this to keep a patch name on screen in sync with the hardware.
Process Inquiry
Added in MIDI-CI 1.2, Process Inquiry asks a device to report its current MIDI state, such as the present value of each controller or pitch bend on chosen channels. The device answers with ordinary MIDI messages, framed between a reply and an end marker.
| Sub-ID#2 | Message |
|---|---|
0x40 | Inquiry: Process Inquiry Capabilities |
0x41 | Reply to Process Inquiry Capabilities |
0x42 | Inquiry: MIDI Message Report |
0x43 | Reply to MIDI Message Report |
0x44 | End of MIDI Message Report |
In practice
- MIDI-CI needs a bidirectional connection: a cable or port pair in each direction, USB, or a UMP Endpoint.
- Over UMP, MIDI-CI messages are carried as SysEx7 (MT 0x3) in the group that the Function Block uses.
- Devices must ignore MIDI-CI messages they don't understand. A Responder that doesn't support something answers with NAK.
- The MIDI 2.0 Workbench is the reference tool for testing MIDI-CI. The libraries listed under MIDI 2.0 include CI implementations.
Spotted an error? Edit this page on GitHub.