MIDI
Tidal может отправлять и принимать MIDI-сообщения. можно взаимодействовать с внешними синтезаторами и оборудованием, а также получать данные с контроллеров. всё сопоставление осуществляется непосредственно через код интуитивно понятным способом.
SuperDirt MIDI
Предварительные условия
Для установки требуются последние версии Tidal и SuperDirt:
- Обновитесь до последней версии Tidal
- Убедитесь, что у вас установлена последняя версия SuperDirt Quark. Проще всего удалить и переустановить SuperDirt Quark. подробнее об обновлении Quark - тут.
Инициализация
для начала вам нужно запустить SuperCollider. сначала запуск SuperDirt как обычно. затем в SuperCollider выполните следующий код:
теперь в окне поста SuperCollider должен появиться список системных MIDI-устройств. вывод будет выглядеть примерно так:
названия этих MIDI-устройств состоят из двух частей. обе части понадобятся вам на следующем этапе - для подключения к MIDI-устройству. нужно проверить следующую строку:
тут мы сохранили ссылку на устройство в переменной ~midiOut.
И наконец, определиям имя «синтезатора» в Tidal, который будет использоваться для управления этим устройством. ниже мы назовём его mydevice. выполняем следующую команду:
при желании вы можете определить значение задержки на вашем устройстве:
на этом инициализация завершена. теперь у есть MIDI-устройство, подключенное к SuperDirt и работающее как синтезатор с именем mydevice.
Использование в Tidal
примечание по паттернам
теперь можно начать писать паттерны Tidal для управления MIDI-устройством. можно отправить ему простой нотный паттерн:
это должно воспроизвести простой паттерн из четырёх нот. обратите внимание, что мы используем имя синтезатора mydevice для отправки нот на MIDI-устройство.
также можно использовать имя ноты и октавную нотацию:
в качестве альтернативы использованию n или note для передачи MIDI-нот вы можете использовать функцию midinote:
единственное отличие заключается в том, что в midinote ноты обозначаются числами от 0 (C(-1)) до 127 (G9). В Tidal Cycles нота 0 — это C5, а в MIDI C5 — это нота 60, поэтому перевод из одной системы в другую легко осуществить, прибавляя или вычитая 60 к длительности ноты.
последний пример можно переписать так:
MIDI каналы
используйте функцию midichan для настройки MIDI-канала.
MIDI-канал по умолчанию - 1. MIDI-каналы SuperDirt индексируются, начиная с нуля, поэтому MIDI-канал 1 - это midichan 0:
если ваш синтезатор обрщается к другому каналу, скажем, MIDI-канал 5, вам следует использовать midichan 4:
midichan принимает паттерн из цифр, поэтому вы можете использовать паттерн для воспроизведения на разных каналах MIDI:
приведенный выше шаблон воспроизводит ноты «0 2» на канале 1 и «4 7» на канале 5.
CC Params
чтобы отправить параметр CC на синтезатор, в новом MIDI SuperDirt лучше всего использовать другой паттерн Tidal. для создания этого паттерна вам понадобятся два новых MIDI-параметра SuperDirt:
- ccn: номер параметра CC, которым вы хотите управлять:
ccn 30 - ccv: значение для отправки в параметр CC, в диапазоне от 0 до 127:
ccv 64
вот полный пример, отправляющий значение 64 в параметр CC 30:
также можно указать MIDI-канал с помощью midichan:
можно указать шаблоны значений CC:
обратите внимание, что в данном случае при использовании символа # ритм задаётся самым левым паттерном.
если на вашем устройстве есть функция, которая прослушивает определённый номер CC, вы можете присвоить понятное имя:
если есть много параметров CC, которыми вы хотите управлять одновременно, хорошо подойдет стек:
каждое устройство имеет собственную реализацию MIDI-диаграммы, но есть несколько стандартных номеров CC, которые должны работать одинаково на большинстве устройств:
существует также функция cc, которая позволяет передавать и число, и значение в одной строке:
cкорость
cкорость нажатия по MIDI можно задать с помощью параметров amp и gain. они работают аналогично сэмплам: amp, а gain.
Скорость нажатия по умолчанию - 50, amp - 0,4, а gain - 1.
в таблицах показано, как различные значения amp и gain влияют на скорость нажатия:
модуляция высоты тона
модуляцию высоты тона можно контролировать с помощью функции midibend.
обычно колесо высоты тона передаёт число в диапазоне от -8192 до 8191, но здесь все числа положительные, поэтому диапазон составляет от 0 до 16383, где 8192 - нейтральная средняя точка.
можно имитировать движение колеса высоты тона различными способами.
предположим, ваше устройство называется mydevice и принимает MIDI-сообщения по каналу 5. в этом примере звук начнётся с ноты C и постепенно будет увеличиваться до предела модуляции высоты тона:
теперь мы начинаем с минимума модуляции высоты тона и быстро движемся к нейтральной точке, где мы будем поддерживать высоту тона до конца цикла:
ретушь
ретушь используется для изменения характера воспроизводимого звука, обычно путём увеличения или уменьшения нажатия на клавиши клавиатуры MIDI-контроллера.
для передачи MIDI-сообщений ретушь на устройство используется функция miditouch.
диапозон 0 - 127, а дефолтное значение - 0.
в этом примере после воспроизведения ноты мы устанавливаем ретушь от 0 до 64 и обратно несколько раз в цикле, как если бы была нажата клавиша C MIDI-контроллера.
колесо модуляции
специальной функции для отправки сообщений колеса модуляции не существует, но для колеса модуляции используется CC 1, поэтому можно юзать это:
здесь мы начинаем цикл с mod wheel, установленным на 0, поднимаемся до максимума, затем опускаемся до минимума и снова заканчиваем цикл на 0.
изменение программы
сообщения об изменении программы можно отправлять с помощью функции progNum.
если вы назвали свое устройство mydevice и оно получает сообщения об изменении программы по MIDI-каналу 14, вы можете изменить его программу/паттерн, выполнив следующую команду:
NRPN парамаетры
для отправки параметров NRPN используйте функции nrpnn и nrpnv.
номера NRPN состоят из двух байтов: старшего байта (MSB) и младшего байта (LSB). при использовании nrpnn эти два байта записываются в одно число. чтобы рассчитать необходимое число, умножьте первый байт (MSB) на 128, а затем прибавьте второй байт (LSB). Например, если в руководстве к вашему устройству указано, что отправка реверберации задаётся значениями NRPN MSP 2 и NRPN LSB 6 (или 2:6), вам нужно указать для nrpnn значение 2*128+6=262.
значения NRPN также состоят из двух байтов, что обеспечивает большую точность, чем сообщения CC. допустимый диапазон для nrpnv - от 0 до 16384. однако учтите, что многие устройства просто проигнорируют эту дополнительную точность.
nrpnn и nrpnv являются шаблонными, но обратите внимание, что их аргумент имеет тип Pattern Int, поэтому нужно убедиться, что вы передается значения типа Int, а не Double:
sine возвращает нам значения типа Double, поэтому нам нужно преобразовать их в Int перед передачей в nrpnv. для этого мы используем floor - функцию Haskell, округляющую число в меньшую сторону, и <gt;, которая применяет функцию (в данном случае floor) ко всем элементам коллекции.
существует также функция nrpn, которая позволяет нам передавать и число, и значение в одной строке:
Синхронизация MIDI-часов
часто бывает важно отправлять события MIDI-синхронизации для синхронизации темпа между устройствами. Tidal не может синхронизировать свой темп с получаемыми событиями MIDI-синхронизации, но может выступать в качестве источника MIDI-синхронизации. в следующих разделах показаны два варианта отправки событий MIDI-синхронизации, соответствующих темпу Tidal.
синхронизация MIDI-часов с использованием протокола Link
начиная с версии 1.9, Tidal использует протокол Link для планирования событий. Link — это технология, синхронизирующая музыкальный ритм, темп и фазу в нескольких приложениях. изначально она была разработана компанией Ableton, но имеет открытый исходный код и теперь реализована во многих музыкальных программах. можно использовать Link для синхронизации Tidal с отдельной программой, которая будет выступать в качестве источника MIDI-сигнала.
это предпочтительный метод отправки событий MIDI-синхронизации, поскольку он прост, производителен, стабилен.
SuperCollider как источник MIDI-синхронизации
можно использовать Link для синхронизации Tidal с SuperCollider и настроить SuperCollider на отправку MIDI-событий. для этого потребуется расширить SuperCollider новым классом LinkToMidiClock.
найдите соответствующий каталог расширений, выполнив одну из следующих строк в SuperCollider:
создайте файл LinkToMidiClock.sc в выбранном каталоге расширений и сохраните его со следующим содержимым:
перезагрузите SuperCollider или используйте Language > Recompile Class Library
теперь можно следовать руководству по инициализации. будем использовать переменную MIDI-устройства с именем ~midiOut из инициализации в примерах ниже.
После инициализации MIDI-устройства создайте LinkClock в SuperCollider.
убедиться, что Tidal и SuperCollider соединились по Link, можно, проверив количество peers Link:
затем создайте LinkToMidiClock, подключенный к MIDI-устройству ~midiOut и LinkClock ~lc.
события MIDI-синхронизации будут отправляться непрерывно после того, как мы пропишем их начало, до тех пор, пока мы не пропишем их остановку.
контроль входа звука
Tidal 1.0.0 теперь поддерживает внешний входной сигнал по протоколу OSC. вот краткое руководство по настройке, включая использование простого «бриджа» для работы MIDI-входа.
сет-ап
чтобы использовать MIDI, вам не нужно особо беспокоиться о сопоставлении OSC. однако вам потребуется запустить программу для преобразования MIDI в OSC (Tidal слушает сообщения OSC). вот как это сделать с помощью SuperCollider. сначала, когда Tidal и SuperDirt уже запущены, запустите следующий блок кода в SuperCollider:
сет-ап в использовании
после этого вы сможете запустить следующий паттерн, использующий CC value 12:
если вы хотите использовать MIDI в операторе формирования паттернов, может быть полезно сначала segment входные данные, поскольку исходный паттерн, поступающий с вашего MIDI-устройства, будет иметь очень высокое разрешение. в этом примере принимается только одно значение за цикл, которое затем преобразуется с помощью функции range: