Commit Graph
100 Commits
Author SHA1 Message Date
Matiq fc224b00a3 24n: unified stage-S law cutS=alpha*ln1p(lvl/0.3824)+Delta(b) — same beta both branches, Delta=+4.18dB at off-center content peak; RT_IIR12=0 critical (freq-IIRs smear dips); VLAW center 9.40 vs ref 10.32; ramp trajectory confirms gamma0 (+0.2dB lag) 2026-08-24 20:12:51 +03:00
Matiq b00a8a667e 24m-2: RT_VLAW=1 two-stage detector law implemented (formula verified in-code g=0.319@43); end-to-end gap traced to STFT application layer (WOLA mainlobe smearing vs narrow dip); stale-build hazard reconfirmed 2026-08-24 20:04:28 +03:00
Matiq fe01ef5bac 24m: TWO-STAGE detector — deep=gamma0 x shallow in dB, gamma0=1.79+-0.02 constant across bins/q/levels (explains 1.805/1.8345 family); skirt branch 7.57+2.70*ln(1+lvl/0.341) rms 0.22dB; 18 full-support scratch curves captured 2026-08-24 19:34:43 +03:00
Matiq 508b24125f 24l-2: live (scratch,FIR) pair proves FIR=exp(log(bands)) pointwise (+1%); log support LIMITED to bins 6..623 -> unity passband mechanism; applied = 1.019*B^1.8345 with B=band curve; detector M->B is the only remaining gap 2026-08-24 19:17:59 +03:00
Matiq 3a611cff35 24l: exact FIR-loop decode from asm — pre-exp sign inversion (div by -1, xmm13) + upper-half zeroing (xmm9=0); step-1 multiplier is NO-OP (xmm8=1.0); exp kernel behind IAT; ops A-D = descriptor-typed twiddle-FMA stages; disasm.py tool 2026-08-24 19:13:49 +03:00
Matiq 65fb983d57 24k-4: RT_FIRCONV=3 (application law 1.019*M^1.8345); rendersnap2 wav-path hazard fixed (RENDER_FILE parse, was destroying refs — dual_b1q_1.0.wav restored); corpus TOTAL 2.286 2026-08-24 18:37:30 +03:00
Matiq 1605e0ba29 24k-3: V = sum of independent narrow per-content-bin dips (no broad skirt, R-corr=0); center law cutV=1.7436*ln(1+lvl/0.3824) rms 0.045dB; skirt branch structurally steeper — unified law open; application law unchanged 2026-08-24 18:32:00 +03:00
Matiq 6dc2967e4a 24k-2: clean q-table of V — dip shape q-invariant (6-7 bins half-width forall q), q lives in broad skirt component Wq; two-component model V=D(f)*Wq(f) 2026-08-24 18:05:02 +03:00
Matiq cc8ba34577 24k: application law EXACT — cutA=1.8345*cutV+0.1615dB (rms 0.0025dB, 8 drive levels); x1.805 = exponent product 0.984x1.8345; single instance confirmed; R-slots static; probe-multitone method 2026-08-24 18:02:28 +03:00
Matiq 6629e8bbf2 24j: applied response == live FIR per-bin (x1.805 revoked as stale-kernel phantom); R-slots static twin template; rendersnap2 soft snapper + probe-multitone method 2026-08-24 17:35:27 +03:00
Matiq 475b1958d5 fix: corpus 24-bit loader + LUT calibration env var
- Fix reshape error in corpus.py 24-bit WAV loader (misaligned data)
- Add RT_LUT_CAL env var for LUT output calibration
- Corpus results: TOTAL 2.397 (bridge 1.594), comb improved (-4.032)
- Structural chain regresses on t1kq/t1k/al/dual due to LUT curve mismatch
- The LUT produces different frequency response than plugin's FIR construction
2026-08-24 15:18:39 +03:00
Matiq a1632a9fce fix: persistent IIR state eliminates ×1.805/×2.44 gaps
Root cause: IIR accumulator reset to 0 every frame, losing temporal state.
Fix: static thread_local accumulator persists across frames.

Results (dual_b1q_0.5, reaper render):
  cut@500 = -10.32 dB (EXACT match, was -14.35)
  cut@2000 = -11.82 dB (EXACT match, was -6.58)

