mandrock-files / music

sysex-daw-tooling

Практичний арсенал для роботи з SysEx — Bitwig, SysEx Librarian, sendmidi/receivemidi, python-rtmidi та Node.js midi, і найчастіша пастка з фільтрацією SysEx у бібліотеках.

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

P.S. — той самий curl, інший протокол

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, одночасно проєктуючи специфікацію, що робить частину цього застарілою. Нормальне становище для інженера.