О звуке простыми словами42Производители Hi-Fi.
Истории и интервью111Репортажи с заводов65Репортажи с Hi-Fi выставок69"Сделай сам"44Готовые проекты Аудиомании42Пресса об Аудиомании50Видео494Фотогалерея100Интересное о звуке804Новости мира Hi-Fi2545Музыкальные и кинообзоры616Глоссарий
Библиотеки для цифровой обработки сигналов на C++
Мы уже рассказывали о книгах, которые помогут взять старт в цифровой обработке сигналов. Сегодня продолжим тему и поговорим о практических ресурсах.
Подобрали три библиотеки на C++ для звукового синтеза.
Gamma
Это — кроссплатформенная библиотека для синтеза и фильтрации цифровых сигналов. Её разработал инженер и композитор Лэнс Патнем, который сегодня занимает должность научного сотрудника в Голдсмитском колледже. Он также является автором серии расширений для фреймворка SuperCollider, позволяющего проводить аудиосинтез в реальном времени [подробнее об инструменте].
В состав Gamma входят разного рода математические функции и генераторы последовательностей. Особые классы реализуют аккумуляторы фаз для значений с фиксированной и плавающей запятой, фильтры с бесконечной импульсной характеристикой (БИХ-фильтры), а также всепропускающие фильтры, которые находят применение в эквалайзерах.
Изначально библиотека была разработана для задач генерации звука в реальном времени, таких как музыкальное программирование. Однако в Gamma алгоритмы обработки данных не зависят от их типа, что позволяет работать как со звуком, так и графикой. Сам Лэнс Патнем применил Gamma в эмбиент-роликах «Adrift», «Wrapture» и «S Phase», где сгенерировал музыкальный и визуальный ряды при помощи рекурсивного алгоритма умножения матриц.
Если вас заинтересовал этот инструмент, его исходники есть в репозитории на GitHub. На официальном сайте проекта — документация с описанием всех доступных функций и объектов, а также руководство по быстрому старту.
Madronalib
Это — открытый фреймворк, ориентированный на разработку приложений для обработки сигналов от компании Madrona Labs, проектирующей цифровые инструменты для музыкантов. Например, в их портфолио есть полумодульный программный синтезатор, процессор эффектов и даже физическое устройство — музыкальный контроллер, который, в отличие от MIDI-клавиатуры, регистрирует силу нажатия (прямо как «Континуум» Липпольда Хакена).
Инженеры Madronalib сделали упор на скорость обработки сигналов. Они реализовали SIMD-инструкции для тригонометрических и трансцендентных функций — sin, cos,log и exp — которые показывают большую производительность, по сравнению с решениями в нативных математических библиотеках C++.
Фреймворк поддерживает SSE для Intel и NEON для Apple Silicon, а также многопроцессорную обработку. В этом режиме стоит уделить внимание разделению памяти — менеджмент ресурсов позволит воспроизводить звук без потерь.
Исходный код Madronalib вы можете найти на GitHub. Он распространяется по лицензии MIT, поэтому его можно свободно использовать в своих проектах (в том числе коммерческих). В том же репозитории есть примеры инструментов, реализованных с помощью этого фреймворка — например, простой плагин для обработки звука VST3, способный генерировать синусоиды.
Q
Еще одна кроссплатформенная библиотека для цифровой обработки сигналов в нашей подборке. Она получила свое название в честь показателя добротности колебательного контура, который определяет ширину резонанса. Её написал инженер Джоэл Де Гузман из Cycfi Research — компании, занимающейся разработкой опенсорсных музыкальных инструментов (как программных, так и физических).
Q — «легкое» решение, которое делает упор на переиспользуемые функциональные объекты и подходит для программирования микроконтроллеров. В его основе лежат две «подбиблиотеки» — q_lib и q_io. Первая отвечает за обработку сигналов, а вторая — за прием и вывод звука (в том числе с цифрового и аналогового MIDI-контроллера). Последняя построена на базе сторонних открытых библиотек portaudio и portmidi.
Q уже используют для решения задач, связанных с выделением основного тона и оценкой динамических характеристик звучания музыкальных инструментов. Чтобы познакомиться с библиотекой поближе, вы можете обратиться к официальной документации, где проведен разбор общей структуры утилиты, даны инструкции по настройке и описан классический пример «Hello World!». Там реализована простая функция, которая на вход получает WAV-файл и воспроизводит его с задержкой.