Roland, Korg, Sequential, Novation Circuit Tracks
Цикл «Анатомія SysEx»: 1. Анатомія SysEx · 2. Yamaha DX7 · 3. Roland/Korg/Sequential/Circuit Tracks · 4. DAW та тулінг · 5. MIDI-CI та MIDI 2.0
SysEx не має єдиного стандарту на рівні payload — кожен виробник вирішував задачу передачі даних по-своєму. Порівняти Roland, Korg, Sequential Circuits і Novation Circuit Tracks — як порівняти архітектурні стилі: мета одна, естетика різна.
Roland — адресна модель
Замість «зміни параметра №47» Roland пише «дані за адресою 0x12 0x00». Data Set 1 (DT1) записує:
F0 41 dev model_id 12 addr_h addr_m addr_l data... cs F7
Data Request 1 (RQ1) запитує:
F0 41 dev model_id 11 addr_h addr_m addr_l size_h size_m size_l cs F7
Checksum охоплює і адресу, і дані:
def roland_checksum(address_bytes, data_bytes):
total = sum(address_bytes) + sum(data_bytes)
return (128 - (total % 128)) % 128
Адресна модель дозволяє звертатись до будь-якого параметра без перекомпіляції специфікації — MT-32, D-50, JV-1080 діляться однією оболонкою, різняться лише model_id і карта адрес.
Korg — простіше, менш уніфіковано
Кожен продукт Korg мав власний формат, без спільної адресної моделі між серіями:
Korg M1 (1988): F0 42 3n 19 [command] [data...] F7
Korg Minilogue/Prologue: F0 42 30 00 01 2C [command] [data...] F7
Наслідок ставки на простоту реалізації: бібліотека для M1 не перевикористовується для Prologue.
Sequential Circuits — першопрохідці
Sequential Circuits (Dave Smith) реалізували SysEx у Prophet-5 Rev 3.3 (1982) — ще до офіційної специфікації MIDI 1.0. Формат мінімалістичний:
F0 01 [voice_number] [data bytes...] F7
Ні checksum, ні адреси — просто номер голосу і дані. Логічно для 1982-го: MIDI щойно народився, надійність лінії вважали достатньою. Пізніше, як Dave Smith Instruments і знову Sequential, компанія повернулась до структурованіших дампів у Prophet-6 і OB-6, але загальний лаконізм залишився.
Novation Circuit Tracks — сучасний підхід
Грувбокс 2020 року з двома синт-треками й чотирма MIDI-треками. Manufacturer ID — 3-байтовий (F0 00 20 29), Product ID — 0x01 0x64.
Запит синт-патча:
F0 00 20 29 01 64 40 00 F7
Дані патча у відповідь, у nibblized форматі — кожен байт розбитий на два напівбайти:
def encode_nibblized(raw_bytes):
result = []
for byte in raw_bytes:
result.append((byte >> 4) & 0x0F)
result.append(byte & 0x0F)
return result
def decode_nibblized(nibbles):
result = []
for i in range(0, len(nibbles), 2):
result.append((nibbles[i] << 4) | nibbles[i+1])
return result
Один патч — 512 сирих байтів, 1024 у nibblized формі. Помилка в порядку high/low nibble дає корумпований патч без жодного error message — синт приймає дані мовчки й звучить неправильно. Верифікація round-trip (encode → decode → порівняти з оригіналом) тут не опційна.
Further reading
- Novation Circuit Tracks MIDI Implementation — customer.novationmusic.com, розділ Downloads
Dave Smith помер у 2022-му, у 72 роки; на його похороні колеги грали на Prophet і OB-6. Він встиг публічно схвалити MIDI 2.0, додавши, що оригінальний MIDI 1.0 «витримав випробування часом краще, ніж хтось очікував у 1983-му». Сам стандарт народився за два тижні на зустрічі Сміта з Ікутаро Кекехаші з Roland у 1981-му — за легендою, записаний на серветці.