Pattr

Собираем Простой Субтрактивный Синтезатор в Max/MSP

Итак, друзья, мы с вами уже научились синтезировать драмсы, но для создания трека нам еще понадобятся синтезаторы, чем мы и займемся в этой статье. Схема синтезатора представлена на схеме ниже. Вообще, если делаете какой-нибудь алгоритм, лучше его нарисовать на бумаге, так будет легче собирать патч впоследствии.

Осцилляторы

Начнем с основ, генераторов звука. Четыре волны на выбор: пила, треугольник, квадрат и шум. Почему нет синусоиды? А зачем? У нас же субтрактивный синт, с помощью которого обычно получают жирные тембры. Вот так будет выглядеть осциллятор (oscil.maxpat):

Здесь видно три четыре осциллятора: saw~, tri~, rect~ и noise~, соответственно для пилы, треугольника, квадрата и белого шума. Сигналы из этих объектов поступают на входы selector~. Этот объект может принимать несколько сигналов, но выводит только один. Количество входов задается аргументом, а какой именно из них будет выводиться из объекта определяется числом, подающимся в первый инлет. В нашем случае объекту задан аргумент 4, значит создано четыре дополнительных входа. Чтобы переключаться между ними нам нужно подавать целые числа 1…4 в первый инлет. У нас это делает объект radiogroup. Один нюанс: самое первое значение radiogroup выводит ноль, именно поэтому мы прибавляем единицу.

В этом патче уже реализован тюнинг осцилляторов: можно настраивать по полутонам и центам. Принцип такой: номер миди ноты поступает в намбербокс MIDI, потом к нему прибавляется значение из намбербокса semitone, после чего еще раз прибавляется поправка на cents. Обрати внимание, что один полутон равен ста центам, поэтому мы значение cents умножаем на 0.01.

Также в этом патче есть намбербокс Pulse width, он задает ширину импульса у квадратной волны.

На этом описание работы осциллятора закончено. Теперь выделяем все, кроме всех намбербоксов и объектов radiogroup, gain~ и ezdac~ и нажимаем ctrl+shift+e. Должно получиться следующее (oscil2.maxpat):

Эта функция называется инкапсуляцией – она переносит выделенные объекты в отдельный патчер, создавая внутри него инлеты и аутлеты. Очень удобно, советую пользоваться почаще.

Ring modulation (RM) и микшер

Ring modulation – кольцевая модуляция уже была рассмотрена в одной из статей про синтез ударных. Это обычное перемножение двух сигналов, в нашем случае двух осцилляторов. Итак, дублируем наш осциллятор и добавляем объект *~ (oscil3.maxpat):

По схеме, RM сигнал будет подмешиваться в микс параллельно, поэтому мы просто сделаем для него отдельный регулятор громкости, а для двух осцилляторов прицепим обычный кроссфейд. Вот результат (oscil4.maxpat):

Немного поясню некоторые детали. Объект dial по умолчанию выдает значения от 0…127, поэтому мы делим его на 127 перед умножением на сигнал. Обрати внимание, что в объекте деления стоит в конце стоит точка – это нужно для  того, чтобы объект вычислял вещественное значение; если точку не ставить, он будет работать в целочисленном режиме и не сможет выводить дробные числа. Объект [!- 1.] представляет собой обычное вычитание, только число, поступившее в левый инлет вычитается из аргумента, в нашем случае, из единицы.

Думаю, не составит труда разобраться, как делается кроссфейд, поэтому двигаемся дальше. Опять выделяем только что созданные объекты кроме двух dial и инкапсулируем (oscil5.maxpat):

Фильтр и огибающие

Планируется переключение между двумя видами фильтров: lopass и highpass. Для огибающих у нас используется объекты adsr~, они генерируют обычную ADSR огибающую. Когда в первый инлет adsr~ поступает ненулевое число, объект воспринимает его как note-on, а само число использует для регулировки громкости. Например, если мы подадим в него 0.5, максимальное значение огибающей будет 0.5, это используется для контроля громкости ноты с помощью velocity. На картинке ниже представлен уже готовый патч, оставим для анализа читателям, он не сложный (filter-adsr1.maxpat):

Напоследок

Конечно, этот синтезатор еще очень сырой, здесь нет отдельного регулятора параметра cutoff фильтра, это сделано для того, чтобы не усложнять патч математическими вычислениями, которые бы корректировали срез фильтра в соответствии с параметром Filter amount. В принципе, эту ручку можно заменить с помощью параметра sustain огибающей фильтра, хотя это и не лучшее решение.

Еще было в планах сделать синтезатор полифоническим, однако у меня все равно не получилось бы рассказать лучше, чем у Cycling’74 в их скринкасте, поэтому здесь лишь приведу видео, где объясняется работа объекта poly~.

18 Jul 2011  OSCII