Both the ×1.805 (OLA normalization) and ×2.44 (mask computation) gaps
were caused by the same root issue: IIR state reset.
2026-08-24 14:31:55 +03:00
Matiq 0e4d3177fe feat: ×1.805 confirmed — OLA normalization factor (24i)
Steady-state simultaneity test: 60 captures, mask constant at 0.5099,
fir constant at 0.5241, actual cut -10.32 dB.
Ratio actual/fir = 1.839 ≈ ×1.805 from 23e/24e.
Two independent error sources identified:
  1. Mask computation: 0.209 vs 0.510 (×2.44, LUT issue)
  2. Application: per-bin vs FIR convolution (×1.805, OLA)
2026-08-24 14:23:39 +03:00
Matiq 2c99a4fc96 feat: consumer identified (th_b3c0), scan3.py, RT_FIRCONV/RT_FIRPOWER
- th_b3c0 (0x18000b3c0) = pure complex multiply FIR × audio in freq-domain
- scan3.py: pre-scan approach finds ctx in 1.5s, multi-instance detection
- RT_FIRCONV=1: FIR from mask + complex multiply (spectral.cpp)
- RT_FIRPOWER=1: power-law mask from raw spectrum (framed_model.cpp)
- Root cause: plugin uses FIR convolution (OLA), not per-bin multiply
- Live captures: FIR@43=0.524, mask@43=0.510, final gain=0.305
- Best result: RT_LUT_OFF gives cut@500=-8.18 dB (ref -10.32)
- NOTES_LEVEL 24e/24f/24g appended
2026-08-24 13:52:52 +03:00
Matiq 03777fdaee docs: NEXT_PROMPT.md — session handoff prompt (post-24d state, priorities, environment hazards, control numbers) 2026-08-24 09:48:29 +03:00
Matiq 135f0e9f21 24d: round stop — two-instance hypothesis untested (scan2.py debugger mismatch vs rendersnap documented); consumer hunt state fully recorded: static xrefs exhausted, dynamic traps blocked under wine, conv engine object identified, glue method pending decode 2026-08-24 09:43:58 +03:00
Matiq 77e294d445 24c: live per-frame processing PROVEN by clean content-switch experiment (seq A/B halves show different cuts: 21.91 vs 25.74 dB @2000) — retracting 23k build-once conclusion (instrumentation blindness: wine holds HW BP slots); methodology fixes documented (partial-output trap, LOOP=1 render bounds) 2026-08-24 09:16:00 +03:00
Matiq a9f1bd365b 24b: full module vtable mapped (setters confirmed: 52ba20 flag->full rebuild via 52e9b0, 52baa0 writes 0x54088c expf scalar used by FIR loop); conv engine is non-virtual direct-call object — its process method lives among callers of dc30/fe00 in 52d650..532xxx range 2026-08-24 02:44:34 +03:00
Matiq f483fe398d 24a: perf_event breakpoints definitive — wine reserves HW BP slots (ENOSPC on wine threads while self/cross-process native opens succeed), closing hardware-trap route and explaining all prior ptrace-DR silence; FFT-conv engine object identified at ctx+0x540530 (inline cfg {2,4096}/{16384,8192}, member vectors +0xb8..+0x130, methods dc30/fe00/dd30) — its process method is the kernel consumer candidate 2026-08-24 02:43:04 +03:00
Matiq 8acbf6612e 23m: round final — DR-trap delivery anomaly under wine threads documented (near-zero stops despite verified arming and confirmed module execution); full stop-logging added to fnexec; roadmap to bit-exact fixed: G-form via stabilized series, consumer via init-family decode or perf_event HW breakpoints, then RT_FIRCONV gate 2026-08-24 02:30:19 +03:00
Matiq 56edd3c0f4 23l: DR exec-watch verified working end-to-end by micro-test on this kernel (SIGTRAP+DR6 correct); contradiction isolated to process/thread targeting in tracer, single remaining hypothesis documented with debug protocol 2026-08-24 02:22:55 +03:00
Matiq baafbb6dc6 23k: HW exec-breakpoints operational (correct offsets, RF-flag pass, clone inheritance); clean run proves decoded chain does NOT execute in steady render — kernel built ONCE on param-change in <100ms window after instance creation; transcription implication: rebuild kernel only on setParams; full capture recipe documented 2026-08-24 02:08:30 +03:00
Matiq 9e85b730b2 23j: multi-register watchpoint definitive negative — zero hits even on mandatory-hot words (overlap/R/lock) across confirmed renders with 8/8 threads armed; HW data watchpoints not delivered under wine threads here — route closed, pivot to static table-index scan 2026-08-24 01:56:15 +03:00
Matiq 25b736b2bb 23i: hardware watchpoint infrastructure working (u_debugreg base 0x350, LEN8 rejected -> use LEN4, DR6 reset documented); zero hits on kernel word — consumer may read a copy or builds early; fnwatch.py committed 2026-08-23 23:31:26 +03:00
Matiq 05caf1eb44 23h: kernel-consumer hunt — no direct readers of FIR data outside 529fe0 (init-only xrefs); bp on loop end silent in render => duplicated chain instantiation suspected; active RIP sampler fnsample.py working (2.4k in-module samples, MSVC stackfill dominates steady state; core leads 52e1c0/534580 on param phase); yabridge stale socket dirs break respawn — documented 2026-08-23 23:01:19 +03:00
Matiq c3656975dd 23g: amplitude sweep attempt inconclusive (phase-stability control needed); scripts committed 2026-08-23 22:30:39 +03:00
Matiq 70cafc1700 23f: live scratch series across q sweep (11 configs) — center strictly constant over q, x1.805 hits real cuts within 0.14dB at both known points, scr171(res) nonlinear consistent with 22x exponent; detector smoothing located between raw bands[] write and DESIGN (raw blinks 0.3..382 while scratch steady) 2026-08-23 22:27:13 +03:00
Matiq 7902acfbb8 23e: law closed quantitatively — FIR=exp(0.984*scratch) pointwise; real/FIR cut ratio constant 1.80 across configs and bins (linear post-scale, EMPIRICAL until conv-stage decoded); center independence of q proven live (scratch43 -0.6565 vs -0.6551); skirt shift matches within 3% (1.46 vs 1.50 dB) 2026-08-23 22:19:05 +03:00
Matiq 3a0a38467b 23d: BREAKTHROUGH — live kernel captured via SIGSTOP sampling of offline render (rendersnap.py); bands[] input to DESIGN is the raw per-frame signal spectrum (Hann lobes at tone bins only!), captured FIR shows skirt cut deeper than center exactly as real output (0.473@2000 vs 0.524@500) despite R-curve claiming otherwise; am/res structure confirmed with twin template as divider; recipe for exact ops formula next round 2026-08-23 22:11:33 +03:00
Matiq 0a45661a25 23c: negative feasibility — symmetric log-domain convolution cannot reproduce dual skirt geometry (best 0.94dB err at absurd 324-bin width); narrows mechanism to non-symmetric ops / true bands[] input / temporal coupling; capture recipe for DESIGN-input dump documented 2026-08-23 21:09:14 +03:00
Matiq b8d5f83fc5 23b: mask->FIR chain decoded — DESIGN body is vectorized LOG2 of band curve (poly fingerprinted), WIN_freq identified as periodic Hann(4096) falling half applied to FIR[n/2..n), full ILT stub->impl table resolved offline (ilt_resolve.py), live buffer catalog extended (SIMD lane masks at 0x540598, complex identity reset between callbacks, overlap buffer at 0x5406f8 non-zero), plugin output proven nondeterministic across renders (LCG dither) — spectral metrics only; ptrace lab scripts + lessons (TRACECLONE before CONT, sub-second host lifecycle under -renderproject) 2026-08-23 20:59:54 +03:00
Matiq 07cd4b7dc0 23a: docs sync to post-22z state — AGENTS header/open-gaps/key-files and BITEXACT_PLAN entry-point updated: priority #1 = bands[] input semantics (static decode of conv body or in-callback trace), canon stays LAWAFFINE 7.4/1.85 TOTAL 1.931, refuted branches documented 2026-08-23 19:00:44 +03:00
Matiq 738ffccad4 22z: mask->FIR call sequence decoded (535a70 thunk chain -> 1802a24c0 body; WIN_freq second-half segment multiply; FIR[0]=1,FIR[1]=0); IDFT-window-DFT spreading hypothesis NUMERICALLY REFUTED (max 2.6dB at skirt vs needed 11.8) -> dual skirt mechanics live in detector/template domain, not post-processing 2026-08-23 18:55:36 +03:00
Matiq 91101b2135 22y: live ctx capture pipeline works (scripts/dualtrace.py, realtime playback + chunked heap snapshot); found config-dependent reduction curves 0x540768/788/7f8 (peak follows band fc; 7f8 min exactly 1.0 => R=1/mask, notch-shaped); acc/f6f8 arrays ZERO in steady state; DECISIVE: applied filter != pointwise R (dual skirt 3dB vs real 11.8) -> FFT-conv wide-window spreading is the missing mechanism 2026-08-23 18:40:25 +03:00
Matiq 64beaa7131 22x: NO-alpha theorem — no res-exponent makes detector level consistent across families (dual needs alpha<0, fc-scans break at alpha<=0); dual-vs-q table: cut@center CONSTANT across q, skirt cut falls ~exp(-res/0.49) converging at res>=2 -> notch geometry lives in the fine-grid twin template (536300), not per-bin arithmetic; pointwise (am,res^alpha)+single-law class REFUTED 2026-08-23 18:04:47 +03:00
Matiq 13c2d028bf 22w: faithful mask-shaping chain v1 behind RT_FAITHFUL (fnfaith.cpp) — exact 180533340 freq-warped bidir-IIR coefficients (fc_bin=85@48k/4096, constants from dump); corpus TOTAL 5.315 but comb 2.57 best-ever; decisive: mask shape cannot balance dual tones -> level contrast is created by the DETECTOR (time-domain twin bank hypothesis priority #1) 2026-08-23 17:04:23 +03:00
Matiq 34156315e6 22v: full block map of FUN_180529fe0 from raw asm — 4 bidir-IIR states, per-band acc array [0x5407c8+i*16] confirmed (21b semantics), ILT thunk table resolved; coefficient generator decoded (530b60 + 533340): frequency-warped one-pole g=fc/i below crossover — the real mask smearing mechanism; full disasm f529fe0_full.dis (old was truncated at 52a813) 2026-08-23 16:47:51 +03:00
Matiq 79c11dc220 22u: raw-asm re-decode of FUN_180529fe0 — multiband pre-combine inside method, per-band scale->kernel->2x bidir-double-IIR (52d650 fully decoded, per-bin double coefs), band-state arrays 0x540768[i]/0x5407a8[i]; 0x5407c8 acc has NO runtime reader (21b addr wrong); offline bidir-IIR smoothing hypothesis REFUTED (monotonic degradation) 2026-08-23 15:53:58 +03:00
Matiq 376bd955c9 22t: two-factor laws REFUTED by descent (quad Q->0, resrp rp->0 — geometry already in lvl=am/res); real render of sim-optimum 7.6/1.694 = 1.898 with group regressions, canon stays; error budget: dual = 62% of corpus abs-error -> inter-band acc/f6f8 consumer is priority #1 2026-08-23 15:10:06 +03:00
Matiq 3857205a6b 22s: offline law-fit infra (full replay sim, 2s/corpus) — NO single affine (A,S) exists even on pure tones; family slopes 0.85-2.19, global LSQ resid 0.60 dB structured by rms/fc-dist; scalar law saturated ~1.87-1.93, canon stays HEAD 2026-08-23 14:36:27 +03:00
Matiq 3b9158e63e 22r: affine dB law (RT_LAWAFFINE) ported onto bare chain — TOTAL 1.931 beats canon 2.286; A=7.4/S=1.85 best, tradeoffs mapped 2026-08-23 11:01:42 +03:00
Matiq d160acaa27 22q: dual diagnosis — twin-divisor contrast refuted (real cuts both tones equally), saturating dB-curve hypothesis; pair-collection plan 2026-08-23 10:39:24 +03:00
Matiq 0aeedde019 22p: joint-fit grid — floor essential (without: corpus x2), optimum scale=0.90 TOTAL 5.215, comb beats canon first time; canon stays HEAD 2026-08-23 09:48:17 +03:00
Matiq d4e8d055c6 22o: RT_ENV=live (live-table envelope) — noise TF better, corpus neutral; new-arch best 5.386 vs canon 2.286; joint fit next 2026-08-23 03:52:12 +03:00
Matiq 0861a64387 22n: live ctx found (0x2370048, scalars config-dependent!), slow detector adaptation discovered (gain deepens over ~seconds, kRTrel tau~2s) 2026-08-22 22:33:16 +03:00
Matiq 709d8ce227 22m: user hypotheses tested — gamma!=delta (E1), BandConfig stable under depth/delta (E3), no level-path refs in SpectralProcessor methods (E4) 2026-08-22 21:56:46 +03:00
Matiq 98a35e8648 22l: pool5+scale1.144+floor hits tone floor -20.74 (real -20.72); corpus 5.9 — params need systematic fit; canon untouched 2026-08-22 21:33:31 +03:00
Matiq 355ce828f4 22k: bare exp2 chain CONFIRMED on white-noise probe; remaining tone gap = detector level scale x1.14 2026-08-22 20:58:18 +03:00
Matiq dee3864c3c 22j: white-noise probe — real TF is flat (warp not output multiplier), reduction is contrast-driven; adaptive-twin lead 2026-08-22 20:22:23 +03:00
Matiq bf8c12603c readme: sync to 22i — P5 status, floor blend*ln10/20, Step 7 refuted, detector front-end priority, new tooling 2026-08-22 20:02:11 +03:00
Matiq d43bbfe66b 22i: RT_LVL_CAP inert (model post-IIR levels ~1.06 << cap) — gap relocated to detector front-end amplitude chain 2026-08-22 19:51:56 +03:00
Matiq 94383b15d3 22h: floor law mapped — floor_dB(sens)=20log10(ln10/20)-(sens-6)/3, depth shifts too; exact anchor sens6=ln10/20 2026-08-22 19:46:22 +03:00
Matiq ef7d3f49c7 22g: NO-LUT test isolates gap to detector front-end; unified sidechain-clamp hypothesis (knee at 0dBFS, identical renders above) 2026-08-22 19:39:22 +03:00
Matiq 41b0d3c250 22f: floor discrimination via param bridge — dry/wet crossfade confirmed, floors=k*ln10/20, detector-cap hypothesis leads 2026-08-22 19:10:50 +03:00
Matiq 7febe744e9 plan: sync to 22e — Step 7 refuted, floor blend*ln10/20 solved, new priority Step 9 (floor mechanism) 2026-08-22 18:59:04 +03:00
Matiq 3970c1e309 22e: floor algebra solved — gain_floor=20log10(blend*ln10/20), matches -20.72dB within 0.006dB; lead FUN_180529c60 2026-08-22 18:54:48 +03:00
Matiq 9c14a74318 docs: 22d — hard gain floor -20.72dB mapped (t-clamp live confirmation); cold/hot discrepancy open 2026-08-22 18:40:13 +03:00
Matiq f5ef81667c bench: official param bridge (setparam/dump_params.lua) + rpp_setparam format tool; 22c — XML params decorative, depth=+-18dB, trim=+-24dB, reduction curves measured 2026-08-22 18:28:54 +03:00
Matiq 7fac8b2a4f step7: live BandConfig capture infra + FUN_180563a60 decode — GUI-only, audio path refutes premise (22b) 2026-08-22 15:28:01 +03:00
Matiq c222e054ca docs: Phase B recovery — 4 offline detector hypotheses refuted; scripts into scripts/ 2026-08-22 12:55:02 +03:00
Matiq 71644ff3e6 fix(render48k): chunk-scan WAV loader — hdr[40] is not data size when bext/junk present 2026-08-22 10:59:26 +03:00
Matiq 3e5085e06d phase A: reduction law found (affine in dB), canon unchanged; keep RT_DUMP tooling
- Effective reduction is affine in dB(lvl): x_exp2 = -0.6646 - 0.05877*dB
  (mask ~ 0.8*lvl^-0.354, gamma ~= decomp 0.344); tones +-0.13 dB over 42 dB
- Pre-IIR calibrated variant (X0=1.8/S=0.11): TOTAL 2.633 vs HEAD 2.286;
  wins t1kq/t1k/al/comb, loses res/dual -> gate fails, canon stays LUT
- Grid search (X0,S,floor,CMAX) on validated trajectory model: no scalar
  law of the family fits tone+noise simultaneously (res tension)
- Refuted: high-bin/IIR3-backward propagation, direct-affine bypass,
  positive floors, ceilings
- Kept opt-in instrumentation RT_DUMP_BIN / RT_DUMP_ALL for Step 7 capture
- Docs: NOTES_LEVEL 21d, BITEXACT_PLAN s.0 note, roadmap, AGENTS
2026-08-21 19:29:21 +03:00
Matiq 702b74e297 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.
2026-08-21 13:54:06 +03:00
Matiq b2cb9235be feat(scripts): structural-path full-corpus harness + first honest 62-case numbers
corpus_structural.py drives render48k (48k/4096 structural chain) across the
full corpus with bridge-compare mode. Results: comb 6.12 vs bridge 10.15
(structural wins multiband already), res better, single-band worse; dual@500
constant -6.7dB q-independent over-cut exposes missing reduction saturation.
Param sweep (gamma x MULT, verified builds) confirms current optimum; curve
SHAPE is the gap -> Step 7 capture or bigkernel input re-examination.
2026-08-21 13:12:53 +03:00
Matiq a9d5581ad8 docs: NOTES — IIR3 bidirectional decode, combine thunk semantics, Step 2 re-scope 2026-08-21 12:55:23 +03:00
Matiq 1a616e1b7b feat(dsp): IIR3 bidirectional per decomp (fwd+bwd x2), combine semantics decoded
Decomp (consumers_out.txt:955-1075): IIR3 = TWO [reset,forward,backward]
pairs, state persists fwd->bwd; y = B3*x + A3*state. Replaces 2x forward.
Combine block decoded from thunks: f6f8 = mask - acc (8d60, dst=3rd arg);
f6f8 += kRTAtt/kRTRel * acc (halves); acc += mask (5a20). KEY FINDING:
in online single-band path acc/f6f8 have NO consumer before warp/dry-wet
- combine affects output only via multiband/FFT-conv stages (Step 2 scope
narrowed). LUT_MULT retuned 4.4 -> 4.2. Smoke mean|err| 0.993 -> 1.021
(faithful transcription kept over tuned fwd-only). Checks PASS, guard PASS.
2026-08-21 12:54:46 +03:00
Matiq 9ffe60e66e feat(dsp): wire IIR3 x2 (kIIR_A3/B3) post-warp into structural chain
Step 9 of NOTES_LEVEL:820-840 mono-path (was missing; roadmap claimed it).
Light spatial mask smoothing, upper half re-mirrored. LUT_MULT retuned
3.8 -> 4.4 for the shifted calibration. Smoke (48k/4096): mean|err|
1.093 -> 0.993 (t1kq -1.06, t1k +1.66, al12 -0.26). Module checks PASS,
corpus --compare bridge baseline PASS.
2026-08-21 12:45:36 +03:00
Matiq 7a108c529a docs: NOTES_LEVEL update — LUT level-domain discovery, sweep tooling hazard 2026-08-21 12:36:35 +03:00
Matiq 535b150f75 feat(dsp): move dB-LUT to level domain (pre-IIR/exp2) in structural chain
Mask-domain LUT clamps t<0 on loud input (t1k mask_dB < A=-13.78) causing
-24dB over-cut. Level-domain keeps quiet/loud inside [A,B] domain:
t1k err -24.04 -> +2.45 dB (3-case smoke: mean|err| 8.2 -> 1.09).
Params: gamma=0.344 (decomp-extracted), mult=3.8 (placeholder, empirical).
Module checks pass; corpus (bridge path) unchanged at 1.594.
2026-08-21 12:35:57 +03:00
Matiq 9b7e9d3099 feat(dsp): add dB-domain LUT (FUN_180563a60) to structural chain on 48k grid
- Add BandConfig A/B/gamma LUT compression (extracted from refs: A=-13.78dB, B=68.29dB, gamma=0.344)
- Add res^rp smoothing term for bridge-parity (RP0=0.0275, DRP=0.2159)
- Calibrate scale_factor to match bridge gain at tone bin (15.0 * 440.95 / 2048 = 3.23)
- Structural 48k: -26.81 dB vs ref -27.23 dB (err +0.426 dB)
- Bridge baseline: intact (0.000 dB degradation)
- All module checks PASS (fn529fe0, exp2, twin, tables, leveltrack, levelpath, fftconv)
2026-08-21 09:25:17 +03:00
Matiq 6924e539e0 feat(dsp): render48k pipeline + structural chain on 48000/4096 grid
- render48k: resample 44100→48000, process via SpectralProcessor(4096,1024,48000),
  resample 44100, write 24-bit stereo WAV
- FramedDetector: structural chain (fn529fe0 sequence) runs on 48000/4096 grid,
  bridge path unchanged for 44100/2048
- Structural chain: scale→IIR1→copy→IIR2→mirror→blend→exp2→combine→warp→dry/wet
  using live tables (kIIR_A1/B1, kIIR_A2/B2, kBand768, kWarp, kRTAtt/kRTRel)
- Bridge baseline intact (0.000 dB degradation)
- 48k tone test: -20.73 dB vs ref -27.23 dB (6.5 dB error, scale factor not yet
  calibrated to match bridge domain)
2026-08-21 04:46:51 +03:00
Matiq 7659eb0362 feat(dsp): SpectralProcessor sample_rate param 2026-08-21 01:32:50 +03:00
Matiq 7bf5a4a80c feat(dsp): structural FUN_180529fe0 chain components + fn529fe0_check (step 1, module 1) 2026-08-21 01:09:36 +03:00
Matiq fa71240d92 test: add validation harness (scripts/corpus.py + bridge baseline) to prevent Phase B regression 2026-08-21 01:06:05 +03:00
Matiq f17ee78061 docs: BITEXACT_PLAN — 8-step path to byte-parity; fix repo docs to reflect not-yet-bit-exact status 2026-08-21 01:00:41 +03:00
Matiq e990c21e94 fix: framed_test parse every comma band (was first-arg only); comb tests were single-band 2026-08-21 00:52:44 +03:00
Matiq b333f6828f docs: NOTES — verified comb params (neg sens, multi-mode); comb needs combine/acc, not params 2026-08-21 00:42:32 +03:00
Matiq 8e4e40b25a docs: NOTES — Pchip LUT fix + comb diagnosis (level-dependent, not multiband) 2026-08-21 00:34:18 +03:00
Matiq e5e9700333 fix: restore pchip LUT in framed_model (revert 12094f8 regression)
12094f8 replaced the empirical Pchip LUT with the parametric
linear form (CAP_A_LEVEL=-24/B=28/gamma=1). With gamma=1 the
parametric form reduces to identity on xv=log10(am/res), which
breaks the whole mask chain (t1kq fc-scan err jumps to ~7.9 dB).

Re-instating lut_pchip restores the honest baseline:
t1kq mean|err| 0.226 dB (was 7.9). Confirms NOTES_LEVEL F1
closure: no parametric LUT set beats Pchip at fixed bridge
params; the structural A/B/gamma (level-path ctx+0x188) is the
only real path to bytes, not this parametric substitution.
2026-08-21 00:32:39 +03:00
Matiq 12094f8119 Replace empirical Pchip LUT with parametric form from live DSP capture 2026-08-20 23:08:04 +03:00
Matiq 16853d7e0b Integrate live-captured A/B/gamma params into framed_model; add CAP_ constants and parametric LUT helper 2026-08-20 22:59:21 +03:00
Matiq 2d69b85aa3 P5: NOTES — F5c DSP-FFT 0x140a70 status (P3 confirmed unwired; all check targets PASS)
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.
2026-08-20 21:09:28 +03:00
Matiq d802ee7aed P5: F5b — exp2 0x26b820 assets extracted bit-exact + numeric fallback exp2_dsp
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).
2026-08-20 21:07:30 +03:00
Matiq 4e9c1b1ed7 P4: F4 geometry test — internal 48000/4096 does NOT close residual (0.68 vs 1.00); all structural adaptations rejected
Tested internal-geometry (48000/4096 + resample) — worse. Combined with earlier
negative results (parametric LUT x6, FFT-conv window, combine acc), every structural
adaptation is rejected. Bridge (Pchip 0.774) = empirical ceiling. Bytes require live
A/B/gamma capture or bit-exact exp2/FFT kernels.
2026-08-20 20:54:05 +03:00
Matiq fa1ef205df P4: F2 structural wiring tests — combine+FFT-conv naive wiring both regress (doc only)
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).
2026-08-20 20:52:00 +03:00
Matiq 1cfe013939 P4: bench all existing parametric LUT sets on full honest corpus — Pchip remains best (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).
2026-08-20 20:44:20 +03:00
Matiq cea562b511 P4: F0 GATE PASSED — output is byte-deterministic; re-renders reproduce committed refs exactly
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.
2026-08-20 20:03:58 +03:00
Matiq 4014133d57 P4: NOTES — twin res verified vs Python canon (match <1.5%); res_only1 residual is LUT-level, not res-shape 2026-08-20 19:35:52 +03:00
Matiq 067d483f15 P4: NOTES — fit exploration results (mask-level fits do not transfer to full render)
- 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).
2026-08-20 19:34:01 +03:00
Matiq cc52461903 P4: AGENTS.md — honest baseline state (log-domain LUT bridge, correct 24-bit metric)
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).
2026-08-20 18:31:22 +03:00
Matiq 9a26532c60 P4: NOTES — broadband hypothesis tested NEGATIVE (per-bin reduction confirmed) + LUT re-cut rejected
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.
2026-08-20 18:30:30 +03:00
Matiq 94a6749c9a P4: NOTES — full honest corpus assessment (dual/al/res/t1k/t1kq baseline mean 0.77, max 2.12)
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.
2026-08-20 18:25:02 +03:00
Matiq da63adc82c P4: METRIC FIX + log-domain LUT chain ported — honest baseline err <0.7 dB
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.
2026-08-20 17:37:31 +03:00
Matiq f8ecf6a1af P4: Phase B — framed_model re-transcribed to the confirmed chain (NOTES:199-226)
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.
2026-08-20 17:16:22 +03:00
Matiq 8f64539328 P4: CRITICAL fix — level = am/res (not am*res); fc-resonance shape now correct
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.
2026-08-20 16:25:00 +03:00
Matiq ddf2ac2050 P4: lock PRNG prologue + correct constants (DAT_*=1); scale via prng_fvar30
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.
2026-08-20 16:14:50 +03:00
Matiq f1f06765f7 docs: README intro -> bit-exact goal, point to AGENTS.md 2026-08-20 15:51:10 +03:00
Matiq bdf9f21a60 docs: AGENTS.md + refresh README/roadmap/summary/SESSION_HANDOFF to P4 canon; rm empty logs
- AGENTS.md: canonical build/test commands, honest trimmed tone metric, current
  bit-exact state (mask-apply chain), open gaps (PRNG/FFT-conv/exp2/SR-mismatch).
- README.md: status moved to P4 (C++ FramedDetector canon, framed_test), historical
  B.1..B.15 numerical model demoted to <details>; structure/doc table updated.
- roadmap.md: P4 phase marked progress, P4.1/P4.2/P4.3 milestones, top status refresh.
- summary.md: marked historical (behavioral v4).
- SESSION_HANDOFF.md: fixed stale "NOT DECODED" (now decoded), copy note done.
- Removed empty tmp_spec.txt/giant3.txt and untracked .log/__pycache__ clutter.
2026-08-20 15:50:07 +03:00
Matiq 77b639ee82 chore: fix .gitignore to track decompiled .dis/.bin disassemblies
.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.
2026-08-20 15:42:42 +03:00
Matiq 2e0b107b4c P4: document PRNG prologue + remaining bit-exact gaps 2026-08-20 15:32:47 +03:00