Трек для программиста
От звуковой волны к отсчётам в памяти, чтению файлов и обработке на C++ и JUCE. Маршрут объясняет масштаб чисел, устройство буферов, расчёт модуляции и правила кода в аудиопотоке.
11 этапов · 41 элемент
- Статья
- Раздел статьи
- По желанию
Первое знакомство со звуком
Начните с короткого обзора: послушайте частоту, формы волн, огибающую и модуляцию; познакомьтесь со слухом, цифровой записью и файлами. Затем переходите к подробным материалам маршрута.
Сигнал и обозначения
Разберите частоту, амплитуду, фазу и переход от звука к напряжению. Если формулы незнакомы, начните с математического справочника. Раздел о комплексных числах показывает, как амплитуда и фаза синусоиды хранятся одним числом.
Отсчёты и буферы
Проследите дискретизацию и квантование, затем разберите шкалу уровня, каналы, кадры и расположение отсчётов в памяти.
Байты и форматы файлов
Прочитайте целочисленный PCM и посмотрите, как при обработке растёт длина слова и почему ошибки округления накапливаются; по желанию разберите, какой дизер добавить перед окончательным округлением. Затем разберите чтение WAV по чанкам и сравните способы сжатия. Перед MP3 познакомьтесь с частотной маскировкой; по желанию сначала разберите критические полосы, на которые опирается её модель.
- Целочисленный PCM: байты, знак и перевод во float
- Рост разрядности: от 16 бит CD к 24 битам и float в DAW
- Дизеринг и формирование шума: как понизить разрядность без искаженийRPDF и TPDFпо желанию
- Устройство WAV-файла: RIFF, чанки, fmt и data
- Психоакустика: как слух воспринимает звукКритические полосыпо желанию
- Психоакустика: как слух воспринимает звукЧастотная маскировка
- Форматы сжатия звука: AIFF, FLAC и MP3
Модуляция и обработка
Начните с пути сигнала в DAW: где на дорожке стоит плагин и почему порядок блоков меняет результат. Затем настройте уровни источников и сложите их с запасом до перегрузки; по желанию посмотрите, как сумма с короткой задержкой даёт гребенчатую фильтрацию. После этого постройте LFO, примените его к усилению в тремоло и подготовьте белый и розовый шум для синтезатора. Затем посмотрите, как плагин смешивает dry и wet и выключает обработку без сдвига во времени и щелчка.
- Первое знакомство с DAW: дорожки, MIDI и звукПуть сигнала
- Микширование сигналов: усиление, фаза и запас уровня
- Звук в пространстве: панорама, задержка, реверберация и мид-сайдМоносовместимость и короткая задержкапо желанию
- LFO: низкочастотный генератор и модуляция
- Тремоло: глубина модуляции и усиление
- Белый и розовый шум: спектр и генерация
- Dry/wet и bypass: исходный и обработанный сигнал в плагине
Синтезатор
По желанию начните с сообщений MIDI и равномерной темперации: что приходит в инструмент при нажатии клавиши и как полутоны связаны с частотой. Затем соберите источники одного голоса: два осциллятора с отдельными фазами, PolyBLEP против алиасинга, расстройку в центах, саб-осциллятор, шум и микшер с запасом до 0 dBFS. После этого придайте ноте форму во времени: огибающая ADSR как машина состояний по отсчётам, VCA и защита от щелчков на краях ноты. Затем ослабьте высокие частоты суммы источников: однополюсный фильтр нижних частот после микшера, коэффициент из частоты среза, постоянная времени и реакция на скачок. В конце соберите части в голос: параметры отдельно от состояния, рендер ноты в буфер JUCE и запись WAV с проверкой пика, длины и повторяемости.
- Первое знакомство с DAW: дорожки, MIDI и звукMIDI и инструментпо желанию
- Теория музыки: ноты, ритм и гармонияПолутоны и интервалыпо желанию
- Осцилляторы синтезатора: формы, расстройка и саб-осциллятор
- Огибающая ADSR и VCA: как нота начинается и затихает
- Однополюсный фильтр нижних частот
- Голос синтезатора: сборка и рендер ноты в WAV
Спектр
Разберите, как по отсчётам вычисляют спектр: сравнение с пробной синусоидой, дискретное преобразование Фурье, бины и разрешение по частоте, утечку и окно Ханна, быстрое преобразование Фурье. Статья заканчивается анализатором спектра на JUCE, который передаёт кадры из аудиопотока в интерфейс через очередь.
Фильтры
Перейдите от однополюсного фильтра к общему описанию линейных фильтров: импульсная характеристика и свёртка, фильтры с конечной и бесконечной импульсной характеристикой, частотная характеристика, передаточная функция с нулями и полюсами, фазовая и групповая задержка. Затем разберите биквад: формулы RBJ, резонанс и добротность, прямую и транспонированную формы и то, почему при быстрой модуляции частоты среза нужен фильтр переменных состояний. В конце сравните собственный класс Biquad с фильтрами juce::dsp.
Задержка
Разберите линию задержки, на которой строятся эхо, хорус и реверберация: перевод времени в отсчёты, кольцевой буфер с индексом по маске и его подготовку вне processBlock, эхо с прямой и обратной связью и время спада повторов, гребенчатый фильтр при короткой задержке, дробную задержку с линейной интерполяцией и плавное изменение времени без щелчков. В конце сравните собственный класс с juce::dsp::DelayLine.
Динамика и нелинейность
По желанию начните с компрессора: как он вычисляет ослабление по уровню сигнала и сглаживает его атакой и восстановлением. Затем разберите обработку, которая меняет саму форму волны: передаточную кривую без памяти, жёсткое и мягкое ограничение, входное усиление и компенсацию уровня, нечётные и чётные гармоники, постоянную составляющую и фильтры до и после кривой. Статья заканчивается сатуратором на C++ и цепочкой juce::dsp с WaveShaper. Затем выясните, почему та же кривая в цифровой обработке даёт отражения выше fs/2, как отличить их от интермодуляции тестом двумя тонами 19 и 20 кГц и как их ослабляют передискретизацией с juce::dsp::Oversampling и методом антипроизводной.
C++ для аудио
Начните с языка: сборка, типы, функции, ссылки и указатели, затем классы и макросы JUCE, шаблоны и типы стандартной библиотеки: std::optional, контейнеры, лямбды и std::function. По желанию посмотрите, как по паттерну «посетитель» устроено сохранение параметров в JSON. Потом разберите, кто создаёт и удаляет объекты плагина JUCE и как процессор получает параметры во владение. Затем перейдите к аудиопотоку: почему в processBlock не выделяют память, где её готовить, как проверить это санитайзером и как обмениваться данными с интерфейсом.
- Основы C++ для JUCE: сборка, типы, функции и указателипо желанию
- C++ в плагине: классы, конструкторы и время жизнипо желанию
- C++ в плагине: шаблоны и сериализация параметровпо желанию
- Стандартная библиотека C++ в плагине: optional, контейнеры, лямбды и std::functionпо желанию
- Паттерны проектирования в JUCEпо желанию
- Кто владеет объектом: std::make_unique и время жизни в плагине JUCE
- C++ в аудиопотоке: выделение памяти, общие объекты и инструменты JUCE