plan: sync to 22e — Step 7 refuted, floor blend*ln10/20 solved, new priority Step 9 (floor mechanism)

This commit is contained in:
2026-08-22 18:59:04 +03:00
parent 3970c1e309
commit 7febe744e9
+59 -13
View File
@@ -5,6 +5,20 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете
воспроизводит реальный DSP-путь. Этот документ — план, как туда дойти, и точка отсчёта воспроизводит реальный DSP-путь. Этот документ — план, как туда дойти, и точка отсчёта
для любой будущей сессии. **Читать вместе с `AGENTS.md` и `handoff/NOTES_LEVEL.md`.** для любой будущей сессии. **Читать вместе с `AGENTS.md` и `handoff/NOTES_LEVEL.md`.**
> **ОБНОВЛЕНИЕ 2026-08-22 (сессии 22a22e):**
> 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 `<PARAM>` в RPP =
> декоративная копия (не источник стейта); depth=±18dB/trim=±24dB; WAV bext/junk
> грабли подтверждены живьём.
> Новый приоритет №1 — Шаг 9 (ниже).
Цель фазы C (bit-exact): воспроизвести `FramedDetector` (= fn `FUN_180529fe0` mono-path) Цель фазы C (bit-exact): воспроизвести `FramedDetector` (= fn `FUN_180529fe0` mono-path)
настолько точно, что `verify_bit_exact.py` даёт побайтовое совпадение на рендерах настолько точно, что `verify_bit_exact.py` даёт побайтовое совпадение на рендерах
(`t1kq_*`, `dual_*`, `comb_*`). Ниже — конкретный порядок, что и зачем. (`t1kq_*`, `dual_*`, `comb_*`). Ниже — конкретный порядок, что и зачем.
@@ -43,7 +57,14 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете
на однополосных t1kq/t1k/al и проваливает dual@500 (константный −6.7 dB при всех q — на однополосных t1kq/t1k/al и проваливает dual@500 (константный −6.7 dB при всех q —
отсутствие НАСЫЩЕНИЯ редукции: реальная кривая упирается в C_max≈0.70, exp2(lvl) не отсутствие НАСЫЩЕНИЯ редукции: реальная кривая упирается в C_max≈0.70, exp2(lvl) не
ограничен). Свип γ×MULT подтвердил: текущий оптимум (0.344/4.2) лучший, слепая ограничен). Свип γ×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). межполосного суммирования масок/acc ещё не локализована (см. пере-скоуп Шага 2).
Критерий: `verify_bit_exact.py` — побайтовое совпадение данных-чанка WAV. Критерий: `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. Что НЕ делать (подводные камни из дока) ## 2. Что НЕ делать (подводные камни из дока)
@@ -174,6 +214,11 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
Bridge — только запасной вариант, пока структурная цепочка не пройдёт Шаг 1-2. Bridge — только запасной вариант, пока структурная цепочка не пройдёт Шаг 1-2.
- **НЕ использовать битые 24-bit загрузчики** — метрика `render_parity.py:43` правильная - **НЕ использовать битые 24-bit загрузчики** — метрика `render_parity.py:43` правильная
(x>=0x800000 => x0x1000000). В тестовых скриптах использовать тот же код. (x>=0x800000 => x0x1000000). В тестовых скриптах использовать тот же код.
- **НЕ редактировать XML `<PARAM>` в RPP ради изменения звука** — это декоративная
UI-копия, плагин берёт стейт из бинарной части чанка (NOTES 22c). Только мост
`setparam.lua`.
- **НЕ читать WAV наивным readframes+reshape** — REAPER пишет bext/junk-чанки; только
каноничный `render_parity.load` (иначе фантомный шум/клиппинг, NOTES 22c).
## 3. Риски и время ## 3. Риски и время
@@ -187,17 +232,18 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
## 4. Точка входа для следующей сессии ## 4. Точка входа для следующей сессии
1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md:820-840` 1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md`
(точная цепочка) + апдейты 20j/21a/21b/21c (IIR3 bidi, combine-семантика, апдейты **20j / 21a-21e / 22a-22e** (цепочка, Phase-B негативы, Шаг 7 опровержение,
структурный корпус) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp` (live-таблицы). параметр-мост, пол blend·ln10/20) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp`.
2. Собрать: `cmake --build dsp/build --target render48k framed_test`. 2. Собрать: `cmake --build dsp/build --target render48k framed_test`.
3. Бейзлайны: `python3 scripts/corpus.py` (bridge, 62 случая, §0) и 3. Бейзлайны: `python3 scripts/corpus.py` (bridge, 62 случая, §0) и
`python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json` `python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json`.
(структурная цепь на внутренней сетке). 4. ПРИОРИТЕТ №1 — **Шаг 9** (пол редукции):
4. ПРИОРИТЕТ (закрытие разрыва формы кривой редукции): a. 9a: полный декод FUN_180529c60 + FUN_1804d56b0 (f_529c60.dis готов).
a. СТАТИКА: hunt clamp/насыщения в level-пути — `vminpd/vmaxpd/minsd/maxsd` в b. 9b: grep 0x1824c3cd4 по аудио-функциям; hunt клампа маски.
FUN_18052d650 (IIR1), инлайн IIR2, scale-шаг; семантика FUN_180323f20 и c. 9c: предсказания пола — рендеры mix/sens через `setparam.lua` (мост готов,
depth-скаляра 0x540888. Если clamp найден — транскрибировать, smoke + корпус. XML-правки стейта НЕ работают — NOTES 22c).
b. Если статика исчерпана — Шаг 7: live-захват BandConfig ctx+0x188 по d. 9d: порт + корпус с гейтом.
NOTES_CAPTURE.md; сначала разрешить противоречие A/B/γ между сессиями 5. Инструменты сессии: `setparam.lua`/`dump_params.lua` (параметр-мост),
(render_long/t1kq: 24/28/1 vs fit по точкам рефов: 13.78/68.29/0.344). `scripts/rpp_setparam.py` (только формат-хирургия!), `RT_LUT_*` env в
framed_model.cpp (солвер констант), `scripts/step7_capture.py` (live BandConfig).