MIDI, OSC и MQTT 🌀 Bulka

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'})
Доступные опции
ОпцияТипПо умолчаниюОписание
isControllerbooleanfalseКогда true, отключает отправку note сообщений. Полезно для MIDI контроллеров
latencyMsnumber34Задержка в миллисекундах для выравнивания MIDI с аудио движком
noteOffsetMsnumber10Смещение в миллисекундах для note-off сообщений для предотвращения глитчей
midichannelnumber1MIDI канал по умолчанию (1-16)
velocitynumber0.9Velocity ноты по умолчанию (0-1)
gainnumber1Множитель gain по умолчанию для velocity (0-1)
midimapstring’default’Имя MIDI mapping для использования control changes
midiportstring/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, вам нужно

      1. установить SuperCollider + sc3 плагины, см. Tidal Docs (Install Tidal) для получения дополнительной информации.
      2. установить SuperDirt, или форк StrudelDirt, который оптимизирован для использования со Strudel
      3. установить node.js
      4. скачать Strudel Repo (или git clone, если у вас установлен git)
      5. запустить pnpm i в директории strudel
      6. запустить pnpm run osc для запуска osc сервера, который пересылает OSC сообщения из Strudel REPL в SuperCollider

      Теперь вы готовы!

      Использование

      1. Запустите SuperCollider, используя SuperCollider IDE или запустив sclang в терминале
      2. Откройте 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 доступны для многих языков программирования.