Sound
29 December 2010

Native Instruments Reaktor: синтез пилообразных, квадратных, треугольных и синусоидальных волн

intro

Статья посвящена синтезу четырех основных звуковых волн: пилообразной (saw), квадратной (square), треугольной (triangle) и синусоидальной (sine). Для работы понадобится программная среда обработки звука Reaktor от компании Native Instruments. Демо версию можно скачать на официальном сайте Native Instruments (ограничение работы — 30 минут, сохранение проекта отключено). Информация будет полезна не только обладателям этого софта, но и тем, кто интересуется программированием и обработкой звука в целом. Подкатом прилично скриншотов, осторожно, трафик!

Теория


Предполагается, что прежде чем приступить к работе, вы ознакомились с мануалом, основными модулями и интерфейсом Reaktor'а. В программе возможны два уровня работы: Primary Level (первичный) и Core Level (внутренний). Отличия говорят сами за себя — на уровне Primary все решения уже готовы (генераторы волн, огибающие амплитуды, эффекты и т.д.), в то время как на уровне Core есть возможность создать все самому. Core Level — это свой собственный язык программирования, созданный компанией разработчиков NI. В нем присутствуют такие же операторы, циклы и переменные как и в других средах программирования.

Мы знаем, что цифровой звук отличается от аналогового. Аналоговый сигнал является непрерывным в отличие от цифрового, поэтому для преобразования первого во второй применяется такое понятие, как частота сэмплирования SR.R (Sample Rate). Частота сэмплирования (или частота дискретизации) — это количество сэмплов в секунду, требуемое для преобразования непрерывного сигнала в дискретный. Соответственно чем больше частота сэмплирования, тем более богат спектр дискретного сигнала. В Reaktor'е для удобства работы существует еще такое понятие как событие частоты сэмплирования SR.C (Sample Rate Clock): SR.C = 1/SR.R.

Если у нас стандартная частота сэмплирования 44100 Hz, это значит, что событие частоты сэмплирования происходит 44100 раз за 1 секунду. Таким образом Reaktor распознает два уровня сигналов — аудио сигнал (Audio) и сигнал события (Event). С первым все понятно, а второй тип сигнала можно сравнить со вспышкой, которая происходит при запуске фейерверка. Сигнал события никак не звучит — это просто цифра со значением в определенный промежуток времени, поэтому и SR.C это событие со значением 0.

Пилообразная волна


Синтез в Reaktor'е проще всего начать с пилообразной волны (saw). Дело в том, что ее фаза является основополагающей для построения фаз всех других волн.

saw

Из рисунка понятно, что из себя представляет звуковая волна в целом и она характеризуется двумя основными показателями — фаза и амплитуда. Это некая функция с повторяющейся цикличностью (фаза с определенной частотой), которая в данном случае принимает значения от 0 до 1 (амплитуда). Частота фазы может быть выражена как в Герцах, так и в высоте звука (Pitch). Высота звука измеряется в тонах и принимает значения от 0 до 127. Например, ноте С (до) на 3ей октаве соответствует тон 48, что приблизительно равно 130,8137 Гц. Амплитуда также может быть представлена как в виде числового значения (1), так и в Децибелах (0 dB). На практике нам надо чтобы каждый раз при событии частоты сэмплирования мы получали какое-то значение от 0 до 1 в соответствии с функцией, изображенной на рисунке. Использование готовых решений в Reaktor'е строго карается неписаными правилами.

scheme1

scheme2

scheme3

* — для работы я использовал новую версию Reaktor'а, так как стал обладателем новой лицензионной бета-версии после покупки старой, но по интерфейсу уровней Core и Primary она ничем не отличается от предыдущей.

