vst3 + source code:
Скачивайте файлы из папки или сохраняйте к себе в Облако
cloud.mail.ru
DSP: что там на самом деле
Детекторы.
Один и тот же однополюсный follower env = c·env + (1−c)·|x|,
пять экземпляров с разными временами: FET 0.35/25 мс, Opto 12/300, VCA 2/120, target 1000/1600, transient 0.3/35. FET/Opto/VCA взвешенно усредняются в combined.
Управление. target — это тот же combined, только сглаженный за ~1–1.6 с.
Коррекция = 20·log10(target / combined), ограничена ±12 дБ, умножается на amount и на speedFactor (0.25…2.0), затем сглаживается и зажимается по усилению в 0.25…4.0.
Ключевое следствие: опорный уровень выводится из самого сигнала.
На стационарном материале combined сходится к target, коррекция → 0 дБ, усиление → ровно 1.000.
Ни порога, ни ratio, ни makeup, ни целевой громкости в коде нет.
Насколько это «идеальный компрессор»
Это не компрессор. Компрессор уменьшает разницу между громким и тихим относительно порога; здесь порога нет, а опора — собственное недавнее прошлое сигнала.
Работает только на изменениях уровня и через ~8 с полностью отпускает.
Что измерено:
Проверка Результат
Статика (−40…−3 dBFS) усиление 1.000, все 7 ручек дают 0.00 дБ
Скачок −20 → −6 dBFS −9.6 дБ, возврат к 0 дБ за ~8 с
Размах ±8 дБ 16 дБ → 10.8 дБ при Leveling = 1.0
Барабаны, Leveling 0.5 пик −3.63 → +0.42 dBFS, крест 14.24 → 16.32 дБ
Барабаны, Leveling 1.0 пик −3.63 → +4.62 dBFS, крест 14.24 → 17.27 дБ
На перкуссии он расширяет динамику и выбрасывает пики за 0 dBFS: тракт подъёма (до ×4) раскручивается на затухании и остаётся открытым, когда приходит следующий удар. Потолка на выходе нет.
Остальное:
Transient Preserve почти мёртв. На барабанах ветка срабатывает на 28.8 % сэмплов, но ослабляет срез в среднем на 9.4 %. Разница по крест-фактору между 0.0 и 1.0 — 0.05 дБ.
Причина структурная: у transientFollower атака 0.3 мс, у fet — 0.35 мс, то есть «быстрый пик» и «медленная огибающая» — практически один сигнал.
FET / Opto / VCA — не три схемы, а один и тот же follower с тремя наборами времён.
Ни program-dependent release, ни нелинейности, ни гармоник.
Все три на нуле = тихий полный байпас (отклонение усиления 0.000000).
Speed — это не скорость. correctionDb *= speedFactor масштабирует глубину коррекции 0.25…2.0×, то есть вторая ручка Leveling.
Вместе с ней запрашивается до ±24 дБ вместо заявленных в комментарии ±12.
Сглаживание не нормировано по частоте дискретизации: фиксированный покоэффициент на сэмпл → 17.6 мс на 44.1k, 8.2 мс на 96k, 4.2 мс на 192k.
Один и тот же пресет звучит по-разному в разных сессиях.
Итог: каркас JUCE сделан корректно — параметры, состояние, шины, стереолинк, без NaN и падений.
DSP под ним — медленный AGC, который несколько секунд сопротивляется изменению уровня и возвращается к единице, с трактом подъёма, клиппующим на транзиентах, и тремя из семи ручек, которые практически ничего не делают.
«FET/Opto/VCA/adaptive target/transient preserve» — это описание поверх одного однополюсного детектора.