-
Notifications
You must be signed in to change notification settings - Fork 3
CI Message Reference
Developer reference for MIDI-CI messages as implemented by midi2, based on M2-101-UM v1.2 published by The MIDI Association and AMEI.
All MIDI-CI messages are carried inside Universal System Exclusive (without F0/F7 when in UMP):
[0] 0x7E Universal System Exclusive
[1] DevID 0x00-0x0F=channel, 0x7E=group, 0x7F=function block
[2] 0x0D MIDI-CI Sub-ID#1
[3] Sub-ID Message type (see tables below)
[4] Ver MIDI-CI Message Version (0x01=v1.1, 0x02=v1.2)
[5..8] Source MUID (4 bytes, 7-bit LSB first)
[9..12] Destination MUID (4 bytes, 7-bit LSB first)
[13..] Message-specific data
MUID encoding: 28-bit value split across 4 bytes, 7 bits each, LSB first.
Broadcast MUID: 0x0FFFFFFF (all bytes = 0x7F).
| Sub-ID | Message | Source | midi2_ci_msg builder | midi2_ci_dispatch callback |
|---|---|---|---|---|
| 0x70 | Discovery | Initiator | midi2_ci_build_discovery |
on_discovery |
| 0x71 | Reply to Discovery | Responder | midi2_ci_build_discovery_reply |
on_discovery_reply |
| 0x72 | Endpoint Information | Initiator | midi2_ci_build_endpoint_info |
on_endpoint_info |
| 0x73 | Reply to Endpoint Information | Responder | midi2_ci_build_endpoint_info_reply |
on_endpoint_info_reply |
| 0x7D | ACK | Either | midi2_ci_build_ack |
on_ack |
| 0x7E | Invalidate MUID | Either | midi2_ci_build_invalidate_muid |
on_invalidate_muid |
| 0x7F | NAK | Either | midi2_ci_build_nak |
on_nak |
After header: Manufacturer ID (3 bytes), Device Family (2 bytes), Model Number (2 bytes), Software Revision (4 bytes), CI Category Supported (1 byte bitmap), Max SysEx Size (4 bytes), Output Path Id (v2+, 1 byte).
| Bit | Category | Sub-ID Range |
|---|---|---|
| D2 | Profile Configuration | 0x20-0x2F |
| D3 | Property Exchange | 0x30-0x3F |
| D4 | Process Inquiry | 0x40-0x4F |
| Code | Meaning |
|---|---|
| 0x00 | NAK (generic) |
| 0x01 | MIDI-CI message not supported |
| 0x02 | MIDI-CI version not supported |
| 0x03 | Channel/Group/FB not in use |
| 0x04 | Profile not supported |
| 0x20 | Terminate PE inquiry |
| 0x21 | PE chunks out of sequence |
| 0x40 | Error, please retry |
| 0x41 | Message was malformed |
| 0x42 | Timeout |
| 0x43 | Busy, retry after wait |
| Sub-ID | Message | Source | midi2_ci_msg builder | midi2_ci_dispatch callback |
|---|---|---|---|---|
| 0x20 | Profile Inquiry | Initiator | midi2_ci_build_profile_inquiry |
on_profile_inquiry |
| 0x21 | Reply to Profile Inquiry | Responder | midi2_ci_build_profile_inquiry_reply |
on_profile_inquiry_reply |
| 0x22 | Set Profile On | Initiator | midi2_ci_build_set_profile_on |
on_set_profile_on |
| 0x23 | Set Profile Off | Initiator | midi2_ci_build_set_profile_off |
on_set_profile_off |
| 0x24 | Profile Enabled Report | Either | midi2_ci_build_profile_enabled |
on_profile_enabled |
| 0x25 | Profile Disabled Report | Either | midi2_ci_build_profile_disabled |
on_profile_disabled |
| 0x26 | Profile Added Report | Responder | midi2_ci_build_profile_added |
on_profile_added |
| 0x27 | Profile Removed Report | Responder | midi2_ci_build_profile_removed |
on_profile_removed |
| 0x28 | Profile Details Inquiry | Initiator | midi2_ci_build_profile_details |
on_profile_details |
| 0x29 | Reply to Profile Details | Responder | midi2_ci_build_profile_details_reply |
on_profile_details_reply |
| 0x2F | Profile Specific Data | Either | midi2_ci_build_profile_specific_data |
on_profile_specific_data |
| Byte | Standard (0x7E) | Manufacturer |
|---|---|---|
| 1 | 0x7E | Manufacturer SysEx ID byte 1 |
| 2 | Profile Bank | Manufacturer SysEx ID byte 2 |
| 3 | Profile Number | Manufacturer SysEx ID byte 3 |
| 4 | Profile Version | Manufacturer Specific |
| 5 | Profile Level | Manufacturer Specific |
| Sub-ID | Message | Source | midi2_ci_msg builder | midi2_ci_dispatch callback |
|---|---|---|---|---|
| 0x30 | PE Capabilities Inquiry | Initiator | midi2_ci_build_pe_capability |
on_pe_capability |
| 0x31 | Reply to PE Capabilities | Responder | midi2_ci_build_pe_capability_reply |
on_pe_capability_reply |
| 0x34 | Get Property Data | Initiator | midi2_ci_build_pe_get |
on_pe_get |
| 0x35 | Reply to Get Property | Responder | midi2_ci_build_pe_get_reply |
on_pe_get_reply |
| 0x36 | Set Property Data | Initiator | midi2_ci_build_pe_set |
on_pe_set |
| 0x37 | Reply to Set Property | Responder | midi2_ci_build_pe_set_reply |
on_pe_set_reply |
| 0x38 | Subscription | Either | midi2_ci_build_pe_subscribe |
on_pe_subscribe |
| 0x39 | Reply to Subscription | Either | midi2_ci_build_pe_subscribe_reply |
on_pe_subscribe_reply |
| 0x3F | Notify | Either | midi2_ci_build_pe_notify |
on_pe_notify |
All PE data messages share this structure after the CI header:
[13] Request ID
[14..15] Header Data Length (14-bit, LSB first)
[16..] Header Data (JSON, 7-bit encoded)
[..] Number of Chunks in Message (14-bit)
[..] Number of This Chunk (14-bit, starts from 1)
[..] Body Data Length (14-bit)
[..] Body Data (property content)
Chunking rules:
- Header Data only in first chunk (chunk 2+ has header_len = 0)
- num_chunks = 0 means "unknown number of chunks"
- Final chunk: num_chunks = this_chunk (or this_chunk = 0 if data is bad)
| Sub-ID | Message | Source | midi2_ci_msg builder | midi2_ci_dispatch callback |
|---|---|---|---|---|
| 0x40 | PI Capabilities Inquiry | Initiator | midi2_ci_build_pi_capability |
on_pi_capability |
| 0x41 | Reply to PI Capabilities | Responder | midi2_ci_build_pi_capability_reply |
on_pi_capability_reply |
| 0x42 | MIDI Message Report Inquiry | Initiator | midi2_ci_build_pi_midi_report |
on_pi_midi_report |
| 0x43 | Reply to MIDI Message Report | Responder | midi2_ci_build_pi_midi_report_reply |
on_pi_midi_report_reply |
| 0x44 | End of MIDI Message Report | Responder | midi2_ci_build_pi_midi_report_end |
on_pi_midi_report_end |
System Messages: D0=MTC Quarter Frame, D1=Song Position, D2=Song Select
Channel Controller: D0=Pitchbend, D1=CC, D2=RPN, D3=NRPN, D4=Program Change, D5=Channel Pressure
Note Data: D0=Notes, D1=Poly Pressure, D2=Per-Note PB, D3=Reg Per-Note Ctrl, D4=Asn Per-Note Ctrl
| Value | Behavior |
|---|---|
| 0x00 | Query capabilities only (Begin/End replies with bitmaps, no data) |
| 0x01 | Report only non-default values and active notes |
| 0x7F | Full report of all supported parameters |
Category 1: Protocol Negotiation (0x10-0x1F) -- deprecated in MIDI-CI v1.2. Replaced by UMP Stream Configuration messages (MT 0xF, status 0x005/0x006).