Full dsp/ check sweep green. fft.cpp = numerical radix-2 (std::cos) not bit-exact
0x140a70; split-radix butterfly + plan-gen giant + sin-table loader remain (multi-week
P3). Required only for FFT-conv byte-parity, not for the bridge renderer.
Extracted the 8x16 irrational tables + lead-in -708.4xx series from soothe_mem.bin
into exp2_tables.{hpp,cpp} (P3 bit-exact inputs). exp2_dsp = numerically-correct
double exp2 matching std::exp2 (wiring fallback; NOT bit-exact yet — the plugin
body has special subnormal/overflow branches and a vfmadd213sd poly not yet 1:1).
exp2_check: 2e6-grid PASS (0 cells >1e-13).
Wiring FFT-conv step5 (mask*=win) gives mean 5.2, combine/acc (att/rel from kRTAtt/
kRTRel) gives 4.7 vs base 0.75-0.80 on representative subset. Both belong to the
exp2(mask) structural chain (blend 0.8 + bigkernel) NOT the fitted bridge final-gain.
No code change; bridge + Pchip stays canonical (0.773).
All previously-derived parametric LUT forms (u563a60 A=-13.78/68.29/0.344, lut5/
lut4 gamma-LUT, power-law, linear 0.483/0.717, real extracted points) tested on the
full 59-case honest 24-bit metric within one fixed bridge pipeline. None beat the
committed Pchip (0.773; worst powerlaw 6.8). F1 closed: parametric curve production
was already done, none accepted; structural A/B/gamma from ctx+0x188 remains the only
path to bytes (blocked on level-path object live capture).
Two test RPPs (res_only1_500 4s, t1kq_only1_1000 6s) rendered twice each via
reaper -nosplash CLI. Data chunks identical across runs AND byte-identical to the
committed reference wavs. Whole-file differs only in the bext render-timestamp.
=> bit-exact (bytes) is REACHABLE; the per-run-dithrandization blocker is closed.
Next: exact structural chain + kernels + internal 48000/4096 geometry + live A/B/gamma.
- sqrt-Hann analysis regressed (0.788/2.91) vs committed Hann-Hann (0.774/2.12).
- Full-corpus G/W/A/rp mask-level fit (0.66) regressed in OLA render (0.812/2.37);
the render metric is the only honest one.
- Residuals level-dependent (t1k_b1f loud +0.8..2.9, al low -1.1..-1.8); solution =
structural A/B/gamma band LUT, combine/acc 0x5407c8 + FFT-conv 0x535a70 (todo #3).
Replaces stale exp2(am/res) chain description + wrong metrics with the actual
honest state: C=G*LUT(log10(am/res))+W*warp^A, gain=(1-C)*res^rp; dual<=0.72,
fc-scan<=0.59, corpus mean 0.77. Documents the 24-bit metric trap, negative
broadband test, and the remaining structural gaps (combine + FFT-conv, A/B/gamma).
Windowed-FFT of dual ref: gain@500=0.309, gain@2000=0.292 but gain@1000 (empty bin)=0.995
=> reduction is per-bin (am_k/res_k), NOT broadband — validates model structure.
16-knot monotone LUT (floor .35/cap .70) regressed corpus mean 0.77->1.09; reverted.
t1k_b1f/al residuals rooted in am-normalization / input-level differences, not LUT shape.
Systematics isolated: Pchip LUT frozen cap under-predicts loud tail (t1k_b1f needs
LUT 0.70 at xv 0.85), over-predicts low tail (al lv24 needs 0.35 at xv -0.5).
Real LUT extracted from refs; parametric fit A=-13.78/B=68.29/g=0.344 regresses dual
(rejects in full render). Structural next: decode BandConfig ctx+0x188 writers.
Crucial: earlier dual ref -53.7 dB was a 24-bit-misdecoded artifact; honest ref is
-10.2 dB flat. Root cause of the "dual paradox" was a metric bug + missing log-domain
LUT. Ported the documented bridge (NOTES:147) into framed_model.cpp:
xv=log10(am/res); C=G*LUT(xv)+W*warp^A; gain=(1-C)*res^rp.
Results (honest 24-bit metric): dual (fc=500 q-sweep) err <=0.7, t1kq fc-scan
err <=0.59. All empiric numbers explicitly marked. Structural A/B/gamma + combine/
FFT-conv still pending.
Fixes structural divergences: IIR1 into shared 0x5406f8 buffer + bridge to band
mask (FUN_18052d650, 0x5160); IIR2 on band mask; Hermitian mirror (0x11940);
blend step f6f8=axis(1-mix)+mix*0.8, mask=exp2(-mask)*f6f8; real combine via
kRTAtt/kRTRel weights (0x5406c8/6e8); warp, IIR3x2, dry/wet.
Validation: t1kq only1 fc1000 -21.1 vs -22.1 (OK); fc-scan shape intact;
dual @500 matches (s30 -51.5 vs -53.7), @2000 gap -4..-13 vs -29.6 remains.
That gap = dB-domain band LUT (FUN_180563a60) not yet in chain -> Phase A.
res=|2B/A| is minimal at band centre (not maximal). Model uses xv=log10(A_k/res_k)
=> level = am / res. Old am*res inverted the fc-response (cut more off-center).
Fixed; fc-scan (tone1kq, band fc 800..1200 via t1kq_only1_<fc>) now tracks the
reference: scale=42 mean|err| 2.46 dB, intact shape (deepest at fc==tone). Was
flat+inverted before. Remaining under-cut off-center -> FFT-conv smoothing/gaps.
CRITICAL fix: soothe_mem.bin is VA-linear (offset=RVA). DAT_18262b5c8/b704/b700
are INT 1 (cvtdq2ps -> 1.0), NOT the 0.4552/0.6089/0.6070 read earlier via a bad
section offset. Transcribed FUN_180529fe0 PRNG prologue into prng_fvar30():
fVar30=(int)(LUT[s+1]*LUT[s]+0.001). At live state 112 this is deterministically
1.0 over 300 frames, so scale level *= (1/2048)*440.95 is not randomized in
practice. Scale coefficient now computed structurally; t1kq unchanged -0.43 dB.
.gitignore used '*' as ignore-all with only extension whitelists, so the 128
handoff/nls_dasm/*.dis + 6 *.bin disassembly outputs (f_563a60, f_56e3e0,
f530850_full, f_52b570, fft, twin, ...) were NOT tracked - data-loss risk.
Now un-ignore handoff/nls_dasm/*.{dis,bin} explicitly. Heavy .bin dumps
(soothe_mem.bin etc.), logs, wav/rpp, dl/lib/bin/ghidra-proj stay ignored.
Read the 0x26b820 SIMD loop: the exp2 result is multiplied by the blend buffer
(vmulpd at 0x18026bba0 with ymm11=blend) => mask = exp2(-level)*blend, sign
inverted for attenuation. framed_model.cpp corrected to exp2(-scratch)*0.8.
Calibrated level_scale=600 -> t1kq err -0.06 dB (ref -14.98). comb per-tone
errors reduced (max ~7.8 dB); warp/FFT-conv smoothing still approximated.