mandrock-files / music

sysex-midi-ci

MIDI-CI та MIDI 2.0 — як SysEx еволюціонує через Property Exchange (REST over MIDI), SysEx 8 без 7-бітного обмеження, і чому старий протокол 1983 року нікуди не дінеться.

MIDI-CI та MIDI 2.0 — SysEx еволюціонує

Цикл «Анатомія SysEx»: 1. Анатомія SysEx · 2. Yamaha DX7 · 3. Roland/Korg/Sequential/Circuit Tracks · 4. DAW та тулінг · 5. MIDI-CI та MIDI 2.0

SysEx існує з 1983 року й весь цей час лишався тим самим: бінарний потік, документація у PDF, нуль стандартизації поверх базового конверту. MIDI 2.0 не скасовує SysEx — він еволюціонує його через MIDI-CI (Capability Inquiry).

Що таке MIDI-CI

Протокол узгодження можливостей між пристроями — SysEx поверх SysEx: повідомлення MIDI-CI самі є пакетами Universal System Exclusive, але несуть структуровану JSON-подібну логіку. Чотири під-протоколи:

F0 7E <device_id> 0D <category> <version> <source_muid> <dest_muid> <payload> F7

source_muid/dest_muid — 28-бітні унікальні ID пристроїв, 7F 7F 7F 7F = broadcast.

Property Exchange — REST поверх MIDI

Запит списку пресетів (GetProperty Request), тіло — JSON, закодований 7-бітними байтами:

{"resource": "ProgramList", "command": "get"}

Відповідь несе JSON у SysEx:

{"programs": [{"program": 0, "name": "E.PIANO 1"}, {"program": 1, "name": "BRASS 1"}]}

Різниця від старого SysEx принципова: більше не треба читати PDF-мануал, щоб дізнатись зміщення параметра — пристрій відповідає структурованими даними напряму.

import rtmidi

BROADCAST_MUID = [0x7F, 0x7F, 0x7F, 0x7F]
MY_MUID = [0x01, 0x00, 0x00, 0x00]

midi_out = rtmidi.MidiOut()
midi_out.open_port(0)
midi_out.send_message([
    0xF0, 0x7E, 0x7F, 0x0D, 0x70, 0x01,
    *MY_MUID, *BROADCAST_MUID,
    0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xF7
])

SysEx 8 — кінець nibblizing

Новий тип Universal MIDI Packet у MIDI 2.0: дані повністю 8-бітні, без 7-бітного обмеження старого SysEx.

Параметр SysEx 1.0 SysEx 8
Ширина даних 7 біт 8 біт
Nibblizing потрібен не потрібен
Розмір DX7 bulk dump 4096 байтів ~2048 байтів

SysEx 8 живе всередині UMP (Universal MIDI Packet) — 32- або 64-бітних пакетів фіксованого розміру замість байтового потоку MIDI 1.0. Сумісність збережена: MIDI 2.0-пристрої обов'язково підтримують fallback до MIDI 1.0.

Чому SysEx не зникне

Мільярди SysEx-сумісних пристроїв нікуди не діваються; MIDI-CI сам передається як SysEx, тож нові пристрої говорять зі старими. Bitwig 5.x має експериментальну підтримку MIDI 2.0 — UMP лише через сумісні аудіоінтерфейси, MIDI-CI без підтримки в GUI, SysEx у Piano Roll лишається на версії 1.0. На практиці: старий SysEx писатимуть ще щонайменше 5–10 років.

MIDI-CI і Property Exchange — та сама історія, що SOAP → REST у вебі: бінарна строга схема поступається місцем ресурсам і get/set-семантиці, документація з WSDL перетворюється на ResourceList endpoint.

Further reading

P.S. — два тижні проти п'яти років

MIDI 1.0 розробили за два тижні на зустрічі Дейва Сміта й Ікутаро Кекехаші в 1981-му, стандарт вийшов у 1983-му. MIDI 2.0 узгоджували з 2015 по 2020 — п'ять років між Yamaha, Roland, Korg, Native Instruments, Apple, Google і сотнею інших. Другий стандарт зайняв у 250 разів більше часу. Деякі речі в індустрії дорожчають разом із досвідом.