Pattr

Синтез Ударных в Max/MSP. Часть 1: Бочка

Любой музыкант музыкант рано или поздно начинает задумываться о том, чтобы синтезировать свои собственные бочки, снейры или перкуссии. Некоторым просто любопытно, как это все это работает, другими же двигает бесконечное стремление сделать что-то свое, так или иначе, все хотят создать свой уникальный звук.

Сразу хочется сказать, что создать что-то совершенно уникальное очень сложно, все-таки саунд дизайн существует не один десяток лет, а многочисленные библиотеки сэмплов наверняка уже имеют нужную вам бочку или снейр. Отсюда возникает логичный вопрос: зачем вообще обычному музыканту париться с синтезом ударных, если можно просто взять сэмпл из библиотеки? Дело в том, что когда точно знаешь, какой звук нужен, гораздо проще и быстрее накрутить его самому, чем перебрать сотни вавок, к тому же в последствии все равно придется подгонять выбранный сэмпл под текущий трек (по питчу, по длине и тд).

Эта большая тема, поэтому она будет разделена на несколько постов. Что ж начнем…

Бочка

Ну это вообще попса :) Чуть менее, чем все музыканты-электронщики знают, что электронная бочка — это промодулированная по частоте синусоида. Щелчок получается засчет быстрого спада частоты генератора в первые моменты звука, а тело образуется, когда частота либо перестает спадать, либо падает, но медленно.

Но для того, чтобы приготовить кошерную бочку недостаточно одной только модуляции частоты: нам еще понадобится огибающая (envelope) для амплитуды. Действительно, звук, амплитуда которого не меняется со временем звучит уныло и плохо сидит в миксе.

Итак, для начала определимся с основными объектами, вокруг которых мы будем строить патч: cycle~ - это наша синусоида, основа бочки; function, line~ - эти два объекта будут генерировать огибающие для частоты и амплитуды. Можно, в принципе, использовать и adsr~, он проще в настройке, но менее гибкий, потому мы его и не взяли.

Разумеется, это не все объекты, которые будут использоваться, просто остальные мы будем подстраивать именно под них.

Теперь о том, как работают некоторые объекты.

cycle~, как уже говорилось, генерирует синусоиду (точнее, косинусоиду, но это не столь важно). Этот объект может иметь аргумент, который определяет частоту звука, генерируемого объектом по умолчанию, когда не подан сигнал в первый вход. Объект имеет два входа: первый для модуляции частоты, второй для модуляции фазы (фаза нормализирована до диапазона 0…1, тем, кто не помнит тригонометрию напомню, что один цикл косинуса занимает диапазон 0…2π).

Объект line~ генерирует рамповидный сигнал. Объясним, что это такое на примере. Допустим, мы хотим создать огибающую, которая будет стартовать с нуля, затем за полсекунды достичь единицы, после чего за сто миллисекунд опуститься до 0.5. Чтобы сгенерировать такую рампу, надо послать сообщение в объект вида (0, 1 500 0.5 100). Разберем, что оно означают все эти цифры. Ноль, после которого стоит запятая мгновенно возвращает рампу в нулевое значение; следующая пара цифр 1 500 означает, что рампа поднимется до единицы за 500 мс; после того, как рампа поднимется до 1, вторая пара 0.5 100 опускает рампу до 0.5 за 100 мс.

Таким способом не слишком удобно задавать огибающие (хотя, при определенной тренировке, не составит особого труда прописывать несложные энвелопы). Программисты из Cycling’74 решили эту проблему, создав объект function. В нем мы вручную рисуем нужную нам огибающую, после чего в левый вход подаем BANG, а объект выводит из второго слева выхода готовое сообщение для line~.

Так, мы отклонились от темы, нам надо определиться, как нужно моделировать частоту. Простой вариант: просто умножить созданную в line~ огибающую с диапазоном 1…0 на некоторую величину, которая будет регулировать глубину модуляции. У этого способа есть недостаток — он не позволяет регулировать базовую частоту бочки, то есть ее частота всегда будет падать до нуля, что не есть гуд. Почему? Дело в том, что тональность бочки нужно подстраивать под тональность всего трека, чтобы не создавалось ощущение, что «бочка не та». В общем, чтобы иметь возможность регулировать базовую частоту нам нужно всего лишь прибавить к уже умноженному сигналу модуляции значение базовой частоты.

Вот результат (kick1.maxpat). Нажмите на большую кнопку, чтобы услышать звук.

Уже похоже на бочку, не правда ли? Но ей определенно нужна огибающая громкости. Для ее создания мы будем использовать пару из объектов function и line~. Выход из line~ нужно перемножить с сигналом, выходящим из cycle~ (kick2.maxpat).

Вот и все. Я обычно умножаю выход огибающей на саму себя, чтобы она изменялась экспоненциально. Вот окончательная версия патча (kick3.maxpat):

В следующей статье мы будем создавать снейры и, может быть, что-нибудь еще, посмотрим :)

Дополнение

По просьбе одного читателя, выкладываю версию патча, созданного в PureData. Принципиальных отличий от максовского патча не имеет, разве что вместо объекта function используется envgen, а вместо объект cycle~ заменяется osc~. Ну и, разумеется, стандартные недостатки пд в виде сброса всех настроек и отсутствия подобия объекта preset.

16 Jul 2011  OSCII