From 7febe744e9aef2acfd72ad6bdf4abb15c654f810 Mon Sep 17 00:00:00 2001 From: Matiq Date: Sat, 22 Aug 2026 18:59:04 +0300 Subject: [PATCH] =?UTF-8?q?plan:=20sync=20to=2022e=20=E2=80=94=20Step=207?= =?UTF-8?q?=20refuted,=20floor=20blend*ln10/20=20solved,=20new=20priority?= =?UTF-8?q?=20Step=209=20(floor=20mechanism)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BITEXACT_PLAN.md | 72 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/BITEXACT_PLAN.md b/BITEXACT_PLAN.md index 2ae7c42..873eeeb 100644 --- a/BITEXACT_PLAN.md +++ b/BITEXACT_PLAN.md @@ -5,6 +5,20 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете воспроизводит реальный DSP-путь. Этот документ — план, как туда дойти, и точка отсчёта для любой будущей сессии. **Читать вместе с `AGENTS.md` и `handoff/NOTES_LEVEL.md`.** +> **ОБНОВЛЕНИЕ 2026-08-22 (сессии 22a–22e):** +> 1. Phase-B оффлайн-гипотезы (pooling/temporal/scalar-ρ) — все ОПРОВЕРГНУТЫ (22a). +> 2. Шаг 7 выполнен → премиса опровергнута: BandConfig A/B/γ = −24/28/1 у ВСЕХ конфигов, +> но это GUI-timer кривые; аудио их не читает (22b). LUT-константы структурной цепи +> помечены EMPIRICAL. +> 3. Насыщение редукции НАЙДЕНО ЖИВЬЁМ и РЕШЕНО АЛГЕБРАИЧЕСКИ (22d/e): +> hot-тон упирается в ЖЁСТКИЙ пол gain=**−20.72 dB**, pin ≥24 dB драйва; +> `gain_floor = 20·log10(blend·ln10/20)` — совпадение 0.0055 dB! +> Константа ln10/20=0.11513 @0x1824c3cd4, аудио-юзеры FUN_180529c60/52baa0/bad0/bba0. +> 4. Инфраструктура: официальный параметр-мост (`setparam.lua`), XML `` в RPP = +> декоративная копия (не источник стейта); depth=±18dB/trim=±24dB; WAV bext/junk +> грабли подтверждены живьём. +> Новый приоритет №1 — Шаг 9 (ниже). + Цель фазы C (bit-exact): воспроизвести `FramedDetector` (= fn `FUN_180529fe0` mono-path) настолько точно, что `verify_bit_exact.py` даёт побайтовое совпадение на рендерах (`t1kq_*`, `dual_*`, `comb_*`). Ниже — конкретный порядок, что и зачем. @@ -43,7 +57,14 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете на однополосных t1kq/t1k/al и проваливает dual@500 (константный −6.7 dB при всех q — отсутствие НАСЫЩЕНИЯ редукции: реальная кривая упирается в C_max≈0.70, exp2(−lvl) не ограничен). Свип γ×MULT подтвердил: текущий оптимум (0.344/4.2) лучший, слепая -подкрутка исчерпана — проблема в ФОРМЕ кривой, см. Шаг 7 / bigkernel-вход. +подкрутка исчерпана — проблема в ФОРМЕ кривой. + +> **КОРРЕКЦИЯ 22d/e**: «насыщение C_max≈0.70» старой модели = артефакт placeholder +> MULT=4.2 / Pchip cap 0.667, НЕ свойство плагина: живой плагин на ±24 dB trim +> редуцирует БЕЗ потолка (R 1.4→15.7 dB), а на горячем тоне (+6 dBFS) упирается в +> ЖЁСТКИЙ пол gain=−20.72 dB = **blend·ln10/20 точно** (Δ0.0055 dB). Механизм пола — +> в нетранскрибированном куске аудио-пути (след: FUN_180529c60, ln10/20-фактор), +> см. Шаг 9. --- @@ -162,6 +183,25 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB. межполосного суммирования масок/acc ещё не локализована (см. пере-скоуп Шага 2). Критерий: `verify_bit_exact.py` — побайтовое совпадение данных-чанка WAV. +### Шаг 9 — Механизм пола редукции blend·ln10/20 (НОВЫЙ ПРИОРИТЕТ №1, 2026-08-22) +Живой факт (22d): hot-тон упирается в ЖЁСТКИЙ пол gain=−20.72 dB = `20·log10(0.8·ln10/20)` +с точностью 0.0055 dB; колено между L=−6..0 (trim-шкала); холодный тон на ±24 trim +пола НЕ достигает. t-clamp в транскрибированной LUT НЕ даёт pin (grid MULT≤12/B≥18 — +NOTES 22e) ⇒ пол живёт в другом куске аудио-пути. + +9a. Декодировать `FUN_180529c60` полностью: фактор + `expf((p87c·30 − 90)·ln10/20)` на band-буферы 0x540678[band] через + `FUN_1804d56b0` (f_529c60.dis:94-101) — что именно считает 1804d56b0 и куда + идёт произведение (это vtbl-метод рядом с аудио-entry). +9b. Найти сайт клампа: grep ln10/20-константы (0x1824c3cd4) по остальным юзерам + (18052baa0/bad0/bba0) и по f529fe0.dis/f_52d650.dis на предмет floor/clamp маски. +9c. Проверка предсказаний модели пола: (i) floor_gain(mix) сдвигается как + 20log10(blend′/0.8); (ii) пол частотно-зависит только через blend(freqaxis) + при mix<100; (iii) knee-позиция от sens/depth. Рендеры через setparam.lua. +9d. Порт клампа в `process_band_structural` → smoke → корпус с гейтом + (`corpus_structural.py --vs-bridge`; цель: dual@500 уходит с −6.7, res/dual/comb ≥ bridge). +Критерий: воспроизвести pin −20.72 dB в рендере модели + отсутствие регресса групп. + --- ## 2. Что НЕ делать (подводные камни из дока) @@ -174,6 +214,11 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB. Bridge — только запасной вариант, пока структурная цепочка не пройдёт Шаг 1-2. - **НЕ использовать битые 24-bit загрузчики** — метрика `render_parity.py:43` правильная (x>=0x800000 => x−0x1000000). В тестовых скриптах использовать тот же код. +- **НЕ редактировать XML `` в RPP ради изменения звука** — это декоративная + UI-копия, плагин берёт стейт из бинарной части чанка (NOTES 22c). Только мост + `setparam.lua`. +- **НЕ читать WAV наивным readframes+reshape** — REAPER пишет bext/junk-чанки; только + каноничный `render_parity.load` (иначе фантомный шум/клиппинг, NOTES 22c). ## 3. Риски и время @@ -187,17 +232,18 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB. ## 4. Точка входа для следующей сессии -1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md:820-840` - (точная цепочка) + апдейты 20j/21a/21b/21c (IIR3 bidi, combine-семантика, - структурный корпус) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp` (live-таблицы). +1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md` + апдейты **20j / 21a-21e / 22a-22e** (цепочка, Phase-B негативы, Шаг 7 опровержение, + параметр-мост, пол blend·ln10/20) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp`. 2. Собрать: `cmake --build dsp/build --target render48k framed_test`. 3. Бейзлайны: `python3 scripts/corpus.py` (bridge, 62 случая, §0) и - `python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json` - (структурная цепь на внутренней сетке). -4. ПРИОРИТЕТ (закрытие разрыва формы кривой редукции): - a. СТАТИКА: hunt clamp/насыщения в level-пути — `vminpd/vmaxpd/minsd/maxsd` в - FUN_18052d650 (IIR1), инлайн IIR2, scale-шаг; семантика FUN_180323f20 и - depth-скаляра 0x540888. Если clamp найден — транскрибировать, smoke + корпус. - b. Если статика исчерпана — Шаг 7: live-захват BandConfig ctx+0x188 по - NOTES_CAPTURE.md; сначала разрешить противоречие A/B/γ между сессиями - (render_long/t1kq: −24/28/1 vs fit по точкам рефов: −13.78/68.29/0.344). + `python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json`. +4. ПРИОРИТЕТ №1 — **Шаг 9** (пол редукции): + a. 9a: полный декод FUN_180529c60 + FUN_1804d56b0 (f_529c60.dis готов). + b. 9b: grep 0x1824c3cd4 по аудио-функциям; hunt клампа маски. + c. 9c: предсказания пола — рендеры mix/sens через `setparam.lua` (мост готов, + XML-правки стейта НЕ работают — NOTES 22c). + d. 9d: порт + корпус с гейтом. +5. Инструменты сессии: `setparam.lua`/`dump_params.lua` (параметр-мост), + `scripts/rpp_setparam.py` (только формат-хирургия!), `RT_LUT_*` env в + framed_model.cpp (солвер констант), `scripts/step7_capture.py` (live BandConfig).