В своём прошлом посте про музыку на мобильных устройствах я рассмотрел основы взаимосвязи компонентов и протоколов для создания музыки на ходу. Я старался дойти до самых простых кирпичиков, чтобы в итоге оказалось понятно с чем и как это есть.
Сейчас будет сложно. Сейчас будет про мою новую любимую игрушку для создания музыки — эзотерический язык для описания секвенсоров под названием ORCΛ (читается как "орка").
Готовы? Поехали.
Для чего это?
Как я и писал в предыдущем посте, секвенсор — это такая цифровая шарманка, ваша музыкальная шкатулка, в которой есть валик с шипами, дёргающими за металлические пластинки. Видели такое? Скорее всего видели. Нужно это чтобы самому не играть записанные последовательности, а доверить это действие машине.
Обычно в роли секвенсоров выступают сумасшедше дорогие модули для Eurorack, иногда не совсем бесплатные плагины для DAW, но практически всегда их возможности ограничены тем, что заложил в них производитель, то есть количество шагов, количество дорожек, и так далее.
ORCΛ же — это опенсорсная платформа для создания собственных MIDI секвенсоров в любой форме и последовательности. Хотите размер не 4/4, а 6/8 ? Пожалуйста, ORCΛ так может. Хотите неограниченное количество дорожек и инструментов? Можно и так. Хотите дорожки разной размерности? И это не проблема! Хотите чтобы эти несколько дорожек шли разным темпом в случайной последовательности? Ну, вы поняли.
Для начала ознакомимся с внешним видом:
А вот мой недавний джем в размерности 3/4:
Теперь давайте разбираться с тем, что происходит.
Прежде всего, где взять?
ORCΛ доступен для бесплатного скачивания тут.
Хорошо, а что теперь с этим делать?
Сам по себе ORCΛ звуков не производит, его требуется подключить к MIDI-инструменту. Скорее всего при запуске программа подхватит первый доступный MIDI-интерфейс, но если нет, то придётся поискать в меню MIDI.
В моём случае ORCΛ работает на винде и через виртуальный MIDI-кабель посылает сигналы в плагин-хост Kushview Element. Если вы захотите пойти схожим путём, я оставлю вам несколько полезных ссылочек:
- Собственно, Element. Скачать тут
- Tunefish, очень хороший бесплатный VST-синтезатор. Скачать тут.
- Sitala, опенсорсный сэмплер. В базовой поставке есть только сэмплы TR-808, что, впрочем, вполне неплохо. Скачать тут.
Основные понятия
ORCΛ — это ваш блокнот для взаимодействующих операторов и их значений. Каждый оператор и каждое значение может занимать только одну клеточку, что является результатом некоторых странностей, но мы же не ищем здесь лёгких путей, так?
Изменение статуса операторов происходит каждый фрейм, коих 4 в каждом бите(количество битов в минуту определяет темп).
Как я сказал выше, операторы могут взаимодействовать друг с другом посредством значений, поэтому их взаимное расположение на поле играет важную роль.
Поскольку под операторы и значения можно отвести не больше одной клеточки, количество возможных значений ограничено таблицей BASE36, то есть 10 арабских цифр и 26 букв латинского алфавита, независимо от регистра. Тут было очень сложно, но потом стало проще.
Я не буду описывать абсолютно все имеющиеся операторы, а опишу только те, которые непосредственно используются на картинке выше.
Для начала самые важные операторы
:
или двоеточие. Оператор MIDI. Это то, что будет передавать команду в инструмент. Имеет пять аргументов, которые пишутся каждый по одному в клеточки справа от оператора:- Канал MIDI — собственно, какой инструмент триггерить. Отсчёт каналов идёт с нуля, поэтому будьте внимательны
- Октава — номер октавы. У разных инструментов транспозиция октав разная, поэтому подбирайте номер октавы, пока не понравится звук.
- Нота — собственно, нота из октавы. Возможные буквенные значения соответствуют нотам:
AaBCcDdEFfGg
. Никто не запрещает писать буквы и далее по алфавиту, но тогда ноты будут браться как в кольце по модулю 12. - Velocity — скорость нажатия ноты. У некоторых инструментов напрямую этот параметр связан с громкостью. Можете его использовать чтобы разнообразить микс
- Gate — длительность звучания ноты
*
или bang в терминологии ORCΛ. Активирует другие операторы при встрече с ними. Собственно, этот оператор и делает всю музыку. Может извлекаться другими разнообразными операторами.
Хорошо, а как музыку-то писать?
Хороший вопрос. Я тоже долго им задавался. Для этого нам помогут другие операторы.
D
, или Delay в терминологии ORCΛ. Выпускает оператор*
(bang) снизу от себя в указанный интервал. С аргументом1
справа от оператора выпускает*
каждый фрейм, увеличение аргумента справа увеличивает интервал между*
. Есть и аргумент слева, который помогает делить темп, но я им практически не пользуюсь.
Предположим, что у нас ударка находится на канале 1 MIDI, а бочка — нота До (C
) первой октавы. Чтобы стучать бочкой каждый такт (не каждый фрейм!) нам потребуется записать в табло ORCΛ следующую конструкцию из операторов:
Клетку между D
и :
требуется оставить пустой, там будет появляться оператор *
, который триггерит MIDI.
Кстати, если ничего не заиграло, нажмите на пробел. Нажмите ещё раз чтобы остановить воспроизведение. Сложно, но мы уже подбираемся к созданию первых звуков!
i
, или Increment в терминологии ORCΛ. Выпускает числобуквенное значение снизу от себя, ограниченное аргументом справа. Слева принимает оператор*
(bang). Если соединитьi
с операторомD
, можно получить удобный счётчик фреймов! Это, пожалуй, самый основной источник синхронизированных чиселок для создания секвенсоров. Чтобы создать такой счётчик, нужно записать подобную конструкцию в табло:
Получится счётчик на 8 шагов, где шаг сменяется каждый фрейм.
Теперь посмотрим на оператор, который позволяет размножить значение, получаемое из счётчика i
V
, или Variable в терминологии ORCΛ. Позволяет записать значение в переменную и использовать это же самое значение в других местах табло. Для названия переменной лучше всего использовать маленькие латинские буквы.
Чтобы записать значение в переменную, нужно её название указать в аргументе слева, тогда правый аргумент будет записываемым значением. Если же оператор V
поставить в другом месте табло и указать имя переменной в аргументе справа, то значение этой переменной отобразится снизу от оператора. Сложно? Сейчас покажу на примере:
В примере выше сперва мы записали значение 1
в переменную x
, а потом воспроизвели его двумя строчками ниже.
Теперь же я могу полностью описать самый верхний левый блок на скриншоте, который конструирует секвенсор.
Здесь оператор D
выпускает *
каждый фрейм, чем триггерит оператор i
, ограниченный значением g
(16). Вывод оператора i
записывается оператором V
в переменную a
.
Только зачем всё это?
T
, или Track в терминологии ORCΛ. Мой любимый оператор. Именно он создаёт те самые шаговые секвенсоры, которые продаются за много денег. Принимает два аргумента слева, позицию и длину, чтобы считать аргумент справа и передать его вниз от себя. Следующая конструкция будет считывать операторы или значения справа и посылать их вниз от оператораT
:
Смекаете? На примере выше изображена та самая туц-туц техно бочка! Каждый четвёртый фрейм оператор T
считывает и передаёт оператор *
вниз и триггерит тем самым оператор :
.
Мой полный сет ударных в текущем джеме выглядит вот так:
В принципе оператора T может быть достаточно для чего угодно, но у меня есть ещё несколько любимцев в запасе.
F
, или If в терминологии ORCΛ. Сравнивает аргументы слева и справа; если они совпадают, выпускает*
снизу от себя.
Очень полезен для трекеров с чуть более медленным но всё же привязанным к темпу инкрементом. Использую для программирования нот басовых дорожек.
На примере выше каждые 16 фреймов осуществляется инкремент, после чего в операторе T меняется вывод. В данном случае в выводе оператора пишется нота и записывается в переменную b
.
R
, или Random в терминологии ORCΛ. Ещё один мой любимый оператор. Выводит снизу от себя случайное значение, ограниченное аргументами слева (минимум) и справа (максимум).
Мне нравится использовать его в связке с оператором T
, чтобы подставлять случайную ноту из гаммы в секвенсор, тем самым делая микс разнообразнее.
X
, или Write в терминологии ORCΛ. Позволят писать значение из аргумента справа по смещению x и y, определяемому аргументами слева. Полезен, когда не хватает места для вставки нужных операторов по месту назначения.
J
, или Jumper в терминологии ORCΛ. Позволяет передать значение из аргумента сверху в вывод вниз. Позволяет экономить место, особенно при описании нескольких секвенсоров. Оператор можно стекать.
- Остальные операторы описаны на странице проекта в GitHub, они могут вам тоже понадобиться.
Ничего не понятно!
Мне тоже было сложно поначалу въехать в концепт операторов и значений. Особенно сложно было натянуть на голову Base36 и соответствующие ограничения.
С другой стороны, возможность состряпать простой джем за пять минут просто ничто не покроет. Смотреть на другие секвенсоры я уже попросту не могу.
Благо ORCΛ является своего рода "протоколом", существует несколько его имплементаций, как то на JS(десктопная аппка в Electron, пользуюсь этим на винде), сишная реализация для консольки (мой любимый вариант, живёт у меня на Pi Zero WH и совокупляется с iPad), а также Lua для каких-нибудь специфических устройств типа Monome Norns.
Для желающих ознакомиться далее есть отличный туториал на английском, с него я и начинал, когда захотелось вкатиться.
Надеюсь, вам было интересно! Спасибо, что дочитали до конца.
Подписывайтесь на мой канал на YouTube, там будут регулярно публиковаться демки, сделанные с помощью ORCΛ.
Выглядит как Dwarf Fortress для музыкантов. Сложна! Но интересно было почитать, спасибо за погружение в странный мир)
Выглядит офигенно! Как житель линуксового терминала, мечтающий вкатиться в музыку, с нетерпением жду момента, чтобы попробовать это чудо. Спасибо за годноту! :)
Ссылка на Sitala неправильная (ведет тоже на Tunefish).
Ничего непонятно, но очень интересно. И музыка на первом видосе нравится.