Дла начала нам нужно создать новый проект (File — New Ensemble). Скриншоты представлены в соответствии с глубиной открытого уровня проекта. На первом скриншоте показан главный инструмент, подключенный к выходам аудиокарты (в старой версии он выглядит немного иначе). На втором скриншоте уже показаны внутренности главного инструмента (Primary уровень). Все модули могут быть вызваны правой кнопкой мыши. Модули Note Pitch и Gate, находящиеся в разделе Built-in Module — MIDI In, отвечают за поступление MIDI-сигнала с клавиатуры или MIDI-контроллера, т.е. Note Pitch получает значения от 0 до 127 и отвечает за тон высоты звука, а Gate — от 0 до 1 и отвечает за амплитуду звука (на клавиатуре как правило от 0 до 0.6299). Внутри модуля Saw Waveform находится непрерывная фаза пилообразной волны, поэтому мы используем модуль Multiply (умножение) в совокупности с модулем Gate, чтобы сигнал был под контролем MIDI-устройства, а не звучал непрерывно. Третий скриншот самый интересный, т.к. именно здесь происходит реализация фазы волны. Первая часть структуры — это преобразование высоты звука в частоту фазы. Вычисление производится по следующей формуле:

formula1

Рассмотрим структуру на конкретном примере. При высоте звука 48 в наш цикл, который начинается с события частоты сэмплирования SR.C, поступают следующие данные: F = 130,8128, 2/SR.R = 0,000045351 (при стандартной частоте сэмплирования 441000 Hz) — Частота Найквиста (частота, равная половине частоты сэмплирования), F * Частота Найквиста = 0,0059325.

Если значение, поступающее в модуль суммы (+) превышает единицу, оно направляется в модуль разницы, где из него вычитается единица. Таким образом наша функция принимает строгий диапазон от 0 до 1. После этого значение сохраняется в модуле памяти (Write) и снова поступает в модуль чтения памяти (Read), где при очередном событии частоты сэмплирования суммируется с предыдущим значением. Если подключить к выходу Core модуля (Phase) осциллограф (модуль Micro Scope) мы получим точно такую же функцию, как на графике пилообразной волны. При следующем цикле имеем: 0,0059325 + 0,0059325 = 0,011865, 0,011865 + 0,0059325 = 0,0177975 и т.д.

* — важное замечание: в статье опускается вопрос анстиалиасинга (сглаживания звука), т.к. это тема отдельных обсуждений

Квадратная волна


pulse

В отличие от пилообразной квадратная волна принимает значения равные только 0 или 1. Не сложно догадаться, как синтезировать эту волну, используя фазу предыдущей: если значение фазы пилообразной волны больше 0.5, то значение фазы квадратной волны равно 1, если меньше — 0.

scheme4

scheme5

Треугольная волна


triangle

Чтобы преобразовать фазу пилообразной волны в треугольную, необходимо преобразовать первую, чтобы она принимала отрицательные значения, а после этого взять ее модуль. Все достаточно просто — мы отнимаем от значений фазы пилообразной волны 0.5, получая диапазон значений от -0.5 до 0.5, берем абсолютное значение этого диапазона и умножаем на 2, возвращаясь к диапазону значений от 0 до 1. Преобразования происходят внутри все того же Core модуля Square.

scheme6

Синусоидальная волна


sine

С синтезом синусоидальной волны дела обстоят немного сложнее. Дело в том, что функция синуса является непрерывной и периодической с основным периодом 2π, в отличие от других функций. Одним из решений является разложение функции синуса при помощи Ряда Тейлора, т.е. ее преобразование в бесконечную сумму степенных функций. Выглядит это следующим образом:

formula2

Преобразовывая фазу пилообразной волны в 2π и смещая функцию для преобразования, получаем в Reaktor'е следующую картину:

scheme7

На этой схеме суммы 6, 120, 5040 и 362880 — это факториалы чисел 3!, 5!, 7! и 9! соответственно, x — это используемая для удобства шина Quick Bus (добавляется через вызов дополнительного меню), а числовые преобразования в конце формулы — это преобразование в функции в привычный нам диапазон от 0 до 1.

Использованные ресурсы

Wikipedia:

Waveform
Высота звука
Частота
Амплитуда
Частота Найквиста
Ряд Тейлора

Другие ресурсы (в том числе мои проекты) — на английском:

Reaktor For You Archive (мой архив статей для Reaktor) * — доступны только пользователям лицензионных версий

Мои темы на официальном форуме Reaktor'а:

Уроки для начинающих
Создание звуковых волн на уровне Core

Дополнительный ресурс:

Reaktor Community в России

+5
5.1k 20
Comments 1
Top of the day