step7: live BandConfig capture infra + FUN_180563a60 decode — GUI-only, audio path refutes premise (22b)

This commit is contained in:
2026-08-22 15:28:01 +03:00
parent c222e054ca
commit 7fac8b2a4f
5 changed files with 304 additions and 5 deletions
+44
View File
@@ -1391,3 +1391,47 @@ NEXT (приоритеты без изменений):
возможная контент-зависимая ветка. Требует REAPER+плагин.
2. combine consumer hunt (межполосный каскад) для dual/comb.
3. Опционально: transient-анкоры для проверяемости temporal-класса.
## ============ UPDATE 2026-08-22b: STEP 7 EXECUTED → PREMISE REFUTED (BandConfig = GUI-only) ============
Инфраструктура захвата готова и работает:
- `scripts/step7_capture.py <rpp>` — spawn reaper (+play.lua realtime) → chunked snapshot
хоста yabridge → fingerprint level_gain-пар (level[j]==j/1024 exact) → u64-ref голосование
базы level-path объекта (+0xe0+band*0x18) → decode всех BandConfig вокруг базы.
- `play.lua` ИСПРАВЛЕН: reaper.Sleep НЕ существует в API (падал скрипт, транспорт
продолжал играть без keep-alive) → цикл reaper.defer.
- Грабли: /proc/<pid> vs /proc/<pid>/mem (pread каталога = тихий EIO на всё); layout
объекта ПЛАВАЕТ между сессиями → оффсеты BandConfig не хардкодить, только fingerprint.
Живые константы (7 захватов: render_long, t1kq_base, t1k_b1f_1000, al_12, al_24,
dual_b1q_0.5, comb_base — ВСЕ идентичны):
- cfg@obj+0x168: **A=24.0 B=+28.0 γ=1.0 flag=0 cb=SET** («кривая редукции»)
- cfg@obj+0x170: A=16.0 B=20000.0 γ=1.0 cb=SET; shaper f32 @+0x20..: 0.55, 7.130898,
2.772589(=ln16), 2.718282(=e)
⇒ противоречие gap #3 разрешено: −24/28/1 подтверждено живьём; 13.78/68.29/0.344
был ФИТОМ к рендер-референсам, не свойством плагина.
FUN_180563a60 расшифрован ДО КОНЦА (f_563a60.dis, 165 строк):
- вход: mask-doubles obj+0x4198+band*0x2000 (пишет FUN_18056e3e0 из band-list
+0x178→[+0x78/+0x84]); x-axis пар = j*(1/1024) (конста 0x24c3c50);
dB = logf(mask)*8.685889 (=20/ln10, 0x24c43e0);
- выход: gain[j] = clamp01(cb(A,B,dB)) где cb = std::function @cfg+0x90 — В ЖИВЫХ
ЗАХВАТАХ cb ВСЕГДА SET ⇒ статическая ветка A/B/γ НЕ ВЫПОЛНЯЕТСЯ НИКОГДА;
- статическая ветка (cb==NULL, для протокола): t=clamp01((dBA)/(BA));
γ==1 → t; flag==0 → t^γ; flag!=0 → 0.5·(1+sign(2t1)·|2t1|^γ).
Callgraph: весь кластер 5631c0/563260 → 563440 → {56e3e0, 563a60} достижим ТОЛЬКО по
DATA-xrefs (vtables 1826a03cc..420, 1824b14f0..510) — GUI-timer heartbeat. АУДИО-метод
FUN_180529fe0 (Soothe2Module<float>::vtbl) НЕ ссылается на {+0x168,+0x170,+0x178,
+0xe0,+0x198,+0x4198}; его callees — только memcpy-туннели (181ba94b0 ×13, 52dbc0, 52d920).
Файл /tmp/consumers_out.txt восстановлен из decomp_funs.txt (215 строк, вне git!).
### ВЫВОДЫ (меняют приоритеты)
1. **Шаг 7 BITEXACT_PLAN в исходной постановке ОПРОВЕРГНУТ**: BandConfig A/B/γ питает
только GUI-отрисовку кривой, аудио-путь его не читает. Live-захват A/B/γ не может
закрыть насыщение кривой редукции аудио-цепи.
2. LUT-блок структурной цепи (t^γ·MULT с 13.78/68.29/0.344/MULT=4.2) = EMPIRICAL фит
БЕЗ декомп-источника в аудио-пути (формула списана с GUI-функции!). Помечен EMPIRICAL;
канон не меняем (корпус держит), но источник правды теперь внутри аудио-модуля.
3. Новый приоритет №1: полный разбор аудио-тела FUN_180529fe0 (215 строк декомпа,
/tmp/consumers_out.txt) + combine-consumer hunt — насыщение C_max≈0.70 сидит там.