Чуть-чуть дополнений и терминологии.
В предыдущей статье мы познакомились с базовыми математическими операторами и освежили в памяти принципы организации цифрового звука. Так же там я указал, что суть соединений в PureData — передача сообщений, сигналов и импульсов. Тут стоит прояснить один момент: на самом деле импульс — частный случай сообщения. Передача импульса означает передачу единицы, чтобы в этом убедиться, соедините [bang] и numberBox и посмотрите, что получится. По общепринятой терминологии, употребляемой в литературе и справке по библиотекам, числовые сообщения называются скалярами, а сигналы — векторами.
Пожалуй, я тоже буду ее придерживаться. Приступим.
Сигналы и сигнальные объекты.
Сигналы — это данные, предназначенные для вывода на звуковые устройства. Как нетрудно догадаться, сигнальные объекты — инструменты для генерации и обработки сигналов.
В PureData сигнальные объекты определены постфиксом [~], например, [osc~], [phazor~], [+~]. Так же в коде входы и выходы, получающие и отправляющие сигналы, и соответствующие соединения выделены подсветкой. Сигнальный выход нельзя соединить со скалярам и, за редким исключением, наоборот. Познакомимся с этими объектами поближе.
Простейший синтезатор и первый GUI
Объект, который очень часто применяется в патчах, и без которого не обходится ни один генератор — [osc~]. На левый вход он принимает значение частоты. Несмотря на то, что он подсвечен, сюда вполне можно передать число. Однако, сейчас звука мы не услышим, для этого нужно отправить сигнал на звуковую карту. Вывод задается объектом [dac~].Сделайте звук потише, потому что будет достаточно громко. Левый вход — левый канал, правый, соответственно — правый. Мы получили простейший синтезатор.
Теперь прикрутим сюда простенькую математику. Для начала приделаем регулятор громкости. Исходя из формулы y=A*sin(x), можно заключить, что изменения амплитуды можно добиться с помощью операции умножения. Для этого достаточно домножить сигнал на некоторое число. Для этого используем объект [*~]. Все арифметические операции для волн можно получить, дописав к символу скалярного оператора постфикс "~". Теперь соединим осциллятор с объектом умножения и добавим numberBox, ограничив его в промежутке [0, 1], это можно сделать через свойства. Отправим результат умножения на выход и заблокируем патч. И, зажав шифт, потаскаем мышкой число в numberBox'e.
Работает, но неудобно. Поэтому найдем альтернативу.
Создадим объекты [vslider] и [knob]. Красота? Красота. Иметь фейдер и потенциометр куда практичней, чем коробочку с числами. Ограничим их через «свойства» в [0, 1]. И попробуем подключить вместо nuberBox'a сначала один объект, потом другой.
Как видите, разницы большой нет, и что использовать — зависит лишь от вашего вкуса и желания.
В следующем уроке мы займемся аддитивным синтезом, и поуправляем огибающими.
Автор: RoSenMann