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

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages