Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ZS-esser

Де-эссер студии ZS Records. Две вещи, которыми им управляют:

  • AMOUNT — насколько сильно давить сибилянты;
  • RANGE — диапазон частот, который вообще обрабатывается. Всё за его пределами проходит через плагин нетронутым.

А кнопка LEARN делает обе настройки за тебя: слушает вход пару секунд и сама выставляет диапазон и Amount.

VST3 · AU · Standalone, macOS, universal (Apple Silicon + Intel).


Установка (готовые инсталляторы)

Брендированные установщики собираются из исходников, оформление — в стиле сайта ZS Records.

macOSZS-esser-1.0.0-macOS.pkg. Внутри VST3 и AU, на шаге «Тип установки» можно снять галочку с ненужного формата. Ставит в общесистемные папки /Library/Audio/Plug-Ins/…. Собрать:

./scripts/package-macos.sh

Пакет не подписан сертификатом Apple Developer ID, поэтому при первом запуске macOS покажет предупреждение о неустановленном разработчике. Правый клик по .pkg → «Открыть», либо разрешить в «Системные настройки → Конфиденциальность и безопасность». На работу плагина это не влияет.

WindowsZS-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.

Windows (VST3)

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

Кнопка 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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages