Создаем FM-синтезатор сами(часть1)
12.03.2009 от admin
Итак, начнём с создания FM-синтезатора с амплитудной ADSR-огибающей. Сначала не много теории. Звук в FM-синтезе определяет следующие параметры: частота несущей [Frequency Carrier(FC)], частота модулятора (FM), амплитуда модулятора (AM), отношение FM/FC известное больше как harmonicity ratio (HR) и отношение AM/FM, которое называется modulation index (MI).
Примечание: Я буду использовать английские термины, чтобы вам было проще освоиться в других программах.
Запускаем PureData и в открывшемся окне нажимаем Ctrl+n или File->New, тем самым создав новый патч в котором мы и будем создавать основу нашего синтезатора.
Первым делом создаём генератор несущей частоты (Carrier Oscillator), модулятор (modulating oscillator) и возможность задавать параметры MI и HR. Для этого нажимаем Ctrl+1 или Put->Object и в появившееся поле пишем osc~. Объект osc~ является генератором с косинусоидальной функцией, частота которого задаётся через левый вход. Создадим два таких объекта, один из них будет модулятором, а другой генератором несущей. Для связи с внешним миром и возможности задавать параметры создадим таким же образом три объекта inlet~ (входы нашего патча) и один outlet~ (выход). Подпишем входы и генераторы, чтобы было проще. Первый вход FC, второй HR и третий MI. Первый генератор modulating oscillator и второй Carrier Oscillator. Для этого нажмите Ctrl+5 или Put->Comment и пишите в появившемся поле.
Частота модулятора(FM), исходя из выше сказанного, будет равна FC * HR, поэтому первый вход inlet~, которым мы будем задавать FC, надо перемножить со вторым, через который мы будем задавать значение HR, а результат подадим на модулятор. Для этого создадим объект *~, который перемножает сигналы, и подсоединим первый inlet~ к левому входу, а второй к правому, а выход к левому входу osc~.
Примечание: Чтобы соединять объекты нужно навести курсор на выход объекта, пока не появится кружок, нажать левую кнопку мышки и вести, не отпуская к входу другого объекта, и отпустить когда появится кружок.
Далее вычисляем амплитуду модулятора (AM). Для этого перемножим третий объект inlet~, через который будем задавать MI с частотой модулятора(FM). Для этого создадим уже знакомый нам объект *~ и подключим к его левому входу выход верхнего *~, а к правому выход третьего inlet~. В итоге должно получиться примерно следующее.
Чтобы задавать амплитуду модулятора мы перемножим полученное значение амплитуды с сигналом объекта osc~, амплитуда которого изменяется от 0 до 1.
Получится вот что.
И в конце создания основной логики FM-синтеза нужно объединить все полученные вычисления для модуляции генератора несущей частоты. Для этого будем использовать объект +~, который суммирует сигналы. В нашем случае мы суммируем несущую часто-ту(FC) и сигнал модулятора. Создадим объект +~ и подключим к его левому входу выход первого inlet~ (FC), а к правому входу подключим выход объекта *~ при помощи которого мы контролируем амплитуду модулятора. Затем соединим объект +~ к левому входу второго объекта osc~ для его модуляции. А уже выход этого генератора к входу объекта outlet~.
Всё, основная часть готова. Теперь сохраним этот патч для последующего использования его в наших музыкальных проектах под именем FMsynth в папку extra, у меня она находится по адресу D:\Program Files\pd\extra\. Смотря куда, вы установили PureData.
Теперь попробуем извлечь звук из нашего творения. Давайте создадим новый патч как мы это делали ранее, нажав Ctrl+n. В новом патче создадим объект FMsynth, и если вы всё сделали правильно, программа найдёт созданный нами до этого объект. В объекте должно быть три входа и один выход. Если Вы кликните на нём правой кнопкой мышки и нажмёте Open, то откроется созданный вами ранее патч FMsynth.
Далее нам необходимо создать то, через что мы будем задавать значения FC, HR и MI. Для этого вставим в наш проект объекты Number, нажав Ctrl+3 или выбрав его из списка в меню Put. Затем создадим объекты sig~ , который предназначен для того, чтобы преобразовать числовые значения в аудио сигнал. Теперь соединим Number с sig~, а sig~ с входом FC нашего FMsynth. Сделаем также для двух оставшихся входов HR и MI. Должно получиться, что-то вроде этого.
Чтобы звук нашего синтезатора не длился бесконечно долго и для добавления ему некоторых свойств, нам нужна ADSR-огибающая. Для контроля амплитуды синтезатора возьмём объект *~ и подключим к его левому входу сигнал с нашего синтезатора, а к правому объект line~, который генерирует огибающую. Для указания формы огибающей создадим объект envgen. После создания объекта envgen подключим его выход к левому входу line~. А к входу envgen подсоединим объект bang, для этого впишите слово bng в объект бокс или выберете его из списка в меню Put. Объект bang представляет собой кнопку, нажав на которую выдаётся кратковременная команда, т.е. в нашем случае при нажатии на кнопку будет слышен звук. Должно выглядеть примерно так.
И последнее, чтобы слышать звук нам надо включить в проект объект dac~ и подключить к его обоим входам (если нужно стерео) выход последнего объекта *~.
Вот в принципе и всё теперь нажимайте Ctrl+E, чтобы выйти из режима редактирования, измените, значения в объектах Number и жмите на кнопку bang. Должен слышаться звук, если его нет, нажмите Audio ON в меню Media. А дальше экспериментируйте с числовыми значениями, с огибающей и т.д. Как вы видите, получился довольно примитивный, но с экспериментальным звуком синт, очень хорошо подходящий для синтеза ударных. В следующий раз мы усовершенствуем нашу конструкцию.
Удачи в экспериментах. Задавайте вопросы.
Рубрики: Извлечение звука | Комментарии (4) »























07.04.2009 в 06:08
Спасибо за урок =) Раскажыте пожалуйста, как собрать полифонический синтезанор? =)
07.04.2009 в 09:43
Как раз сейчас этим и занимаюсь. На днях продолжу эту тему.
02.02.2011 в 12:19
что за envgen? я не могу найти такое в пд
02.02.2011 в 21:40
А где вы ищете? Просто пишите в поле нового объекта слово envgen и у вас появится поле с огибающей.