Де-эссер студии ZS Records. Две вещи, которыми им управляют:
- AMOUNT — насколько сильно давить сибилянты;
- RANGE — диапазон частот, который вообще обрабатывается. Всё за его пределами проходит через плагин нетронутым.
А кнопка LEARN делает обе настройки за тебя: слушает вход пару секунд и сама выставляет диапазон и Amount.
VST3 · AU · Standalone, macOS, universal (Apple Silicon + Intel).
Брендированные установщики собираются из исходников, оформление — в стиле сайта ZS Records.
macOS — ZS-esser-1.0.0-macOS.pkg. Внутри VST3 и AU, на шаге «Тип установки»
можно снять галочку с ненужного формата. Ставит в общесистемные папки
/Library/Audio/Plug-Ins/…. Собрать:
./scripts/package-macos.shПакет не подписан сертификатом Apple Developer ID, поэтому при первом запуске macOS покажет предупреждение о неустановленном разработчике. Правый клик по
.pkg→ «Открыть», либо разрешить в «Системные настройки → Конфиденциальность и безопасность». На работу плагина это не влияет.
Windows — ZS-esser-1.0.0-Windows.exe. Ставит 64-битный VST3 в
C:\Program Files\Common Files\VST3\, есть русский и английский языки мастера и
корректная деинсталляция. Собирается на CI (Inno Setup); забрать из вкладки
Actions → артефакт ZS-esser-Setup-Windows, либо:
gh run download --repo 1977-code/ZS-esser --name ZS-esser-Setup-WindowsГрафика мастеров генерируется скриптом scripts/gen_branding.py,
поэтому оформление нельзя случайно рассинхронизировать с брендом.
./scripts/build.shСкрипт при необходимости сам склонирует JUCE, соберёт релиз и положит плагин в
~/Library/Audio/Plug-Ins/VST3/ZS-esser.vst3
~/Library/Audio/Plug-Ins/Components/ZS-esser.component
Со встроенными офлайн-проверками DSP:
./scripts/build.sh --testsУдалить:
./scripts/uninstall.shТребуется CMake 3.22+ и Xcode Command Line Tools.
JUCE 9 не собирается компилятором MinGW (фреймворк запрещает это намеренно),
поэтому кросс-сборка с Mac невозможна — Windows-версию собирает MSVC. Это делает
CI: .github/workflows/windows.yml на каждый
push в main собирает VST3 на windows-latest, прогоняет DSP-тесты и кладёт
готовый плагин в артефакты сборки.
Забрать: вкладка Actions → последний зелёный запуск Windows VST3 → артефакт ZS-esser-VST3-Windows-x64. Либо из терминала:
gh run download --repo 1977-code/ZS-esser --name ZS-esser-VST3-Windows-x64Установка на Windows — скопировать папку ZS-esser.vst3 в
C:\Program Files\Common Files\VST3\
Собрать вручную на Windows-машине с Visual Studio 2022:
git clone --depth 1 --branch master https://github.com/juce-framework/JUCE.git JUCE
cmake -B build -G "Visual Studio 17 2022" -A x64 -DZSESSER_COPY_AFTER_BUILD=OFF
cmake --build build --config Release --target ZSesser_VST3Диапазон. Тяни золотую полосу прямо на спектре: за края — двигаешь границы,
за середину — сдвигаешь всю полосу целиком, колесом — сужаешь и расширяешь.
Shift — точнее, двойной клик — сброс к 4.5–11 кГц. Значения можно ввести и
руками в полях LOW / HIGH (двойной клик по полю).
Затемнённые области слева и справа — то, чего плагин не касается вообще.
Amount. Ручка задаёт, сколько децибел снимается с самых громких сибилянтов: 50 % ≈ 9 dB, 100 % ≈ 18 dB. Это не «порог», который надо переставлять под каждый трек, — сколько поставил, столько и снимется, хоть на тихом куплете, хоть на громком припеве.
Learn. Нажми — и дай сигналу поиграть пару секунд. Плагин сам найдёт, где сидят сибилянты, и выставит диапазон и Amount. Прогресс заполняет кнопку слева направо и идёт только пока есть звук, так что пауза в транспорте просто ставит обучение на паузу. Повторное нажатие — отмена. Если сибилянтов не нашлось (тишина или ровный яркий материал без «с»), плагин ничего не меняет и показывает NO SIGNAL. Как это работает — ниже, в разделе про детектор.
Listen. Слушать только то, что убирается. Самый быстрый способ проверить диапазон вручную: включить, покрутить края и добиться, чтобы в мониторе остались одни «с» и «ш», без гласных и без «т».
Метр GR справа от спектра показывает текущее подавление; оно же рисуется внутри самой полосы, вдавливаясь в неё сверху.
Окно тянется за угол, пропорции сохраняются.
Вход делится двумя кроссоверами Linkwitz-Riley 4-го порядка (24 dB/окт) на
низ < LOW < полоса сибилянтов < HIGH < верх
Ослабляется только средняя полоса; низ и верх складываются обратно с
компенсацией фазы. Сумма низ + середина + верх — это в точности all-pass от
входа, поэтому реконструкция сворачивается в
out = allpass(in) + mid · (gain − 1)
Отсюда два следствия. Во-первых, при Amount = 0 плагин измеряемо прозрачен —
офлайн-тест гоняет синусы от 100 Гц до 15 кГц и ловит отклонение 0.0000 dB.
Во-вторых, для look-ahead нужны всего две линии задержки вместо трёх.
Кроссовер — это скат, а не кирпичная стена. Насколько «не трогает» то, что вне диапазона (измерено, окно 12–18 кГц):
| Тон относительно края | Изменение |
|---|---|
| полоктавы ниже | −1.0 dB |
| октава ниже | −0.22 dB |
| две октавы ниже | −0.01 dB |
Слушает только полосу сибилянтов, стерео-связанный (максимум из каналов), чтобы не уводило стереообраз. Порог не выставляется руками — он выводится из двух следящих:
- peak — недавний максимум полосы (≈1 мс вверх, 600 мс вниз);
- average — её же долговременный уровень (≈300 мс вверх, 1.2 с вниз).
Порог ставится на peak − Amount / slope, поэтому ручка означает конкретное
число децибел независимо от уровня входа.
Разница между следящими — crest полосы — решает, работать ли вообще. Сибилянт торчит на 15–25 dB над собственным средним полосы; просто яркий материал — тарелки, шипящий усилитель — лежит ровно. Ниже 4 dB crest плагин не делает ничего, выше 12 dB работает на полную, между ними — плавно. Именно это не даёт де-эссеру превратиться в статическую полку на ярком миксе.
Проверено тестами: постоянный тон 8 кГц и постоянный широкополосный шум дают 0.00 dB подавления, а шумовые всплески поверх тихого фона — ровно столько, сколько запрошено ручкой.
Кнопка LEARN использует ту же идею «пик против среднего», но по частоте, а не по времени. Пока идёт обучение, каждый кадр входного сигнала проходит через FFT, и для каждой частотной корзины копятся две величины: медленное среднее (стабильный уровень) и сумма того, насколько кадр торчит над этим средним. Ровный материal — яркий микс, шум усилителя — почти не торчит над своим средним и даёт счёт ≈ 0. Сибилянты прерывисты и пиковы, поэтому счёт накапливается именно там, где сидит энергия «с».
Дальше плагин находит непрерывную полосу вокруг пика этого счёта (её края — там, где счёт падает до трети от максимума), а Amount берёт из crest самой полосы: насколько её пики торчат над её же стабильным уровнем. Чем резче и злее «с», тем больше подавления — но всегда с запасом, чтобы «с» остались живыми, а не исчезли. Если crest мал (материал ровный) или сигнала почти не было — результат считается невалидным и настройки не трогаются.
Логика вынесена в отдельный класс LearnAnalyzer и
тестируется офлайн: синтетический «голос» с сибилянтами в 5–7.5 кГц → полоса
садится на ~3.9–9.4 кГц; сдвиг сибилянтов на октаву вверх двигает окно вверх;
ровный тон и тишина не дают ничего менять.
Look-ahead 2.5 мс (120 сэмплов на 48 кГц) — усиление успевает опуститься до того, как «с» дойдёт до выхода. Ровно это значение сообщается хосту, и его компенсирует PDC. Сверху кроссоверы добавляют собственную групповую задержку; она зависит от частоты, поэтому одним числом не выражается — на 100 Гц, где она максимальна, это 6 сэмплов (0.125 мс).
Tests/DspTests.cpp — офлайн-набор без хоста. Проверяет прозрачность на
Amount = 0, подавление всплеска, неприкосновенность материала вне окна на
трёх дистанциях, предсказуемость Amount на двух уровнях входа, поведение на
постоянном тоне и постоянном шуме, реальную задержку против заявленной,
тишину в Listen при нулевом Amount, устойчивость в моно и на скрещенных
границах диапазона, а также работу Learn: попадание в полосу, следование за
сдвигом сибилянтов и игнорирование ровного тона и тишины.
cmake -B build -DZSESSER_BUILD_TESTS=ON && cmake --build build --target ZSesserTests
./build/ZSesserTests_artefacts/Release/ZSesserTestsПалитра, типографика и графика взяты из дизайн-токенов сайта
zsr.artspace1977.ru (src/app/globals.css):
почти чёрный фон #050505, золото #C9A052, треугольная текстура и волновой
знак — тот же путь, что в WaveformLogo. Шрифты — Montserrat и Inter, вшиты в
бинарник (оба под SIL Open Font License).
GNU AGPLv3 — полный текст в LICENSE.
Плагин собирается на JUCE 9, который доступен либо по коммерческой лицензии, либо по AGPLv3; здесь используется вариант AGPLv3, поэтому и весь проект распространяется на тех же условиях. Практически это значит: исходники открыты, а любая модифицированная версия, которую раздают или предоставляют как сетевой сервис, тоже должна оставаться открытой под AGPLv3.