MIDI, OSC и MQTT
Обычно Strudel используется для создания patterns звука, используя свой собственный синтезатор на основе ‘web audio’, называемый SuperDough.
Также возможно создавать patterns других вещей с помощью Strudel, таких как программные и аппаратные синтезаторы с MIDI, другое программное обеспечение с использованием Open Sound Control/OSC (включая синтезатор SuperDirt, обычно используемый с родственным Strudel проектом TidalCycles), или протокол MQTT для ‘интернета вещей’.
MIDI
Strudel поддерживает MIDI без какого-либо дополнительного программного обеспечения (благодаря webmidi), просто добавляя методы к вашему pattern:
midiin(inputName?)
MIDI input: Открывает порт ввода MIDI для приёма MIDI control change сообщений.
- input (string|number): Имя MIDI устройства или индекс, по умолчанию 0
let cc = await midin('IAC Driver Bus 1')
note("c a f e").lpf(cc(0).range(0, 1000)).lpq(cc(1).range(0, 10)).sound("sawtooth")midi(outputName?,options?)
Либо подключите midi устройство, либо используйте IAC Driver (Mac) или Midi Through Port (Linux) для внутренних midi сообщений. Если outputName не указан, используется первый найденный midi выход.
$: chord("<C^7 A7 Dm7 G7>").voicing().midi('IAC Driver')
В консоли вы увидите лог доступных MIDI устройств, как только запустите код, например
`Midi connected! Using "Midi Through Port-0".`
Функция .midi() принимает объект опций со следующими свойствами:
$: note("d e c a f").midi('IAC Driver', { isController: true, midimap: 'default'})
Доступные опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
| isController | boolean | false | Когда true, отключает отправку note сообщений. Полезно для MIDI контроллеров |
| latencyMs | number | 34 | Задержка в миллисекундах для выравнивания MIDI с аудио движком |
| noteOffsetMs | number | 10 | Смещение в миллисекундах для note-off сообщений для предотвращения глитчей |
| midichannel | number | 1 | MIDI канал по умолчанию (1-16) |
| velocity | number | 0.9 | Velocity ноты по умолчанию (0-1) |
| gain | number | 1 | Множитель gain по умолчанию для velocity (0-1) |
| midimap | string | ’default’ | Имя MIDI mapping для использования control changes |
| midiport | string/number | - | Имя MIDI устройства или индекс |
midiport(outputName)
Выбирает MIDI устройство вывода для использования, pattern может использоваться для переключения между устройствами.
$: midiport('IAC Driver');
$: note('c a f e').midiport('<0 1 2 3>').midi();
MIDI порт: Устанавливает MIDI порт для события.
- port (number|Pattern): MIDI порт
note("c a f e").midiport("<0 1 2 3>").midi()midichan(number)
Выбирает MIDI канал для использования. Если не используется, .midi будет использовать канал 1 по умолчанию.
midicmd(command)
midicmd отправляет MIDI system real-time сообщения для управления таймингом и транспортом на MIDI устройствах.
Поддерживает следующие команды:
clock/midiClock- Отправляет MIDI тактовые сообщенияstart- Отправляет MIDI start сообщениеstop- Отправляет MIDI stop сообщениеcontinue- Отправляет MIDI continue сообщение
// Вы можете управлять тактами с помощью pattern и убедиться, что он запускается синхронно при запуске repl. // Примечание: Это может вести себя неожиданно, если MIDI изначально не настроен.
$:stack(
midicmd("clock*48,<start stop>/2").midi('IAC Driver')
)control, ccn && ccv
controlотправляет MIDI control change сообщения на ваше MIDI устройство.ccnустанавливает cc номер. Зависит от midi mapping вашего синтезатораccvустанавливает cc значение. нормализовано от 0 до 1.
note("c a f e").control([74, sine.slow(4)]).midi()note("c a f e").ccn(74).ccv(sine.slow(4)).midi()В приведенном выше фрагменте ccn установлен в 74, что является фильтром cutoff для многих синтезаторов. ccv управляется saw pattern.
Имея все в одном pattern, pattern ccv будет выровнен с note pattern, потому что структура идет слева по умолчанию.
Но вы также можете управлять cc сообщениями отдельно следующим образом:
$: note("c a f e").midi()
$: ccv(sine.segment(16).slow(4)).ccn(74).midi()Вместо прямой установки ccn и ccv, вы также можете создавать mappings с помощью midimaps:
midimaps
Добавляет midimaps в реестр. Внутри каждого midimap имена контролов (например lpf) сопоставляются с номерами cc.
midimaps({ mymap: { lpf: 74 } })
$: note("c a f e")
.lpf(sine.slow(4))
.midimap('mymap')
.midi()midimaps({ mymap: {
lpf: { ccn: 74, min: 0, max: 20000, exp: 0.5 }
}})
$: note("c a f e")
.lpf(sine.slow(2).range(400,2000))
.midimap('mymap')
.midi()defaultmidimap
Настраивает midimap по умолчанию, который используется когда параметр "midimap" не задан
defaultmidimap({ lpf: 74 })
$: note("c a f e").midi();
$: lpf(sine.slow(4).segment(16)).midi();progNum (Program Change)
progNum отправляет MIDI program change сообщения для переключения между различными пресетами/патчами на вашем MIDI устройстве.
Значения program change должны быть числами от 0 до 127.
// Переключение между программами 0 и 1 каждый cycle
progNum("<0 1>").midi()
// Воспроизведение нот при изменении программ
note("c3 e3 g3").progNum("<0 1 2>").midi()Сообщения program change полезны для переключения между различными звуками инструментов или пресетами во время выступления. Точный звук, на который отображается каждый номер программы, зависит от конфигурации вашего MIDI устройства.
sysex, sysexid && sysexdata (System Exclusive Message)
sysex отправляет MIDI System Exclusive (SysEx) сообщения на ваше MIDI устройство.
SysEx сообщения - это специфичные для устройства команды, которые позволяют более глубокое управление параметрами синтезатора.
Значение должно быть массивом чисел от 0-255, представляющих SysEx байты данных.
// Отправка простого SysEx сообщения
let id = 0x43; //Yamaha
//let id = "0x00:0x20:0x32"; //Behringer ID может быть массивом чисел
let data = "0x79:0x09:0x11:0x0A:0x00:0x00"; // Установить голос NSX-39 на "Aa"
$: note("c a f e").sysex(id, data).midi();
$: note("c a f e").sysexid(id).sysexdata(data).midi();Точный формат SysEx сообщений зависит от спецификации вашего MIDI устройства. Обратитесь к руководству по реализации MIDI вашего устройства для получения подробной информации о поддерживаемых SysEx сообщениях.
midibend && miditouch
midibend устанавливает MIDI pitch bend (-1 - 1)
miditouch устанавливает MIDI key after touch (0-1)
note("c a f e").midibend(sine.slow(4).range(-0.4,0.4)).midi()note("c a f e").miditouch(sine.slow(4).range(0,1)).midi()OSC/SuperDirt/StrudelDirt
В TidalCycles звук обычно генерируется с использованием SuperDirt, который работает внутри SuperCollider. Strudel также поддерживает использование SuperDirt, хотя это требует установки дополнительного программного обеспечения.
Также существует StrudelDirt, который является SuperDirt с некоторыми оптимизациями для работы со Strudel. (Долгосрочная цель - объединить эти оптимизации обратно в основной SuperDirt)
Предварительные требования
Чтобы заставить SuperDirt работать со Strudel, вам нужно
- установить SuperCollider + sc3 плагины, см. Tidal Docs (Install Tidal) для получения дополнительной информации.
- установить SuperDirt, или форк StrudelDirt, который оптимизирован для использования со Strudel
- установить node.js
- скачать Strudel Repo (или git clone, если у вас установлен git)
- запустить
pnpm iв директории strudel - запустить
pnpm run oscдля запуска osc сервера, который пересылает OSC сообщения из Strudel REPL в SuperCollider
Теперь вы готовы!
Использование
- Запустите SuperCollider, используя SuperCollider IDE или запустив
sclangв терминале - Откройте Strudel REPL
…или протестируйте это здесь:
Если вы теперь слышите звук, поздравляем! Если нет, вы можете получить помощь в #strudel канале в TidalCycles discord.
Примечание: если у вас в настройках ‘Audio Engine Target’ установлен в ‘OSC’, вам не нужно добавлять .osc() в конец вашего pattern.
Pattern.osc
Отправляет каждый hap как OSC сообщение, которое может быть принято SuperCollider или любым другим программным обеспечением с поддержкой OSC. Для дополнительной информации читайте MIDI & OSC в документации
SuperDirt параметры
Пожалуйста, обратитесь к Tidal Docs для получения дополнительной информации.
Но можем ли мы использовать Strudel в оффлайн?
MQTT
MQTT - это легковесный сетевой протокол, разработанный для устройств ‘интернета вещей’. Для использования со strudel вам понадобится доступ к MQTT серверу, известному как ‘broker’, настроенному для приема безопасных ‘websocket’ соединений. Вы можете запустить его самостоятельно (например, запустив mosquitto), хотя получение SSL сертификата, которому будет доверять ваш веб-браузер, может быть немного сложным для тех, кто не имеет опыта системного администрирования. В качестве альтернативы вы можете использовать публичный broker.
Strudel пока не поддерживает получение сообщений через MQTT, только отправку.
Использование
Следующий пример показывает, как отправить pattern на MQTT broker:
Другое программное обеспечение может затем получать сообщения. Например, используя командную строку клиента mosquitto:
> mosquitto_sub -h mqtt.eclipseprojects.io -p 1883 -t "/strudel-pattern"
> hello
> world
> hello
> world
> ...
Control patterns будут закодированы как JSON, например:
Будут отправлены сообщения вроде следующего:
{"s":"sax","speed":2}
{"s":"sax","speed":2}
{"s":"sax","speed":3}
{"s":"sax","speed":2}
...
Библиотеки для получения MQTT доступны для многих языков программирования.