# Roadmap: bit-exact реверс DSP-ядра oeksound soothe2 (v1.1.2) ## Цель Воспроизвести DSP-путь soothe2 в виде **собираемого standalone C++** с **побайтово идентичным** выходом (bit-exact). ## Результат `re-tools/dsp/` — `*.cpp/*.h` (классы DSP), `CMakeLists.txt`, `harness.cpp` (WAV16 → рендер → WAV24), `dsp_notes.md` (карта функция↔смысл), `verify_bit_exact.py`. ## Статус — см. `README.md:13` (единственный источник TOTAL) > **Итог 2026-08-28 (24mm14):** применение декодировано до формул `mask=10^(−cut_D/20)`, `cut_D=α·ln1p(lvl/β)+c` (rms ≤0.016, 3 семейства), слой STFT без синтез-окна, dual-корпус 0.193 dB (канон 3.264). Гейт = bit-exact. Остаток: 3 шага `BITEXACT_PLAN.md:1` (каскад 9–19, k-маппинг, Δ-правило). Архив B-фаз ниже свёрнут.
История B-фаз (B.1…P4.3) — свёрнуто, детали → handoff/archive/ + git log - **Статический декомп ~95%**: twin, generator case8, level-path (0x529fe0/0x563440/0x563a60), mask-apply, IIR-трекеры, FFT-conv (0x535a70), render-loop FUN_18052e260 — `.dis` в `handoff/nls_dasm/`. - **Структурная цепь** `dsp/framed_model.cpp::process_band_structural` (48k/4096): `scale→LUT(level)→IIR1→IIR2→mirror→blend/exp2→combine→dual-warp→IIR3×2→dry/wet`; live-таблицы `rt_mask_tables`. Корпус: comb 6.12 (bridge 10.15), res 0.44. - **Численная модель B.10…B.15**: `C=g·LUT(xv)+w·warp^a`, `gain=(1−C)·res^rp`, rp=0.0275·Q^0.2159 (mean 0.175), Pchip LUT (dual 0.027). Канон — `framed_render.py` (исторический). - **Фазы P1–P5**: twin float-parity 1.27e-5, FFT-conv, leveltrack, LUT, mask-apply — в основном готово; осталось каскад 9–19 + twin/am + Δ. ### Ключевые находки (итог, свёрнуто) - Маска аддитивная `C=g·LUT+w·warp^a` (не мультипликация). - `res_power` `gain=(1−C)·res^rp` — закрывает 500Hz residual. - `0x530d30` дважды NEGATIVE — тилт не оттуда. - LUT — гамма-монотонная `FUN_180563440` (Pchip немонотонна). - Константы: SCALE=1/1024, DB_CONV=8.6859, IIR α=0.1, LCG 0x3cdca.
## Контракт из manual (`soothe2_ManualFAQ.pdf`) | # | Факт | Следствие | |---|---|---| | M1 | Soft/Hard меняет всё | mode = препроцессор детектора | | M2 | Depth ±18, до 60 dB | depthcurve-LUT, clip 60 dB | | M5 | Attack/Release частотно-зависимы | Env — частотный масштаб | | M8 | Stereo link/balance/L-R vs M/S | детектор на sum | | M10 | Банды: 2 cut + 4 general | `FilterGraph` | ## Топология пайплайна (Приложение A, стр.30) ``` main/sidechain → input trim → analysis (depth/sharpness/selectivity; EQ per-band) → stereo apply + balance → ms encode? → processing (M/S) → mix → bypass → output ``` ## Журнал вех (свёрнуто) | Веха | Дата | Суть | |---|---|---| | B.1–B.6 | 08-17 | C++ каркас, twin, dispatch, band-структура | | B.10–B.15 | 08-18…19 | Модели C/LUT, bridge `C=g·LUT+w·warp^a` (0.236), res_power, dB-parity 0.268 | | P4.1–P4.3 | 08-20 | Декомп FUN_180529fe0, live-таблицы, dual-warp | Полный журнал — `handoff/NOTES_LEVEL_INDEX.md` + `git log`. ## Где лежат детали - `README.md:13` — актуальный статус (TOTAL). - `handoff/NOTES_LEVEL.md` (живая голова) + `handoff/archive/NOTES_LEVEL_2026-08-18_2026-08-23.md` — журнал. - `handoff/BLOCKMAP_529fe0.md` — карта метода 9–19. - `handoff/NOTES_TWIN.md` — twin краткая справка. - `handoff/NOTES_CAPTURE.md` — registry heartbeat. - `notes_giant_fft.md` — FFT/twiddle.