Фаза 0, полная цепочка эффектов, детерминизм реконструкции
Страница НЕ запускалась локально (нет браузера в среде сборки), только статически
проверен код. Проверка на реальном Android в Telegram WebView (ADR-0011). Каждый POC
ловит свои ошибки независимо и печатает JSON с полем error, не роняя страницу.
Faust DSP компилируется НА УСТРОЙСТВЕ (в браузере, из @grame/faustwasm@0.16.3, без
локального тулчейна). Цепочка: 4-полосный EQ (low-shelf + 2x peak_eq + high-shelf),
компрессор (co.compressor_mono), дисторшн (tanh-waveshaper), lo-fi/битдробилка
(прореживание SR + квантование битности), реверб (re.mono_freeverb, раздельно на L/R).
Стерео (2 in, 2 out). Дефолты цепочки АКТИВНЫ (не bypass), тест должен нагружать CPU
реалистично.
не запускалось
Оффлайн-прокси, device-независимая метрика: renderSpeed = длительность деленная на
время рендера через OfflineAudioContext. renderSpeed много больше 1 (порог OK около
3-5x) значит в realtime есть запас, glitch маловероятен; renderSpeed меньше 1 значит
рендер медленнее реального времени, glitch ожидаем. Это ПРОКСИ, не замена прослушивания
на устройстве.
Стримит трек Jamendo через ТУ ЖЕ Faust-цепочку в реальном AudioContext (не offline).
Слушай на предмет треска, дропаутов (underrun) и заиканий, это финальная проверка,
которую оффлайн-прокси не заменяет. Дефолты слайдеров ниже НЕ bypass — эффект должен
быть слышен сразу на Play. Кнопка A/B переключает оригинал/цепочку БЕЗ перезапуска трека.
Пресеты ниже выставляют слайдеры и применяют их к цепочке в реальном времени (если трек уже
играет). "Чистая цепочка" — EQ + компрессор + реверб БЕЗ lo-fi/дисторшн-грязи: если на ней
треска нет, значит треск был характером lo-fi/дисторшна (цепочка жизнеспособна); если трещит
и чистая цепочка — вероятен реальный underrun, а не характер эффекта.
не запускалось
§11, детерминизм реконструкции пресета (0.C, ADR-0012)
Фиксированный, полностью детерминированный граф (без рандома, без буфера шума):
OscillatorNode(220 Hz, sawtooth) в BiquadFilterNode(lowpass, 1200 Hz, Q=1) в
WaveShaperNode(фиксированная tanh-кривая, oversample=none) в GainNode в destination.
Рендерится через OfflineAudioContext.
Same-SR: дважды при 48000 Hz, должно быть побитово идентично (детерминизм ОДНОГО
и того же движка/SR, базовое ожидание W3C Web Audio, но не гарантия между версиями и
устройствами).
Cross-SR: при 44100 и 48000 Hz. Побитово совпасть НЕ может (разные SR, разные
коэффициенты биквада), сравниваются статистически: оба ресемплятся (простая линейная
интерполяция, вручную) к общей низкой сетке (8000 Hz), считаются корреляция,
RMS-разница, maxAbsDiff. Числа без вердикта, интерпретация вручную.