Введение в PureData

Автор: | 15.02.2012

Хотите создать свой синтезатор или эффект, но не знаете с чего начать? Не умеете хорошо программировать, или умеете, но нет времени на разработку на C/C++ с нуля? А может, вам нужно просто и быстро создать прототип? Или, вы хотите поиграться со звуком, и возможно, научиться чему-то новому, например, понять синтез с самых его основ? В любом случае, то, что чём я расскажу, может быть вам полезно, интересно, а также стать новым увлечением 🙂

Вступление

Некоторое время назад я начал искать инструмент для быстрого прототипирования синтов и эффектов, удобный и лёгкий в освоении. Пересмотрел множество вариантов (действительно множество, такого многообразия я и не ожидал, когда начинал разбираться в вопросе). В итоге, в финал вышли две среды разработки — SuperCollider и PureData. Оба — бесплатные, кросплатформенные, с активной пользовательской базой. И с совершенно разным подходом к процессу программирования. SuperCollider — объектно-ориентированный язык программирования, в котором патч создаётся как обычная программа, в текстовом виде. Признаться, меня это, как программиста, подкупило. PureData же, напротив, является визуальным языком, где патч задаётся в виде блоков (представляющих объекты, числа и сообщения) и их соединений. На деле же, потыкавшись в SuperCollider’е, я понял, что сделать там что-то сходу, без приличного углубления в документацию, довольно проблематично. Например, в прошлой статье я выкладывал ссылку на патч Hoover для Коллайдера. Попробовал прикрутить к нему MIDI-управление. Это потребовало поисков инфы в сети, я нашёл код, который делал бы примерно то, что мне нужно, но даже прикрутить его так, чтобы всё заработало как я хотел, сходу не получилось. Вывод, который был сделан, — без активного курения мануалов в SuperCollider суваться нет смысла. Да и сам язык, признаться, вовсе не является красивым в моём понимании. В общем, Коллайдер я временно отложил, и взялся за PureData, который оказался на пару порядков интуитивнее и проще. Ну, поехали.

Кратко о главном

Итак, PureData, сокращённо Pd — это среда и язык визуального программирования, изначально созданный для программирования звука (однако, в настоящее время, с помощью дополнительных модулей позволяющий работать и с графикой, и с видео). Пакет кросплатформенный и бесплатный. Разрабатывается он довольно немалым сообществом, а автором ядра языка является Miller S. Puckette (он же автор известного Max/MSP, с которым у Pure Data очень много общего). Pd довольно популярен, его изпользует множество людей, начиная от игровых саунддизайнеров, и заканчивая музыкантами. Патчи, сделанные в PureData, при желании можно использовать как VST в вашем DAW, для этого существуют соответствующие тулзы. Равно как и в самой среде PureData можно использовать VST.

Скачать PureData под вашу платформу можно с официального сайта, например тут. Себе я поставил вариант Pd-extended, включающий в дополнение к ядру некоторое количество дополнительных возможностей.

Установка и настройка

Устанавливаем. Запускаем. Видим перед собой основное окно программы:

Изображение

Проверьте настройки аудио и MIDI в меню Media->Audio settings… и Media->MIDI settings… Для проверки можно выбрать пункт Media->Test Audio and MIDI, и в открывшемся окошке потыкать тип сигнала в разделе TEST TONES. Звук должен быть включен (пункт меню Media->Audio ON).

Основы патчинга

Будем считать, что всё настроено. Поехали. Тыкаем в пункт меню File->New, и открывается пустое окно нового проекта. Первое, что обычно пишут, встречаясь с новым языком программирования — программу «Hello world!». Что-ж, последуем традиции.

Патч в pd состоит из блоков и их соединений, описывая таким образом поток данных. Блоки можно добавлять через меню Put. Есть несколько видов блоков, как то:
* Object (объект, он что-то делает с данными)
* Message (сообщение)
* Number (число, просто число)
* Сomment (комментарий, на функциональность не влияет)

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

Тыкаем на пустом месте проекта (а оно сейчас целиком представляет собой чистый белый лист) правой кнопкой мыши, и в контекстном меню выбираем Help. Открывается окошко со списком доступных нам стандартных объектов:

Изображение

Поищем там то, что нам нужно. Ага, там есть «print«. Отлично!

Добавляем новый Object через меню Put, или прямо с клавиатуры с помощью Ctrl+1. В окошке появляется прямоугольник. Вводим туда имя объекта, который мы хотим создать, в нашем случае это «print«. Теперь кликаем мышкой где-нибудь на пустом месте, и вот, объект создан:

Изображение

Теперь аналогичным образом добавим следующий блок, только на этот раз не Object, а Message. Вводим в него текст, который хотим напечатать, например «Hello cjclub.ru!»:

Изображение

Заметим, что форма наших блоков разная. Это сделано специально, чтобы легко различать их типы. Object — простой прямоугольник, Message — с фигурным правым краем, Number — со скошенным уголком (напоминает перфокарту). Также видно, что блоки имеют некоторое количество маленьких прямоугольничков сверху и снизу. Это — входы (те, что сверху) и выходы (которые снизу).

И вот ответственный момент — подключаем одно к другому. Выход сообщения подключим к входу объекта «print» (кликаем на выходе одного блока, и, не отпуская кнопку, тащим ко входу второго, потом отпускаем). Всё, программа готова:

Изображение

