docs: sync BITEXACT_PLAN/roadmap/AGENTS to 2026-08-21 state
BITEXACT_PLAN: structural column in S0 table; Step 2 re-scoped (combine thunk semantics, acc has no single-band consumer; FUN_1805316e0 is a coefficient writer NOT a mask combiner — fixed in Steps 2/8); Step 4 FFT-conv downgraded to P3 (window near-flat); Step 6 pipeline done (render48k); entry point = saturation hunt then Step 7 capture. roadmap: status 2026-08-21, P4 row + ~80% estimate with dual-canon results. AGENTS: two-canon model description, render48k/corpus_structural commands, stale-binary sweep hazard warning, updated gaps list.
This commit is contained in:
@@ -4,10 +4,11 @@ Bit-exact реверс DSP-ядра oeksound soothe2 (VST3) → транскри
|
||||
Полное журналирование — в `handoff/NOTES_LEVEL.md`, `handoff/NOTES_TWIN.md`,
|
||||
`handoff/NOTES_CAPTURE.md`, `roadmap.md`.
|
||||
|
||||
> **Текущая фаза: bit-exact НЕ достигнут** — мы на dB-параллели (полный корпус mean 1.594
|
||||
> dB, comb 10 dB). Путь к байтам — в `BITEXACT_PLAN.md` (8 шагов, порядок и критерии).
|
||||
> ЭТОТ ФАЙЛ ЧИТАЙ ПЕРВЫМ. Bridge-модель — запасной канон; структурная цепочка
|
||||
> FUN_180529fe0 (Шаг 1-2 плана) — целевая.
|
||||
> **Текущая фаза: bit-exact НЕ достигнут** — dB-параллель двумя канонами: bridge
|
||||
> (корпус mean 1.594 dB, comb 10.1) и структурная цепь FUN_180529fe0 на 48k/4096
|
||||
> (comb **6.12** — уже лучше bridge; однополосные хуже; разрыв = насыщение кривой
|
||||
> редукции). Путь к байтам — в `BITEXACT_PLAN.md` (8 шагов, пере-скоуп Шага 2).
|
||||
> ЭТОТ ФАЙЛ ЧИТАЙ ПЕРВЫМ. Bridge — запасной канон; структурная цепочка — целевая.
|
||||
|
||||
## Золотое правило (обязательно)
|
||||
1. **Цель — bit-exact реверс кода**, НЕ эмпирическая подгонка кривых. Каждый параметр
|
||||
@@ -20,20 +21,32 @@ Bit-exact реверс DSP-ядра oeksound soothe2 (VST3) → транскри
|
||||
|
||||
## Сборка и тесты (канон)
|
||||
```bash
|
||||
# собрать библиотеку + framed_test
|
||||
# собрать библиотеку + framed_test (bridge, 44.1k) + render48k (структурная цепь, 48k/4096)
|
||||
cmake -S dsp -B dsp/build
|
||||
cmake --build dsp/build --target framed_test
|
||||
cmake --build dsp/build --target framed_test render48k
|
||||
|
||||
# рендер через каркас (N=2048, hop=512, SR 44100, sqrt-Hann OLA)
|
||||
# bridge-рендер (N=2048, hop=512, SR 44100, sqrt-Hann OLA)
|
||||
# формат полосы: fc,q,sens,level_scale (одна полоса в comma-форме)
|
||||
./dsp/build/framed_test /home/m/soothe-bt/tone1kq.wav /tmp/o.wav 678.7611083984375,0.99999785,12,600
|
||||
# многополосный: через отдельные аргументы fc q sens scale (см. framed_test.cpp)
|
||||
|
||||
# структурный рендер (внутренняя сетка 48000/4096: resample -> FUN_180529fe0 chain -> resample)
|
||||
./dsp/build/render48k /home/m/soothe-bt/tone1kq.wav /tmp/o48.wav 1000,0.99999785,12
|
||||
|
||||
# корпусные прогонки (62 случая, честная 24-bit метрика)
|
||||
python3 scripts/corpus.py # bridge + guard --compare
|
||||
python3 scripts/corpus_structural.py # структурная цепь
|
||||
python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json
|
||||
|
||||
# отдельные модули (bit-exact черные проверки)
|
||||
cmake --build dsp/build --target twin_check tables_check fftconv_check vlog_check leveltrack_check levelpath_check
|
||||
cmake --build dsp/build --target twin_check tables_check fftconv_check vlog_check leveltrack_check levelpath_check fn529fe0_check exp2_check
|
||||
./dsp/build/twin_check # float-parity twin-резонатора
|
||||
```
|
||||
|
||||
> **TOOLING HAZARD**: cmake пропускает пересборку при изменении исходника в ту же секунду —
|
||||
> параметрические свипы молча гоняют STALE бинарь. Протокол: `touch` исходника перед сборкой +
|
||||
> проверять свежесть mtime бинаря (пример: /tmp/sweep_fresh.py паттерн в NOTES_LEVEL:21a).
|
||||
|
||||
### Метрика (tone-cmp, Goertzel stead-state)
|
||||
Сравнивать **тримкнутый** выход (длина = длина входа) с референсом `*_ref.wav` / `t1kq_b1f_*`:
|
||||
```python
|
||||
@@ -55,9 +68,11 @@ err = db(ta(out,1000)/ta(ref,1000)) # err в dB, цель <0.1
|
||||
Тестовый корпус (`/home/m/soothe-bt/`, вне git): `tone1kq.wav`(вход),
|
||||
`t1kq_b1f_<fc>.wav` (рефы), `comb.wav`/`comb_ref.wav` (мультиполосный).
|
||||
|
||||
## Текущее состояние (2026-08-20, P4)
|
||||
## Текущее состояние (2026-08-21, P4)
|
||||
|
||||
**Реализованная модель в `dsp/framed_model.cpp`** — BRIDGE-канон (NOTES:147, honest):
|
||||
**ДВА канона в `dsp/framed_model.cpp`:**
|
||||
|
||||
1. **BRIDGE** (эмпирическая погона, путь framed_test 44.1k, NOTES:147):
|
||||
```
|
||||
am_k: smoothed amp (2|X|/wsum, att~11ms/trel~80ms)
|
||||
xv = log10(am_k / res_k) res_k = |2B/A| twin (min@band centre)
|
||||
@@ -65,27 +80,43 @@ C = G·LUT(xv) + W·warp(f_k)^A G/W/A = 0.9963/0.3335/0.9807 (f
|
||||
gain_k = (1−C) · res_k^rp(Q) rp(Q) = 0.0275·Q^0.2159
|
||||
LUT = monotone cubic (Fritsch–Carlson) через joint-fit узлы (al_* + B.11 anchors)
|
||||
```
|
||||
2. **СТРУКТУРНАЯ цепь FUN_180529fe0** (`process_band_structural`, внутренняя сетка
|
||||
48000/4096 через `dsp/build/render48k`, NOTES_LEVEL:820-840 + апдейты 20j–21c):
|
||||
```
|
||||
scale → LUT level-domain (t^γ·MULT, γ=0.344 decomp / MULT=4.2 placeholder)
|
||||
→ IIR1 → IIR2 → mirror → blend(0.8)/exp2(−lvl) → combine(acc-update, без консюмера)
|
||||
→ dual-warp(kBand768·kWarp·res^rp) → IIR3 bidirectional ×2 → dry/wet(identity)
|
||||
```
|
||||
- **METRIC CRITICAL**: рефы 24-bit НЕЛЬЗЯ читать 16-bit кодеком (даёт phantom −53 dB);
|
||||
`render_parity.load` (sw handling) + окно 3.5s — канон. dual honest ref = −10.2 dB FLAT.
|
||||
- **Broadband-hypothesis ОПРОВЕРГНУТА** (NOTES:2026-08-20s): редукция per-bin (tone-бины
|
||||
режутся, пустые bin ~1.0);
|
||||
- **Честные результаты (24-bit метрика, окно 3.5s, trimmed)**: dual (band fc=500,
|
||||
q-sweep) err ≤0.72; t1kq fc-scan (only1 800..1200) err ≤0.59; al_* lv3-12 err ≤0.43;
|
||||
полный корпус mean|err| 0.77, max 2.12 (t1k_b1f loud +2.1, al lv18/24 low-level −1.8).
|
||||
- Эмпирика (G/W/A/rp/LUT-узлы) ЯВНО помечена в коде и NOTES; структурные лэкеры ниже.
|
||||
- **Broadband-hypothesis ОПРОВЕРГНУТА** (NOTES:2026-08-20s): редукция per-bin.
|
||||
- **Честные результаты**: bridge корпус mean 1.594 (comb 10.15 сломан); структурная цепь:
|
||||
comb **6.12** и res **0.44** — лучше bridge; t1kq 0.77 / t1k 2.11 / al 0.99 / dual 3.26 — хуже.
|
||||
Полная таблица: BITEXACT_PLAN §0 / NOTES_LEVEL:21c.
|
||||
- **ГЛАВНЫЙ ОТКРЫТЫЙ РАЗРЫВ**: насыщение кривой редукции — реальная упирается в C_max≈0.70,
|
||||
exp2(−lvl) не ограничен (dual@500: константный −6.7 dB при всех q). Лечится Шагом 7
|
||||
(live-захват A/B/γ) или статическим hunt'ом clamp'а в level-пути. Слепая подкрутка
|
||||
γ/MULT исчерпана (свип 21c).
|
||||
|
||||
### Открытые bit-exact/структурные пробелы (см. NOTES_LEVEL.md)
|
||||
1. `combine/аккумулятор 0x5407c8` (аддитивные веса 0x5406c8/6e8) + `FFT-conv 0x535a70`
|
||||
(сглаживание маски) — НЕ замкнуты в цепь; структурно могут закрыть t1k_b1f/al хвосты.
|
||||
2. BandConfig `ctx+0x188` A/B/γ (параметрический LUT 0x563a60) — не live-захвачен;
|
||||
писатели = JUCE param plumbing (статически исчерпаны).
|
||||
3. PRNG-пролог (LCG+LUT → fVar30) — залочен (fVar30=1 при live state 112), dry/wet rnd импорт.
|
||||
4. Бит-экзактный exp2 (0x26b820) вместо std::exp2; SR-mismatch 48000/4096 vs 44100/2048.
|
||||
1. Насыщение кривой редукции (см. выше) — приоритет №1.
|
||||
2. `combine/аккумулятор 0x5407c8`: семантика декодирована (21b), но acc/f6f8 НЕ имеют
|
||||
однополосного консюмера — искать точку потребления (межполосный каскад). ВНИМАНИЕ:
|
||||
`FUN_1805316e0` = writer коэффициентов, НЕ комбинер масок.
|
||||
3. BandConfig `ctx+0x188` A/B/γ — противоречие между сессиями (−24/28/1 vs −13.78/68.29/0.344);
|
||||
разрешить при захвате.
|
||||
4. PRNG-пролог (LCG+LUT → fVar30) — залочен (fVar30=1 при live state 112), dry/wet rnd импорт.
|
||||
5. Бит-экзактный exp2 (0x26b820); FFT-conv понижен до P3 (окно near-flat, NOTES:18c);
|
||||
SR-геометрия 48k/4096 сделана (render48k).
|
||||
|
||||
## Структура ключевых файлов
|
||||
- `dsp/framed_model.{cpp,hpp}` — C++ порт mask-apply цепи (ГЛАВНЫЙ активный файл).
|
||||
- `dsp/framed_test.cpp` — CLI рендер входа (3010 метрика см. выше).
|
||||
- `dsp/{twin,levelpath,freqpath,fftconv,vlog,leveltrack}.cpp` — расшифрованные модули.
|
||||
- `dsp/framed_model.{cpp,hpp}` — C++ порт mask-apply цепи: bridge-канон + структурная
|
||||
`process_band_structural` (ГЛАВНЫЙ активный файл).
|
||||
- `dsp/render48k.cpp` — пайплайн внутренней сетки 48000/4096 (resample → структурная цепь → resample).
|
||||
- `dsp/framed_test.cpp` — CLI bridge-рендер входа (метрика см. выше).
|
||||
- `scripts/corpus.py` — корпусный харнесс bridge + guard `--compare baseline_bridge.json`.
|
||||
- `scripts/corpus_structural.py` — тот же корпус через render48k + режим `--vs-bridge`.
|
||||
- `dsp/{twin,levelpath,freqpath,fftconv,vlog,leveltrack,fn529fe0}.cpp` — расшифрованные модули.
|
||||
- `dsp/rt_mask_tables.{hpp,cpp}`, `rt_weights.{hpp,cpp}` — live-таблицы.
|
||||
- `handoff/NOTES_LEVEL.md` — полный журнал уровня/маски (самый актуальный).
|
||||
- `handoff/nls_dasm/` — 134 дизассембла декомпа.
|
||||
|
||||
Reference in New Issue
Block a user