Ornament-8. Аналоговый функциональный генератор поведения
В 2019 году я ступил на путь разработки электроники. Моим первым устройством является Орнамент-8. Не судите строго.
— Орнамент-8 это устройство, способное реализовывать сложные конечные автоматы.
— Переход конечного автомата из одного состояния в другое определяется патчем, соединением входов и выходов ячеек Орнамента.
— Каждая из 8 ячеек Орнамента представляет собой моновибратор.
— Если моновибратор запустить, он будет удерживать высокое состояние в течение периода времени, задаваемого потенциометром TIME.
— В момент перехода моновибратора (далее ячейка) из высокого состояния в низкое происходит генерация триггера.
— Этот триггер способен запустить любую другую ячейку Орнамента, кроме самой себя. Для этого необходимо соединить тригерный выход с тригерным входом.
— Если триггер приходит на вход уже активной ячейки, он не поглощается, а поступает на тригерный выход PASS>. Этот выход реализует логику: если ячейка активна → пусть триггер активирует другие ячейки.
— Помимо тригерных входов и выходов каждая ячейка имеет аналоговый выход, сигнал на котором пропорционален времени активации ячейки от 0 до 1 в зависимости от параметра TIME. Если моновибратор сравнить с наполняющимся сосудом, то аналоговый выход (CV>) показывает уровень жидкости в этом сосуде.
— Каждая ячейка имеет вход для управляющего напряжения (>CV). Приложенное к этому входу напряжение управляет коэффициентом, увеличивающим значение параметра TIME установленного потенциоментром. Приложение управляющего напряжения к >CV можно представить как растяжение времени в системе координат ячейки.
Орнамент-8
Кажется, что Орнамент-8 это какой-то странный артефакт, упавший из космоса. Зачем он нужен? Что с ним делать? Кто и почему придумал такую странную систему правил?
В этой статье я хочу показать, как цепочка маленьких и оправданных дизайн-решений может привести к созданию устройства, которое открыло совершенно новую парадигму для создания секвенций.
Предыстория
В начале 2019 года я познакомился с отечественным аналоговым синтезатором Lyra-8. Лира это синтезатор с очень широкой палитрой звуков. Он может звучат нежно и мягко, а может издавать шумы, крики и звуки пост-апокалипсиса. Синтезатор довольно медленный, медитативный, его часто используют в шумовой, эмбиент и дрон музыке.
Lyra-8
В первом приближении Лира имеет 8 струн (или голосов). Вы управляете частотой звука голоса, вращая потенциоментр. Огибающая громкости запускается замыканием верхнего и нижнего металлических контактов (или сенсоров). Причем параметры огибающей макроскопически зависят от проводимости замыкающего объекта.
Лиру делает особенной ее организменная философия. Сложность звучания рождается из взаимодействия небольшого числа модулей, которые опутаны сложными обратными связями. Я уже писал текст об обратных связях, но в Лире это понятие выведено на совершенно иной уровень. Обратные связи могут быть настолько сложными и запутанными, что исполнителю в принципе почти невозможно точно предсказать поведение, можно только интуитивно пытаться его контролировать.
Взаимодействие голосов реализовано с помощью частотной модуляции (Frequency Modulation = FM). 8 независимых голосов Лиры могут модулировать частоты друг друга. Грубо говоря, когда на гитаре вы дергаете одну струну, вы слышите звук1 (какой-то спектр, эволюционирующий во времени). Когда на гитаре вы дергаете другую струну, вы слышите звук2 (договоримся, что струны настроены на разные частоты). Если дернуть одновременно обе струны, вы слышите сумму звука1 и звука2. Вы слышите всё те же эволюции, но одновременно. Звуки могут друг на друга влиять, но не настолько существенно, как то, что происходит при ФМ синтезе.
Если же звук1 модулирует частоту звука2, то активация только звука даст звук1, активация звука2 даст только звук2, а вот одновременная активация обоих звуков даст звук3. Этот звук3 (его гармонический состав не будет равен сумме гармоник исходных звуков) будет зависеть от схемы модуляций и будет иметь совершенно иную эволюцию спектра, а также гармонический состав. Если источников звука только 2, то возможны 3 схемы модуляции:
1→2
2→1
1→2→1
Во всех трех схемах звук (спектр, эволюционирующий во времени) будет разным. Причем он также будет изменяться от изменения частоты модулятора.
Если источников звуков будет больше, то и схем модуляции также станет больше (комбинаторика в помощь).
Данная статься не про синтез звука, поэтому я не хочу погружаться в тонкости отличий звука от тембра от ноты. Также не хочу погружаться в сравнение Лиры-8 с классическими ФМ синтезаторами. И уж точно тут не место для объяснения ФМ синтеза для генерации сложных спектров. Для этого всего я планирую написать добротные сфокусированные статьи.
На данном этапе достаточно понимать, что 8 голосов Лиры позволяют синтезировать больше, чем 8 разных звуков при одних и тех же настройках. Схема ФМ синтеза и последовательность активации голосов определяет эволюцию финального тембра во времени.
Звучание Лиры похоже на запутанный лабиринт, в котором ты действуешь интуитивно и осторожно. Ты либо крутишь звук, удерживая несколько сенсоров, либо играешь на сенсорах некоторый паттерн. Делать обе вещи одновременно практически невозможно.
Хотелось запускать голоса лиры с помощью некоторого автомата. Пока автомат перебирает голоса Лиры, музыкант мог бы изменять параметры инструмента, чтобы трансформировать звучание и исследовать звуковые ландшафты.
Орнамент-8 был создан именно с этой целью.
Шаг 0
Когда я познакомился с Лирой, то был поражен возможностями, которые до сих пор скрыты в этом синтезаторе. Мне очень сильно захотелось их раскрыть.
У меня не было опыта разработки электроники или программирования софта. Конечно, я знал, что есть такая вещь, как компьютер, и что на нем можно писать программы. Но серьезных проектов за плечами у меня не было.
Забавно, но в тот момент я подумал, что сделать аналоговое устройство будет проще, чем учиться программировать кокое-нибудь Ардуино. Если бы я тогда не пошел по сложному пути, то на Ардуино родился бы какой-то вполне очевидный, простой и утилитарный запоминатель действий пользователя. Это не хорошо и не плохо, это уже другая реальность.
Шаг 1
Я стал изучать книгу Платта «Электроника для начинающих». Там он показывает, как на таймерах 555 собрать шифт-регистр, по которому будет бегать огонек.
Я подумал: «Вот оно! Вместо того, чтобы включать лампочку, можно замыкать контакты Лиры. План прост, а потому красив — вот, что я понял на физтехе.»
Каждый бит этого шифт-регистра был реализован на моновибраторе, сделанном на таймере555. Управлять временем, пока моновибратор находится в высоком состоянии, можно через сопротивление в цепи заряда конденсатора.
Подобный «шифт-регистр» — это основа почти всех классических секвенсоров. Есть шифт-регистр с шагов, где
. Но классический секвенсор обычно управляет лишь одним источником звука (монофонический режим), а каждый шаг отвечает за управление нотой (основной частотой осциллятора) или другими параметрами (например, громкостью или степенью открывания/закрывания фильтра). По сути номер шага это дискретное время, который определяет значение некоторого параметра в данным момент времени.
Пример классического секвенсора на видео. Кроме изменения частоты звука, также происходит запуск огибающей громкости и изменение других параметров.
Подобная реализация не подходит для моего случая. Мы можем только запускать голоса Лиры, но не имеем возможности управлять частотами голосов извне (только потенциометром TUNE). Лира имеет 8 независимых голосов, а «бегать» по ним циклическим шифт-регистром означает понизить полифонию синтезатора с восьми до одного. И вообще конечная цель не в том, чтобы бегать и по очереди их запускать, а в том, чтобы запускать каким-то интересным образом несколько голосов одновременно.
Уже на этом шаге мне было интуитивно понятно, что интересный музыкальный результат может дать только секвенсор, способный создавать сложное поведение. А поведение это всегда конечный автомат. Посмотрим, как я попытался этого достичь.
Шаг 2
Нужно было придумать способ запускать сразу несколько голосов. Как вариант, можно просто создать несколько петель разной длины. «Огоньки» будут бегать с разной скоростью по этим петлям и создавать интересные взаимодействия голосов Лиры. Но петли какой длины?
Петля длиной 1 не имеет смысла, так как это означает, что голос будет звучать бесконечно. Вместо этого я добавил тумблер инвертирующий состояние выхода. Когда ячейка активна, выход не замыкает, а наоборот размыкает контакты Лиры, а в остальное время держит их замкнутыми.
Петли длиной 2, 3, 4, 5, 6, 7 и 8 имеют смысл. Я подумал, что необходимо реализовать систему тумблеров на панели секвенсора, которые бы замыкали какие-то особо удачные конфигурации. Например, петли (2, 3, 3), (4, 4), (2,2,3), и другие. Вариантов много, надо было найти самые лучшие с музыкальной точки зрения.
Самый верный способ найти лучшие варианты из множества — это просто поиграть на системе. Поэтому я собрал первый прототип на бредборде.
Прототип состоял из нескольких ячеек, которые имели тригерный вход, триггерный выход и выход для замыкания контактов Лиры. Изначально ячейки были между собой не соединены, так как моей целью и было найти наиболее удачные соединения.
Примерно через 15 минут игры с прототипом я понял, что концепция «несколько интересных петель» рушится.
Почему моновибратор обязан запускать только одну ячейку? Ответ очевиден. Всему виной когнитивное искажение «функциональная фиксированность» — объекты могут работать только каким-то определенным, разрешенным образом. Это настолько фундаментальная вещь в мире разработки, что достойно отдельной статьи.
В моем случае я наоборот хотел научиться генерировать много событий, которые бы интересным образом взаимодействовали. Поэтому соединять одну ячейку с несколькими (у которых еще и разный TIME параметр) оказалось полезным методом для наполнения системы триггерами.
Количество интересных соединений росло факториально, никакие тумблеры уже не смогли бы справиться. Я почти сразу понял, что в данном секвенсоре придется руками патчить ячейки.
Да и вообще, гораздо интересней не выбирать одну из нескольких предоставленных разработчиками топологий, а создавать свои собственные. Каждая топология секвенсора, как отдельное путешествие. Это и должно было стать сутью творческого процесса данного устройства.
Еще я пробовал запускать в одну петлю сразу несколько триггеров. Например, в петлю длиной 4, запустить 2 триггера через 1. Но тут же я обнаружил механизм поглощения этих триггеров, который я не смог предсказать без прототипа.
Если длительности ячеек почти одинаковы, то в петле может существовать сразу несколько активных ячеек. Но стоит увеличить TIME одной из ячеек, как она тут же начнет поглощать триггеры от более быстрых ячеек. Они просто будут в нее врезаться. Тут необходимо поясняющее видео.
Если ячейка уже активна, то попытка ее повторной активации ни к чему не приведет. Входящий триггер просто поглотится, а в момент деактивации ячейки будет сгенерирован только один исходящий триггер. Это существенное ограничение, с которым нужно было что-то делать.
Так и появился выход PASS>. Он позволял пробросить входящий триггер в случае, если ячейка уже активна на какую-то другую ячейку. Это добавило возможность создавать логические конструкции. А также не терять триггеры впустую.
Орнамент-8 (имя, которое я дал секвенсору) давал возможность генерировать мягкие, плавающие ритмы, которые хорошо подходили к характеру Лиры. Примерно так выглядели мои эксперименты на этом этапе проектирования:
Шаг 3
Далее я показал прототип Владу Креймеру (создателю SOMA, который является автором Лиры). Ему понравилась концепция. Как и в Лире, Орнамент имеет несколько однотипных модулей, а сложное поведение рождается через их взаимодействие. Модулей мало, а вот вариантов их взаимодействия много, отсюда и сложность.
Уже вместе мы добавили возможность модулировать длительность TIME параметра ячейки управляющим сигналом. Получается что-то вроде частотной модуляции, но уже для периода ячейки.
Также мы добавили возможность самой ячейки генерировать управляющее напряжение через степень наполнения конденсатора таймера.
С какой целью нужно находу сжимать и растягивать TIME параметр ячейки? На самом деле, мы добавили эту функцию, чтобы посмотреть, что будет. Нам понравилось то, что мы увидели, поэтому данная функция осталась. Этакий лихой способ расхлябать и так не очень ровный ритм до состояния хаоса (не путать с рандомом).
Но именно эта возможность еще сыграет ключевую роль в генерации ровных, но человекоподобных ритмических рисунков. Об этом подробно будет написано во второй части статьи, описывающей Орнамент, как функциональный секвенсор общего назначения. Но тогда мы этого еще не знали.
Мы добавили в устройство триггер-конверторы, которые по растущей границе активации выхода ячейки генерировали короткий триггер. Это позволило играть не только на Лире-8, но также запускать огибающие любых других устройств, восприимчивых к подобным сигналам. Наример, вышедшая тогда драм-машина Pulsar-23 от SOMA, а также Eurorack модули.
Шаг 4
Так как у меня был минимальный опыт в электронике Влад помог мне разработать финальное изделие на базе SOMA Lab и запустить его в производство. Я приступил к созданию мануала и съемке демонстрационного видео для релиза.
В ходе съемок я учился играть на этом инструменте. А также параллельно переосмысливал привычные представления о роли музыканта и его музыкального инструмента.
Мы привыкли, что игра на инструменте это про тембр и тайминг. С точки зрения информатики музыкант генерирует поток звуков, событий в тишине, где каждое имеет
начало во времени
конец во времени (может быть бесконечным, если очень захотеть)
спектр, эволюционирующий во времени. Причем музыкант способен управлять этой эволюцией. Простой пример, яркий или глухой звук гитарной струны. Сложный пример, электронный синтезатор, который по сути является функциональными генератором. На основе вектора параметров он синтезирует сигнал сложной формы.
Орнамент, если так посмотреть, это тоже инструмент, синтезирующий не звук, а поток событий, который может запустить звуки. Музыкант также должен уметь оперировать Орнаментом, чтобы манипулировать свойствами этого потока.
Понимание концепции функционального генератора ритмов только начало вырисовываться у меня в голове. А полностью она созрела позже. Об этом будет вторая часть статьи об Орнаменте.
Предлагаю пощелкать демо-видео с примерами композиций, созданных с использованием Оранмента. Все визуализации я запрограммировал на processing.
Шаг 5
После выхода устройства я продолжал на нем играть и экспериментировать. Мне хотелось научиться синтезировать не только плавные паттерны для Лиры, но еще и найти способы генерировать ритмы.
Основной проблемой было то, что время активации каждой ячейки зависело от потенциометра. Установить два потенциоментра на одну длительность можно было только на слух путем тонкой настройки. На практике это было очень муторно.
Но в один прекрасный день произошло важное наблюдение. Я старался активировать ячейку, запускающую рабочий барабан, через равные промежутки времени из внешней цепи. Я обнаружил интересную закономерность. Если увеличить время активации ячейки рабочего барабана до времени, превышающего период, с которым петля ее активирует, то ячейка станет запускаться только через раз. Это наблюдение изменило всё! Я открыл деление частоты.
Всему виной функциональная фиксация — самый главный враг хорошего дизайна, о котором я говорил в части про шифт-регистр. Я был сфокусирован на том, чтобы делать на Оранаменте петли. А для генерации ровных ритмов действовать надо было совершенно иначе.
В следующей части, я подробно расскажу об этом методе. А пока смотрите пример создания абсолютно ровного (квантизованного) ритма на Орнаменте.
Спасибо за внимание! Желаю удачи в ваших исследованиях.