Здесь нужно сказать, что в Pure Data есть два режима работы: режим редактирования, и режим исполнения. Переключаются они через пункт меню Edit->Edit Mode или с клавиатуры по Ctrl+E. Сейчас мы находились в режиме редактирования. Переключимся в режим исполнения. Курсор изменит вид на обычную стрелку, мы потеряем возможность редактировать патч, но получим возможность им управлять. Кликнем мышкой на блоке с сообщениием. Это вызовет посылку сообщения объекту «print«, и наша строчка будет напечатана в консоли:

Изображение

Ура!

Работа со звуком

Делаем простой осциллятор

Но начнём же наконец работать со звуком. Сейчас мы в три приёма создадим терменвокс (ну, почти терменвокc 🙂
Откроем новое окошко, и добавим следующие блоки: Number, Object (сюда вписываем «osc~«) и ещё один Object (вписываем «dac~«). Соединяем последовательно выходы со входами, как показано на картинке:

Изображение

Мы только что создали осциллятор с синусоидальной формой волны (объект «osc~«) и подключили его к выходу саунд-карты (представленному объектом «dac~«, что по-нашему просто ЦАП). Ко входу осциллятора мы подключили число, которое будет задавать рабочую частоту, а выход осциллятора подключили одновременно к двум входам ЦАП (так как у нас по умолчанию 2 стерео канала). Заметим, что имена созданных объектов оканчиваются на тильду, и это неспроста. Объекты с такими именами работают с непрерывными потоками данных, в нашем случае — с аудиосигналом. Объекты же, имена которых не оканчиваются на тильду, работают с единичными командами и параметрами (как, например, «print»). Соответственно, разными бывают и связи — связь по команде или параметру выглядит тонкой линией, а «провод», передающий аудио — толстой.

Теперь проверим, как оно работает. Переходим в режим исполнения, удостоверяемся, что звук включен (Media->Audio ON), кликаем мышкой на блоке с числом, и, не отпуская кнопку, начинаем двигать мышь. Число начинает меняться, его новое значение передаётся осциллятору, который меняет свою рабочую частоту вместе с изменением числа. Двигаем мышью вверх-вниз, и играем на нашем «терменвоксе». Неплохо для начала, да?

Добавляем регулировку громкости

Но вы заметили, что звук слишком громкий? Это потому, что осциллятор генерирует сигнал с максимальной (единичной) амплитудой. Сделаем его потише. Добавим объект с именем «*~» и подключим выход осциллятора через него. Как вы уже наверное догадались по имени этого объекта, он умножает (его имя состоит из звёздочки — знака умножения) аудио сигнал (тильда в конце имени, это признак непрерывных данных). А вот то, на что именно умножает — задаётся или константным параметром (он пишется через пробел после имени объекта), или вторым входом объекта, к которому можно подключить блок Number, чтобы менять громкость в реалтайме. Впишем в первом случае просто число 0.5 (получится деление на два):

Изображение

Во втором случае громкость будет задаваться мышкой (чтобы задавать дробные значения, при движении мышью удерживайте нажатым Shift):

Изображение

Проверим, что у нас получилось. Да, теперь звук действительно стал тише, а во втором случае мы к тому же можем изменять громкость прямо в процессе воспроизведения.

Идём дальше

Ну и, наконец, сделаем совсем круто: будем задавать громкость в децибелах и с ограничением, чтобы не было клиппинга (в Pd единичная громкость эквивалентна 100dB). Создадим Number со значением громкости, кликнем по нему правой кнопкой, выберем Properties, и в настройках укажем минимальное и максимальное значение, например, 10 и 100. Теперь создадим объект «dbtorms», и подадим наше значение ему на вход, а его выход подключим к умножителю. Как следует из его имени, этот объект переводит значение в децибелах в линейное. Не будем слепо доверять ему, и подключим к его выходу ещё один Number — для контроля. Вот такая схема у нас получилась:

Изображение

Проверяем — работает. Указанные пределы громкости не дают звуку зашкалить за единицу, в контрольном блоке отображается текущее линейное значение громкости.

Level up!

Всё, с синусом наигрались. Сделаем-ка что-то повеселее. Например, попробуем соорудить Supersaw! Ну хорошо, признаемся сразу, что суперпилу с ходу не сделаем. Это будет детюнингованная пила, состоящая из семи разнесённых по частоте пил. Для этого нам будет нужно семь источников пилообразного сигнала. Смотрим в списке объектов, и находим «phasor~» — то, что нужно. Ну а что делать дальше, мы уже знаем. Создаём Number, который будет задавать частоту, к его выходу подключаем шесть объектов, каждый из которых будет сдвигать частоту вниз или вверх на заранее заданное нами значение в Герцах. Создаём семь генераторов пил, и подключаем к ним наше управление частотой. К центральной пиле подключим исходную частоту. Выходы всех семи осцилляторов соединим в один сигнал, сделаем потише, чтобы избежать клиппинга, ну и для полноты картины добавим фильтры низких и высоких частот («lop~» и «hip~» соответственно). Ну а итоговый сигнал — на саунд-карту (к входу объекта «dac~«).

Изображение

Проверяем… Йэс! Получили детюнингованную пилу, сделанную своими руками. Осталось прикрутить MIDI-управление, блок ADSR, и наш первый синтезатор будет готов. Но это уже за рамками данной статьи.

Полезные ссылки

puredata.info — официальный сайт.
puredata.hurleur.com — хороший форум по Pd.
pd-tutorial.com — имя сайта говорит за себя.
crca.ucsd.edu/~msp/techniques.htm — книга о Pd от самого Miller S. Puckette.
en.flossmanuals.net/pure-data/index — инфа, туториалы.
pattr.ru — русский сайт о программировании в Pd и Max. Здесь, например, можно скачать менеджер пресетов для Pd.

© Rio FX