У эффекта в DAW обычно есть два органа управления, которые решают, сколько обработки попадёт на выход. Регулятор dry/wet (dry/wet, mix)регулятор dry/wet (dry/wet, mix) — Параметр эффекта, задающий соотношение исходного и обработанного сигнала на выходе: 0 % — только dry, 100 % — только wet. Коэффициенты промежуточных положений зависят от закона смешивания. смешивает исходный звук с обработанным. Кнопка bypass выключает эффект целиком. Выключенный эффект с задержкой (latency)задержка (latency) — Время прохождения сигнала через тракт от входа до выхода. Включает буферизацию, драйвер, преобразователи и алгоритмы; длительность одного блока не равна полной задержке. может сдвинуть дорожку во времени, а резкое переключение даёт щелчок. Оба случая разобраны ниже вместе с законами смешивания и примером на C++ и JUCE.
Исходный и обработанный сигнал
Плагин (plug-in)плагин (plug-in) — Программный модуль эффекта или инструмента, который загружается в DAW или другую программу-хост и обрабатывает переданные ему аудиоблоки. — программный модуль эффекта или инструмента. Он работает внутри DAW или другой программы, которую называют хостом (host): хост передаёт ему блоки отсчётов (sample)отсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом. и забирает результат. Распространённые форматы плагинов — VST3, Audio Unit (AU) и CLAP. Эффект, включённый последовательно в путь дорожки, называют вставкой (insert)вставка эффекта (insert) — Последовательное включение эффекта в путь сигнала дорожки или шины.: весь звук дорожки проходит через него. На одной дорожке может стоять несколько вставок подряд. Они образуют цепочку: выход одного плагина идёт на вход следующего.
Исходный сигнал (dry)исходный сигнал (dry) — Сигнал до рассматриваемой обработки; сухая ветвь при смешивании dry/wet. — то, что приходит на вход эффекта. Обработанный сигнал (wet)обработанный сигнал (wet) — Выход рассматриваемой обработки; в реверберации — созданные отражения, в задержке — задержанные копии. — то, что эффект из него делает: отражения ревербератора, повторы задержки, сжатый звук компрессора (dynamic range compressor)компрессор (dynamic range compressor) — Устройство или программа, которая ослабляет сигнал, когда его уровень выше порога, и тем сужает динамический диапазон.. По-английски dry и wet буквально означают «сухой» и «мокрый». В ревербераторе разница слышна сразу, а у компрессора wet — это тот же звук с изменённой динамикой.
Регулятор dry/wet
Регулятор dry/wetрегулятор dry/wet (dry/wet, mix) — Параметр эффекта, задающий соотношение исходного и обработанного сигнала на выходе: 0 % — только dry, 100 % — только wet. Коэффициенты промежуточных положений зависят от закона смешивания., или mix, задаёт соотношение двух ветвей. Положение 0 % оставляет на выходе только dry, 100 % — только wet. Обозначим положение регулятора долей от 0 до 1. Самый простой вариант — линейный закон, формула (1).
- отсчёт исходного сигнала (dry);
- отсчёт обработанного сигнала (wet);
- положение регулятора от 0 до 1, без единицы измерения; 0,3 соответствует 30 %;
- выходной отсчёт.
При , и получаем . Коэффициенты в сумме всегда дают 1. Если обработка почти не меняет звук, dry и wet совпадают, и выход сохраняет их общую амплитуду (amplitude)амплитуда (amplitude) — Наибольший модуль отклонения колеблющейся величины от равновесного значения. Для синусоиды обозначается A; единицы совпадают с единицами сигнала. при любом положении регулятора.
Но wet часто мало похож на dry: хвост ревербератора состоит из множества отражений, которые не совпадают с исходным звуком по фазе (phase)фаза (phase) — Положение внутри периода колебания, выраженное углом: полный период соответствует 360°, или 2π радиан. Начальная фаза — её значение в момент t = 0.. Такие сигналы называют некоррелированными: при сложении у них складываются не амплитуды, а средние квадраты, то есть мощности. Линейный закон в середине даёт по 0,5 на каждую ветвь, сумма квадратов , и общая мощность падает примерно на 3 дБ. Чтобы её сохранить, используют равномощный закон — формулу (2) с той же идеей, что у равномощного панорамирования (equal-power panning)равномощное панорамирование (equal-power panning) — Закон панорамирования, при котором сумма квадратов коэффициентов L и R остаётся постоянной. Это условие для мощности каналов, а не гарантия неизменной воспринимаемой громкости.: сумма квадратов коэффициентов остаётся равной 1 (Luff, 2021).
При оба коэффициента равны примерно 0,707. Для двух совпадающих сигналов это даёт амплитуду 1,414, то есть подъём примерно на 3 дБ; для некоррелированных мощность сохраняется. Таблица 1 сравнивает три закона из класса juce::dsp::DryWetMixer в JUCE 9.0.3. Сбалансированный закон держит обе ветви на полном уровне в середине и ослабляет только одну из них по краям (JUCE, DryWetMixer).
| Закон | dry, wet | Совпадающие: амплитуда | Некоррелированные: мощность |
|---|---|---|---|
| Линейный | 0,5 и 0,5 | 1 (0 дБ) | 0,5 (−3,01 дБ) |
| Равномощный | 0,707 и 0,707 | 1,414 (+3,01 дБ) | 1 (0 дБ) |
| Сбалансированный | 1 и 1 | 2 (+6,02 дБ) | 2 (+3,01 дБ) |
Поэтому надпись «50 %» сама по себе не говорит, какие коэффициенты стоят за ней. Выбор закона — решение разработчика эффекта, и он зависит от того, насколько wet похож на dry. Для эффекта, который заметно меняет фазу и состав звука, подходит равномощный закон. Для эффекта, близкого к исходному, например мягкой компрессии, — линейный.
Во вставке весь звук дорожки проходит через плагин, поэтому подмешать исходный звук можно только его регулятором mix: при 100 % wet dry на выходе дорожки не останется. При подключении через посыл (send)посыл (send) — Ответвление копии сигнала дорожки в отдельную шину, например для параллельной обработки эффектом. и возврат эффект стоит на отдельном канале возврата (return / aux)канал возврата (return / aux) — Канал, через который выход параллельного эффекта добавляют в общий микс., а исходная дорожка продолжает звучать сама по себе. Dry и wet тогда смешивает микшер DAW, и на возврате обычно ставят 100 % wet (Izhaki, гл. 23, с. 418).
Прослушивание разницы
В части плагинов есть кнопка delta, или delta solo: она выводит не смесь, а разность , то есть только то, что обработка изменила в звуке (Goddard, 2025). У лимитера (limiter)лимитер (limiter) — Устройство, которое не пропускает сигнал выше заданного уровня — потолка. По статической характеристике это компрессор с бесконечной степенью сжатия; границу гарантируют пиковый детектор и предварительный анализ. в разности слышны срезанные пики, у компрессора — то, на сколько он ослабил громкие места. Без такой кнопки разность собирают вручную: копию сигнала без обработки переворачивают по полярности и складывают с обработанной. Совпадающая часть вычитается, остаётся изменение, и приём подходит почти к любому плагину (Walden, 2020).
Разность — то же смешивание двух ветвей, только с коэффициентами −1 для dry и 1 для wet. Поэтому ей нужно то же выравнивание по времени, что и обходу, раздел о задержке. Если dry не задержан на задержку обработки, совпадающие части не вычтутся, и в разности останется почти весь звук, к тому же с провалами на отдельных частотах (frequency)частота (frequency) — Число полных колебаний за секунду. Обозначается f и измеряется в герцах; 1 Гц означает одно колебание в секунду..
Bypass: эффект выключен
Обход эффекта (bypass)обход эффекта (bypass) — Режим, в котором эффект не обрабатывает звук и на выход проходит исходный сигнал. Обход выполняет DAW или сам плагин; если плагин вносит задержку, исходный сигнал задерживают на ту же величину. выключает обработку: на выход проходит исходный сигнал. На рисунке 1 это соответствует положению, при котором верхняя ветвь отключена, а нижняя идёт на выход с коэффициентом 1. Обход нужен, чтобы сравнить звук с эффектом и без него, временно убрать прибор, не теряя его настроек, или освободить процессор.
Выполнить обход может хост или сам плагин, и это разные механизмы. Их сравнивает рисунок 2.
Обход средствами хоста. Выключатель эффекта есть в любой распространённой DAW. Дальше для примера описано поведение Ableton Live; в других программах детали могут отличаться, их описывает руководство программы. В Live у каждого устройства есть переключатель Activator. Выключенное устройство убирается из пути сигнала, как будто его временно удалили: звук проходит без обработки, а встроенные устройства не тратят процессорное время (Ableton, Device Title Bar). Хост может обойти любой плагин, даже если тот не знает об обходе. Но плагин в это время не получает входной звук, поэтому после включения его внутреннее состояние, например содержимое линии задержки, может не соответствовать текущему сигналу.
Обход внутри плагина. Плагин может объявить один из своих параметров параметром bypass. В VST3 его помечают флагом kIsBypass, в CLAP — CLAP_PARAM_IS_BYPASS. Тогда кнопка обхода в хосте меняет этот параметр, а хост продолжает вызывать обработку. За результат отвечает сам плагин: спецификация VST3 требует переключать без артефактов, например с плавным переходом, и выдавать на выход копию входа, задержанную на собственную задержку плагина (Steinberg, VST 3 FAQ). В CLAP значение такого параметра прямо не должно влиять на то, вызывает ли хост обработку; экономию процессора при обходе плагин организует сам (CLAP 1.2.10, params.h). Как конкретная DAW поступает с плагином, у которого есть такой параметр, описывает её руководство.
Bypass и mix 0 %
Задержка при выключении
Некоторые эффекты выдают результат позже, чем получили вход. Лимитеру с предварительным анализом (lookahead)предварительный анализ (lookahead) — Задержка основного сигнала относительно его анализа, чтобы обработчик успел ослабить приближающийся пик. Применяется, например, в лимитерах. нужно заранее «видеть» пик, эффектам на основе спектра (spectrum)спектр (spectrum) — Представление сигнала через его частотные составляющие: их частоты, амплитуды и фазы. Ограничение спектра задаёт, какие частоты допускаются в сигнале. — накопить блок. Такая задержказадержка (latency) — Время прохождения сигнала через тракт от входа до выхода. Включает буферизацию, драйвер, преобразователи и алгоритмы; длительность одного блока не равна полной задержке. — свойство самой обработки; её не следует путать с эффектом delay, где задержка и есть звучание. Например, предварительный анализ 2 мс при 48 кГц даёт отсчётов. Значение 2 мс взято для примера: у лимитеров анализ обычно длится единицы миллисекунд, встроенный Limiter в Ableton Live предлагает 1,5, 3 или 6 мс (Лимитер → Примеры приборов).
Хост не измеряет задержку сам: её сообщает плагин, и разработчик реализует это вместе с обработкой. В VST3 хост узнаёт задержку методом плагина getLatencySamples, в CLAP — через расширение latency; оба возвращают число отсчётов. Audio Unit сообщает задержку в секундах свойством kAudioUnitProperty_Latency. Если задержка меняется, например вместе с длиной предварительного анализа, плагин должен уведомить хост. В VST3 для этого вызывают restartComponent (kLatencyChanged), и пересчёт компенсации может прервать воспроизведение (Steinberg, IAudioProcessor). В CLAP задержка может меняться только при активации плагина, поэтому активный плагин просит хост перезапустить его (CLAP 1.2.10, latency.h). В JUCE достаточно вызвать setLatencySamples, а передачу значения хосту в нужном формате берёт на себя обёртка, как в примере ниже.
Компенсация задержки (delay compensation)компенсация задержки (delay compensation) — Выравнивание путей сигнала по времени: программа узнаёт задержку плагинов и задерживает остальные дорожки на недостающую величину. выравнивает дорожки: хост знает задержку каждого плагина и задерживает остальные пути на недостающую величину. Если на одной дорожке стоит эффект с задержкой 96 отсчётов, все другие дорожки при воспроизведении тоже сдвигаются на 96 отсчётов, и сумма звучит синхронно. DAW делают это автоматически; Ableton Live, например, учитывает и плагины на возвратах (Ableton, Device Delay Compensation).
Теперь выключим такой эффект. Если в режиме обхода он выдаёт вход сразу, без задержки, хост об этом не знает и продолжает сдвигать остальные дорожки. Звук этой дорожки придёт на 96 отсчётов раньше остальных: так показано во второй строке рисунка 3. Правильный обход задерживает dry на ту же величину, что и обработку, — третья строка.
Сдвиг на 2 мс сам по себе может остаться незаметным в ритме. Хуже, если у этой дорожки есть параллельная копия или тот же источник записан другим микрофоном (microphone)микрофон (microphone) — Устройство, преобразующее звуковые колебания в электрический сигнал. В идеальной модели напряжение на выходе пропорционально звуковому давлению.: при сложении двух копий со сдвигом 2 мс возникает гребенчатая фильтрация (comb filtering)гребенчатая фильтрация (comb filtering) — Ряд чередующихся подъёмов и провалов частотной характеристики, возникающий, например, при сложении сигнала с его задержанной копией.. Провалы приходятся на частоты, для которых 2 мс равны нечётному числу полупериодов: 250, 750, 1250 Гц и далее через 500 Гц.
Когда обход выполняет хост, выравнивание остаётся его заботой. Ableton Live, например, сохраняет задержку выключенного устройства, если она задана его параметрами, как у компрессора с предварительным анализом, чтобы не нарушать компенсацию (Ableton, Audio Fact Sheet).
Щелчок при переключении
Пусть в момент нажатия bypass выходной отсчёт wet равен 0,8, а соответствующий отсчёт dry равен −0,5. Если переключиться мгновенно, между соседними отсчётами выход изменится на 1,3 — почти на две трети полного диапазона от −1 до +1. Такой скачок слышен как щелчок. Его создаёт разрыв формы волны: тот же скачок получится при переключении между любыми двумя несовпадающими сигналами. Верхняя строка рисунка 4 показывает этот разрыв.
Щелчка избегают кроссфейдом (crossfade)кроссфейд (crossfade) — Плавная замена одного сигнала другим: коэффициент первого уменьшается, второго растёт, поэтому на выходе нет мгновенного скачка.: коэффициент wet за несколько миллисекунд или десятков миллисекунд уменьшается до 0, а коэффициент dry растёт до 1. Скачок исчезает, потому что каждый отсчёт выхода лишь немного отличается от предыдущего. Это то же смешивание по формуле (1), только движется во времени. Класс DryWetMixer в JUCE 9.0.3 по умолчанию меняет коэффициенты линейно за 50 мс. Для сигналов, близких по форме, подходит переход с постоянной суммой коэффициентов, для некоррелированных — с постоянной суммой их квадратов (Luff, 2021).
Плагин читает параметр bypass в начале блока или точно по отсчёту, если хост передал момент изменения. Размер блока задаёт хост, обычно по настройке буфера в DAW, например 128 или 512 кадров; очередной блок может оказаться и короче заявленного наибольшего (Аудиоданные → Размер блока и задержка). Спецификация VST3 допускает поблочную обработку, но не рекомендует её при блоках длиннее 1024 отсчётов: при 48 кГц переход начнётся с опозданием до 21 мс (Steinberg, VST 3 FAQ).
Пример на C++ и JUCE
Фрагмент ниже показывает эффект с задержкой 96 отсчётов, регулятором mix и собственным параметром bypass. Смешивание и задержку dry выполняет juce::dsp::DryWetMixer, обход сводится к плавному уводу mix в ноль. Нужны модули juce_audio_processors и juce_dsp. Объект effect — ваша обработка с методами prepare и process, выход которой отстаёт на latency отсчётов. Остальные обязательные методы AudioProcessor (имя, состояние, редактор) опущены. API проверено с JUCE 9.0.3.
// Фрагмент процессора: задержка обработки, регулятор mix и собственный bypass.
class MixBypassProcessor : public juce::AudioProcessor
{
public:
MixBypassProcessor()
{
addParameter (mix = new juce::AudioParameterFloat ({ "mix", 1 }, "Mix",
0.0f, 1.0f, 1.0f));
addParameter (bypass = new juce::AudioParameterBool ({ "bypass", 1 },
"Bypass", false));
setLatencySamples (latency);
}
juce::AudioProcessorParameter* getBypassParameter() const override
{
return bypass;
}
void prepareToPlay (double sampleRate, int maximumBlockSize) override
{
const juce::dsp::ProcessSpec spec {
sampleRate, static_cast<juce::uint32> (maximumBlockSize),
static_cast<juce::uint32> (getTotalNumOutputChannels()) };
effect.prepare (spec);
mixer.prepare (spec);
mixer.setWetLatency (static_cast<float> (latency));
}
void processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer&) override
{
for (auto ch = getTotalNumInputChannels();
ch < getTotalNumOutputChannels(); ++ch)
buffer.clear (ch, 0, buffer.getNumSamples());
mixer.setWetMixProportion (bypass->get() ? 0.0f : mix->get());
juce::dsp::AudioBlock<float> block (buffer);
mixer.pushDrySamples (block);
effect.process (juce::dsp::ProcessContextReplacing<float> (block));
mixer.mixWetSamples (block);
}
private:
static constexpr int latency = 96; // пример: анализ 2 мс при 48 кГц
juce::AudioParameterFloat* mix = nullptr;
juce::AudioParameterBool* bypass = nullptr;
Effect effect; // обработка, которая задерживает выход на latency
juce::dsp::DryWetMixer<float> mixer { latency };
};setLatencySamples сообщает хосту задержку, по которой он выравнивает остальные дорожки. getBypassParameter возвращает параметр, который хост должен использовать как свою кнопку обхода. В processBlock смеситель сначала копирует вход в свою линию задержки (pushDrySamples), затем effect превращает буфер в wet, и mixWetSamples складывает его с dry, задержанным на setWetLatency. Аргумент конструктора mixer { latency } задаёт наибольшую задержку dry, на которую рассчитана линия.
При включённом bypass смеситель получает долю wet 0 и за 50 мс переводит коэффициенты в 0 для wet и 1 для dry. На выходе остаётся вход, задержанный на 96 отсчётов, поэтому выравнивание с другими дорожками не меняется. Положение mix при этом не трогается: после выключения обхода эффект вернётся к прежнему соотношению. Обработка продолжает работать и при обходе, так что её состояние не устаревает. Длительность перехода меняет setRampLength, закон — setMixingRule (JUCE, DryWetMixer).
Пример рассчитан на эффект с одинаковым числом входных и выходных каналов и блоки не длиннее, чем передано в prepareToPlay: очередь dry внутри DryWetMixer имеет размер по этому значению. При проверке в JUCE 9.0.3 вместо effect стояла задержка на 96 отсчётов с переворотом полярности. При mix 50 % выход оказался нулевым, значит dry и wet совпали по времени до отсчёта. При включённом bypass выход совпал с входом, задержанным на 96 отсчётов. Наибольшее изменение между соседними отсчётами в переходах осталось таким же, как у самого тестового тона 440 Гц.
Самопроверка
Регулятор dry/wet стоит на 25 %, закон линейный. Отсчёт dry равен 0,4, отсчёт wet −0,2. Чему равен выходной отсчёт?
.
Плагин с задержкой 240 отсчётов при 48 кГц в режиме bypass выдаёт вход без задержки. На сколько миллисекунд его дорожка сместится относительно остальных и в какую сторону?
с, то есть 5 мс. Хост по-прежнему задерживает остальные дорожки на эти 5 мс, поэтому обойдённая дорожка зазвучит на 5 мс раньше них.
Почему ревербератор с некоррелированным хвостом при линейном законе звучит тише в положении 50 %, чем в положениях 0 и 100 %?
При 0 и 100 % одна ветвь проходит с коэффициентом 1. В середине обе получают по 0,5, а мощности некоррелированных сигналов складываются: от мощности одной ветви, то есть примерно −3 дБ. Равномощный закон даёт .
Источники
- Steinberg. VST 3 Developer Portal, FAQ: Processing, вопрос How does Audio Processing Bypass work? — параметр
kIsBypass, продолжение вызовов обработки, переключение без артефактов, задержанная копия входа, поблочное и точное по отсчёту переключение. - CLAP 1.2.10. params.h — флаг
CLAP_PARAM_IS_BYPASS, объединение кнопок обхода хоста и плагина, независимость вызова обработки от значения параметра. - Ableton. Live 12 Reference Manual: Working with Instruments and Effects, разделы 23.2.1 Device Title Bar и 23.3 Device Delay Compensation — переключатель Activator, автоматическая компенсация задержки плагинов.
- Ableton. Live 12 Reference Manual: Audio Fact Sheet, раздел 39.2.8 Bypassed Effects — удаление выключенного эффекта из пути сигнала и сохранение задержки ради компенсации.
- Steinberg. VST 3 API Documentation: IAudioProcessor —
getLatencySamplesв отсчётах, уведомлениеrestartComponent (kLatencyChanged)и возможная остановка воспроизведения при пересчёте. - CLAP 1.2.10. latency.h — задержка в отсчётах, изменение только при активации,
request_restartдля активного плагина. - Apple. kAudioUnitProperty_Latency, заголовок
AudioUnitProperties.h— задержка Audio Unit в секундах. - JUCE. AudioProcessor, заголовок 9.0.3 и реализация 9.0.3 —
getBypassParameter,processBlockBypassedи проверка задержки по умолчанию,setLatencySamples. - JUCE. Обёртка VST3, версия 9.0.3 — собственный параметр Bypass, флаг
kIsBypassи выбор междуprocessBlockиprocessBlockBypassed. - JUCE. DryWetMixer и исходник 9.0.3 — законы смешивания, задержка dry, линейный переход 50 мс.
- Luff G. A cheap energy-preserving-ish crossfade. в списке литературы → — переход с постоянной суммой амплитуд для коррелированных сигналов и с постоянной энергией для некоррелированных.
- Luke Goddard. How To Use Delta Solo In Any DAW. Production Expert, 2025 — кнопка delta solo: прослушивание только разницы между обработанным и исходным звуком.
- Walden J. Cubase: Delta Monitoring Explained. в списке литературы → — ручная сборка разности переворотом полярности необработанной копии, применимость почти к любому плагину.
- Izhaki R. Mixing Audio: Concepts, Practices and Tools. Гл. 23, с. 418. в списке литературы → — dry/wet во вставке и при подключении через посыл.
Рисунки — схемы и расчётные сигналы для пояснения, а не записи реальных плагинов.
Связи
Связи списком
Ссылается на
- Аудиоданные в программах: представление отсчётов, каналы, кадры и буферы
- Звук в пространстве: панорама, задержка, реверберация и мид-сайд
- Кто владеет объектом: std::make_unique и время жизни в плагине JUCE
- Математика для аудио
- Микширование сигналов: усиление, фаза и запас уровня
- Первое знакомство с DAW: дорожки, MIDI и звук
- Принцип работы лимитера
- C++ в аудиопотоке: выделение памяти, общие объекты и инструменты JUCE