mandrock-files / music

sysex-dx7

Yamaha DX7 як еталон SysEx-реалізації — формат bulk-дампу на 32 голоси, структура 155-байтного патча, checksum і .syx-файли без обгортки.

Yamaha DX7 — еталон реалізації

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

Yamaha DX7 (1983) коштував $2000 замість $10 000+ за аналогових конкурентів і розійшовся тиражем понад 200 000 одиниць. Кожен передавав патчі через SysEx, і саме DX7-реалізація стала де-факто зразком — чіткою, передбачуваною, добре задокументованою. Її вивчали всі, хто писав MIDI-софт у 80-х.

Типи повідомлень

Parameter Change — зміна одного параметра в реальному часі:

F0 43 0n 00 pp vv F7
         n = MIDI channel (0-15)
         pp = parameter number (0-155)
         vv = value

Bulk Voice Dump Request — запит дампу 32 голосів:

F0 43 2n 00 F7

Bulk Voice Data — самі 32 голоси, 4096 байт:

F0 43 0n 09 20 00 [4096 bytes] cs F7
                   32 voices x 128 bytes each

Single Voice Dump — один голос, 155 байт:

F0 43 0n 00 01 1B [155 bytes] cs F7

Структура голосу (155 байт)

Шість FM-операторів по 17 параметрів (102 байти) плюс 53 байти глобальних параметрів:

Зміщення Байтів Параметр
0–101 102 6 операторів (17 байт кожен)
102–109 8 Pitch EG (4 Rate + 4 Level)
110 1 Algorithm (0–31)
111 1 Feedback + Osc Sync
112–116 5 LFO
118–127 10 Voice name (ASCII)

Один оператор: EG Rate ×4, EG Level ×4, Keyboard Level Scaling ×4, Rate Scaling, AMS+Velocity, Output Level, Freq Coarse+Fine.

Checksum і .syx

def yamaha_checksum(data):
    return (-sum(data)) & 0x7F

def validate_dx7_dump(sysex):
    data = sysex[6:-2]
    cs = sysex[-2]
    return yamaha_checksum(data) == cs

.syx — це голі байти SysEx-повідомлення без заголовків: перший байт F0, останній F7.

with open('dx7_patch.syx', 'rb') as f:
    data = list(f.read())

assert data[0] == 0xF0 and data[1] == 0x43 and data[3] == 0x09 and data[-1] == 0xF7

name_bytes = data[6+118 : 6+128]
voice_name = bytes(name_bytes).decode('ascii', errors='replace').strip()

Практичне попередження

DX7 замінює голос при отриманні bulk-дампу без підтвердження й без undo. 32 нові голоси — і старі зникли назавжди. Dump у файл перед будь-якою відправкою, завжди.

Further reading

P.S. — один патч, ціла епоха

Preset 11 заводської бібліотеки DX7 — «E.PIANO 1» — це електропіано з Take On Me, Jump і половини хітів Whitney Houston. FM-синтез придумав Джон Чоунінг у Стенфорді в кінці 60-х; університет продав ліцензію Yamaha за $1.2 млн авансу плюс роялті і заробив на ній близько $20 млн за 22 роки дії патенту. Чоунінгу зараз 87, і він досі композитор.