SysEx в DAW та тулінгу
Цикл «Анатомія SysEx»: 1. Анатомія SysEx · 2. Yamaha DX7 · 3. Roland/Korg/Sequential/Circuit Tracks · 4. DAW та тулінг · 5. MIDI-CI та MIDI 2.0
Знати протокол — половина справи. Друга половина — реальний pipeline: DAW, CLI-утиліти, бібліотеки.
Bitwig Studio
У Piano Roll правий клік дозволяє вставити SysEx-подію — вона відправиться перед нотами в момент відтворення кліпу, зручно для ініціалізації пристрою перед патчем. У налаштуваннях MIDI-порту перевірте, що увімкнено «System Exclusive» — деякі порти фільтрують його за замовчуванням. Прийом SysEx у Bitwig можливий, але без вбудованого парсера — зазвичай перехоплюють паралельно зовнішнім інструментом.
SysEx Librarian і MIDI Monitor (Mac)
SysEx Librarian — безкоштовна drag-and-drop утиліта: список .syx файлів, кнопки Play/Record. Відправити DX7 bulk dump у FM8, записати dump з Circuit Tracks, вислати патч перед виступом.
MIDI Monitor від того ж автора показує всі MIDI-повідомлення в реальному часі включно з SysEx у hex — незамінний для відладки.
sendmidi / receivemidi
CLI-утиліти Geert Bevin, стандарт для MIDI-автоматизації:
brew install sendmidi receivemidi
sendmidi list
sendmidi dev 'Circuit Tracks' syx F0 00 20 29 01 64 40 00 F7
sendmidi dev 'DX7' syxf dx7_bulk.syx
receivemidi dev 'Circuit Tracks' syxf backup.syx
Python — rtmidi
import rtmidi, time
midi_out = rtmidi.MidiOut()
midi_in = rtmidi.MidiIn()
midi_out.open_port(0)
midi_in.open_port(0)
midi_in.ignore_types(sysex=False) # без цього SysEx мовчки відкидається
midi_out.send_message([0xF0, 0x00, 0x20, 0x29, 0x01, 0x64, 0x40, 0x00, 0xF7])
time.sleep(0.5)
while True:
msg = midi_in.get_message()
if msg is None:
break
data, delta = msg
if data[0] == 0xF0:
print('SysEx received:', len(data), 'bytes')
pip install python-rtmidi
Node.js — midi
const midi = require('midi')
const output = new midi.Output()
const input = new midi.Input()
output.openPort(0)
input.openPort(0)
input.ignoreTypes(false, false, false) // sysex, timing, activeSensing
input.on('message', (deltaTime, message) => {
if (message[0] === 0xF0) console.log('SysEx:', message.length, 'bytes')
})
output.sendMessage([0xF0, 0x00, 0x20, 0x29, 0x01, 0x64, 0x40, 0x00, 0xF7])
npm install midi
Найчастіша пастка
Більшість MIDI-бібліотек за замовчуванням фільтрують SysEx. Якщо повідомлення не приходить — перше, що перевіряти: ignore_types(sysex=False) у Python, ignoreTypes(false, false, false) у Node.js. Це та година дебагінгу, яку проходить кожен, хто вперше пише MIDI-код.
Further reading
sendmidi за архітектурою — це curl для MIDI: universal CLI client для протоколу, синтаксис навіть схожий (sendmidi dev name command args). Автор, Geert Bevin, паралельно розробляв Linnstrument (MPE-контролер Roger Linn Design) і сидів у комітеті MIDI 2.0 — тобто писав найпопулярнішу CLI-утиліту для SysEx 1.0, одночасно проєктуючи специфікацію, що робить частину цього застарілою. Нормальне становище для інженера.