Трек для программиста

От звуковой волны к отсчётам в памяти, чтению файлов и обработке на C++ и JUCE. Маршрут объясняет масштаб чисел, устройство буферов, расчёт модуляции и правила кода в аудиопотоке.

11 этапов · 41 элемент

  1. Первое знакомство со звуком

    Начните с короткого обзора: послушайте частоту, формы волн, огибающую и модуляцию; познакомьтесь со слухом, цифровой записью и файлами. Затем переходите к подробным материалам маршрута.

  2. Сигнал и обозначения

    Разберите частоту, амплитуду, фазу и переход от звука к напряжению. Если формулы незнакомы, начните с математического справочника. Раздел о комплексных числах показывает, как амплитуда и фаза синусоиды хранятся одним числом.

  3. Отсчёты и буферы

    Проследите дискретизацию и квантование, затем разберите шкалу уровня, каналы, кадры и расположение отсчётов в памяти.

  4. Байты и форматы файлов

    Прочитайте целочисленный PCM и посмотрите, как при обработке растёт длина слова и почему ошибки округления накапливаются; по желанию разберите, какой дизер добавить перед окончательным округлением. Затем разберите чтение WAV по чанкам и сравните способы сжатия. Перед MP3 познакомьтесь с частотной маскировкой; по желанию сначала разберите критические полосы, на которые опирается её модель.

  5. Модуляция и обработка

    Начните с пути сигнала в DAW: где на дорожке стоит плагин и почему порядок блоков меняет результат. Затем настройте уровни источников и сложите их с запасом до перегрузки; по желанию посмотрите, как сумма с короткой задержкой даёт гребенчатую фильтрацию. После этого постройте LFO, примените его к усилению в тремоло и подготовьте белый и розовый шум для синтезатора. Затем посмотрите, как плагин смешивает dry и wet и выключает обработку без сдвига во времени и щелчка.

  6. Синтезатор

    По желанию начните с сообщений MIDI и равномерной темперации: что приходит в инструмент при нажатии клавиши и как полутоны связаны с частотой. Затем соберите источники одного голоса: два осциллятора с отдельными фазами, PolyBLEP против алиасинга, расстройку в центах, саб-осциллятор, шум и микшер с запасом до 0 dBFS. После этого придайте ноте форму во времени: огибающая ADSR как машина состояний по отсчётам, VCA и защита от щелчков на краях ноты. Затем ослабьте высокие частоты суммы источников: однополюсный фильтр нижних частот после микшера, коэффициент из частоты среза, постоянная времени и реакция на скачок. В конце соберите части в голос: параметры отдельно от состояния, рендер ноты в буфер JUCE и запись WAV с проверкой пика, длины и повторяемости.

  7. Спектр

    Разберите, как по отсчётам вычисляют спектр: сравнение с пробной синусоидой, дискретное преобразование Фурье, бины и разрешение по частоте, утечку и окно Ханна, быстрое преобразование Фурье. Статья заканчивается анализатором спектра на JUCE, который передаёт кадры из аудиопотока в интерфейс через очередь.

  8. Фильтры

    Перейдите от однополюсного фильтра к общему описанию линейных фильтров: импульсная характеристика и свёртка, фильтры с конечной и бесконечной импульсной характеристикой, частотная характеристика, передаточная функция с нулями и полюсами, фазовая и групповая задержка. Затем разберите биквад: формулы RBJ, резонанс и добротность, прямую и транспонированную формы и то, почему при быстрой модуляции частоты среза нужен фильтр переменных состояний. В конце сравните собственный класс Biquad с фильтрами juce::dsp.

  9. Задержка

    Разберите линию задержки, на которой строятся эхо, хорус и реверберация: перевод времени в отсчёты, кольцевой буфер с индексом по маске и его подготовку вне processBlock, эхо с прямой и обратной связью и время спада повторов, гребенчатый фильтр при короткой задержке, дробную задержку с линейной интерполяцией и плавное изменение времени без щелчков. В конце сравните собственный класс с juce::dsp::DelayLine.

  10. Динамика и нелинейность

    По желанию начните с компрессора: как он вычисляет ослабление по уровню сигнала и сглаживает его атакой и восстановлением. Затем разберите обработку, которая меняет саму форму волны: передаточную кривую без памяти, жёсткое и мягкое ограничение, входное усиление и компенсацию уровня, нечётные и чётные гармоники, постоянную составляющую и фильтры до и после кривой. Статья заканчивается сатуратором на C++ и цепочкой juce::dsp с WaveShaper. Затем выясните, почему та же кривая в цифровой обработке даёт отражения выше fs/2, как отличить их от интермодуляции тестом двумя тонами 19 и 20 кГц и как их ослабляют передискретизацией с juce::dsp::Oversampling и методом антипроизводной.

  11. C++ для аудио

    Начните с языка: сборка, типы, функции, ссылки и указатели, затем классы и макросы JUCE, шаблоны и типы стандартной библиотеки: std::optional, контейнеры, лямбды и std::function. По желанию посмотрите, как по паттерну «посетитель» устроено сохранение параметров в JSON. Потом разберите, кто создаёт и удаляет объекты плагина JUCE и как процессор получает параметры во владение. Затем перейдите к аудиопотоку: почему в processBlock не выделяют память, где её готовить, как проверить это санитайзером и как обмениваться данными с интерфейсом.

Поиск

Ищем по названиям, тексту статей и английским терминам. Например: «частота дискретизации», «Nyquist», «аналоговый сигнал».