Создаём FM-синтезатор сами (часть 2)
15.04.2009 от admin
1. Полифонический синтезатор.
В таких программах как SynthEdit, SynthMaker, Reaktor уже имеются полифонические объекты и сделать синтезатор в них не составит труда. В MAX/MSP существует такой объект как poly~, который как раз и превращает наш моно синтезатор в полифонический (если интересно пишите, я расскажу как). А вот в PD к сожалению всё намного сложнее, там нет таких объектов и приходиться выкручиваться.
Если у вас PD-extended, то можно обойтись малой кровью, так как хорошие люди уже попытались создать патчи для замены объекта poly~ в PD. Этот объект nqpoly4 и находится он в папке \pd\extra\nqpoly4\ но, к сожалению, объект этот оптимизирован для синтезатора созданного автором и с нашем синтом работать не будет. Поэтому мне пришлось, немного переделать объект для работы с нашим творением. Назвал я его недолго думая [poly~]
Итак, начнём. Для начала создайте папку poly в папке extra и обязательно укажите эту папку в настройках PD. Для этого откройте в PD меню File->Path и в открывшемся окне нажав кнопку New, добавьте вашу папку. В эту паку распакуйте файлы из скачанного архива.
Теперь немного исправим синтезатор, созданный на прошлом уроке. Добавим объект [inlet] и [unpack] с аргументами f f (функцию этого объекта я объясню ниже). Выход [inlet] соединим с входом [unpack f f]. Левый выход [unpack f f] с входом объекта [Number] в котором мы задаём несущую частоту, а правых выход с входом объекта [envgen]. К Number в котором задаём harmonicity ratio (HR) подключаем объект receive для этого в поле объекта пишем r или receive и аргумент, в нашем случае аргумент hr (получится [r hr] или [receive hr]). К Number в котором задаём modulation index (MI) подключаем такой же объект, но с аргументом mi (будет [r mi] или [receive mi]). Объект [receive] подает на выход любое сообщение (число, текст, список), полученное от объекта [send], имеющего тот же аргумент. Проще говоря мы сможем задавать значения HR и MI в любом другом месте с помощью объектов [s hr] и [s mi]. Теперь для большей гибкости уберём объект [dac~] и поставим вместо него два выхода [outlet~]. Должно у вас получиться, так как на рисунке.
Сохраняем наш исправленный патч (я назвал его osc_my) и не забудьте указать папку где он находится в настройках Path…, чтобы PD смог его найти. И вообще делайте так всегда, когда создаёте какой-либо объект или патч, который будете использовать в других патчах.
Вот собственно мы подошли к самому главному к полифонии. Создадим новый патч и вставим в него объект [poly~] с тремя аргументами. Первый аргумент это количество голосов. Во втором аргументе указана организация голосов, если равен 0, то распределения голосов не происходит если отличный от 0, то при нехватке свободных голосов объект будет заимствовать голос первой удерживаемой ноты (на этом в принципе пока не стоит заморачиваться). В качестве третьего аргумента указываем имя нашего синтезатора в моём случае osc_my. В итоге если вы хотите получить 16-голосный синтезатор объект будет выглядеть так [poly~ 16 0 osc_my].
Примечание: Принцип работы объекта [nqpoly4] и основанного на нём [poly~] для PD состоит в том, что входной сигнал клонируется на количество голосов, а потом объединяется. В принципе это можно сделать и вручную, но согласитесь, если голосов больше 5 это ужасно утомительно.
Для того чтобы появился звук, как мы помним нам надо задать значения несущей частоты, HR, MI и запустить ADSR. Изменять HR и MI нам поможет ранее упоминавшийся объект [send], создадим два объекта Number и подключим их к объектам [s hr] и [s mi].
Теперь меняя значение здесь, оно будет меняться в нашем синтезаторе. Про несущую частоту мы поговорим подробнее. Так как именно она задаёт тональность звука нашего инструмента, то именно её мы будем менять посредством midi-клавиатуры. И тут мы плавно переходим ко второй задаче – подключение midi-устройства.
2. Подключение midi-устройства.
Для взаимодействия с midi в MAX/MSP и Pure Data существует объект [notein]. Этот объект выдаёт на выход высоту тона (pitch), силу нажатия (velocity) и номер канал. Ваше миди устройство вы можете выбрать в меню Media-> MIDI settings-> input device 1 (по умолчанию стоит none).
Итак, создаём объект [notein], использовать мы будем только первый и второй выходы т.е. pitch и velocity. Но как, скажите вы использовать информацию о высоте тона для извлечения звука, ведь нам нужно менять частоту. А очень просто, в PD, как и в максе есть очень нужный объект [mtof], который преобразует значение высоты тона в частоту. Соединяем левый выход [notein] с входом [mtof]. Информацию о силе нажатия мы будем использовать для запуска ADSR т.e. нам нужно чтобы, когда клавиша нажата звук был, а при отпускании звук пропадал. Для этого нам нужно разделить значение velocity на 127, используя объект [/].
Чтобы пропустить эти сигналы через всю систему создания полифонии и довести до синтезатора, необходимо пустить их по одному «проводу». Для этого упакуем сигналы с помощью объекта [pack] с аргументами f f. Этот объект преобразует сообщения в список т.е. он принимает сообщения, запоминает и подает их в виде списка на выход. Команда <bang> или сообщение, полученное на левый вход, выбрасывает сформированный список. А когда сигнал дойдёт до нашего синтезатора, мы его распакуем объектом [unpack] на выходе которого получим нужные нам несущую частоту и сигнал для запуска ADSR. И напоследок подключим к выходу объекта [poly~] уже известный нам объект [dac~]. Можно сохранить этот патч назвав его, например polysynth. Должно выглядеть так.
Теперь давайте разложим по пунктам всё выше сделанное.
1. Миди сообщение преобразуется в частоту и сигнал нажатия/отпускания клавиши.
2. Всё это упаковывается и подаётся в объект [poly~].
3. В объекте [poly~] сигнал размножается на количество голосов указанных в аргументе объекта.
4. С выхода объекта выходит сигнал уже не с одного синтезатора, а с многих.
5. Регулировка параметров синтезатора осуществляется с помощью [Number] в основном патче.
Вот в принципе и всё. Если кто что понял хорошо. Если не понял, то задавайте вопросы. Я не учитель и объясняю, как могу. Более подробно описание каждого объекта на русском смотрите на.
Нужные файлы:
Архив с объектом [poly~]. poly.rar
Мой синтезатор для примера. polysynth.rar
Распаковывайте в папку extra и не забудьте указать эти папки в настройках программы.
Рубрики: Извлечение звука | Комментарии (4) »















16.04.2009 в 04:12
Огромное спасибо! Очень поучительно =)Скажите,о чём будет следующий урок?
16.04.2009 в 13:50
Пока сам не знаю. Если есть пожелания говорите. Может быть напишу что нибудь про Synth Maker или Max/Msp. Готовых уроков нет, пишу по мере возникновения интереса. Но повторюсь если есть пожелания, то если знаю расскажу.
16.04.2009 в 16:46
По Max/Msp очень интересно было бы с понятием дела научиться собирать секвенсор, вообще по максу очень мало информации на русском языке и поэтому очень много вопросов =)
17.04.2009 в 08:50
Хорошо, значит следующий будет секвенсор