diff --git a/docs/CIRCUIT.md b/docs/CIRCUIT.md index 890a1c1..1bb5da2 100644 --- a/docs/CIRCUIT.md +++ b/docs/CIRCUIT.md @@ -22,6 +22,7 @@ V1a part: | V1a | 12AX7 | p1a, g1a, k1a | | | R1 | 2.7 kΩ | k1a – gnd | | | C1 | 0.68 µF | k1a – gnd | Full cathode bypass | +| C2 | 100 pF | p1a – k1a | V1a plate–cathode (drawing iss. 4; added D-062, was open item O8) | | R4 | 100 kΩ | bpA – p1a | Plate load; bpA from supply B7 | There is no junction between V1a and V1b: p1a is an internal node of B12 (the J1 junction was @@ -253,7 +254,7 @@ Regenerate with `python3 reference/spice/spice_tools.py` after any netlist chang | O5 | NFB tap | 16 Ω output with the speaker load (D-059) | Feedback amount if taken from another tap | | O6 | Low input | Not modelled | Feature only | | O7 | OT half-primary orientation | Blue–White (15.36 Ω) on the pA side (V4/V5) | ±0.6 Ω winding asymmetry, about ±40 mV DC per side | -| O8 | C2 100 pF V1a plate–cathode (drawing 2203 STD Preamp iss. 4) | Not in the netlist (found 2026-10-15) | −0.3 dB at 5 kHz, −0.7 … −0.9 dB at 10 kHz into V1b (SPICE study) | +| O8 | C2 100 pF V1a plate–cathode | Resolved: in the netlist since D-062 | −0.3 dB at 5 kHz, −0.7 … −0.9 dB at 10 kHz into V1b (SPICE study) | | A1 | HT source 505 V / 100 Ω | Assumed | B+ level and sag | | A2 | OT values | Hammond 1750U replacement datasheet, primary inductance fitted (§3, D-023) | Power, LF/HF response, feedback | | A3 | Choke 5 H / 115 Ω | Hammond 194F replacement datasheet; L specified at 120 mA DC, the amp runs it at ≈ 27 mA (D-024) | Screen node dynamics, supply DC | diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 3bc1df7..db5f078 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -1043,3 +1043,14 @@ at 0 V. Above +20 V, P = Vpk within 0.1 V (DC operating point unchanged). Consequences: engine diagnostic: HOT DI 0 power-amp failures at 8x and 16x; CRUNCH / DRIVE unchanged (−218 … −224 dB vs the previous engine), HOT differs by −35 … −37 dB. tests/data EL34 sweeps regenerated; the pentode test asserts the new below-cathode behaviour. SPICE references with the power amp are re-rendered. + +## D-062 C2 100 pF (V1a plate–cathode) added to the netlist (reference model change) +Date: 2026-10-18 · Status: accepted (owner: "add C2 to the netlist") +Context: the drawing (2203 STD Preamp iss. 4) shows C2 100 pF from V1a's plate to its cathode; it was missing from the +transcription (open item O8, found 2026-10-15). SPICE study: −0.3 dB at 5 kHz, −0.7 … −0.9 dB at 10 kHz into V1b. +Decision: `C2 p1a k1a 100p` in the netlist (B12 partition). The engine adds it to V1a's plate–cathode capacitance port +(`cpk1a_` = Cpk + C2 in `Preamp` and `StageV1aV1b`): the same two nodes, so the parallel combination is exact. +Consequences: DC unchanged. Every SPICE reference containing V1a is re-rendered; earlier reports are without C2. +Also found: the standalone blocks' default supply voltages (Preamp, StageV1aV1b, StageV2aV2b, StageV2aV2bToneStack, +PhaseInverter, PowerStage) were still the pre-D-058 values (bpA 389.35, bpX 402.34, ct 488.71, nScr 485.65 V); updated to +CIRCUIT.md §5 (391.92, 405.00, 491.35, 488.88 V) with the block DC fixtures (the full amp sets its supplies itself). diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 994b714..b89ebed 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -842,6 +842,13 @@ Notes: model) and are now rendered once more at RELTOL 1e-7 by `render_spice` (as the M3 cascade), noted in the reports. Plugin model check: Full 2x HOT −24.2 dB (PASS), unseen −20.8 dB, 94 first-solve failures (2 unrescued) over 28 runs, nearly all in the extreme validation settings (presets: 0 / 0 / 2); Half 2x HOT −18.9 dB. Presence knob jump −62.9 dB; null test 26 / 26. +- Owner 2026-10-18: add C2 to the netlist (D-062). Plan: `C2 p1a k1a 100p`; the engine folds it into V1a's Cpk port (Cpk + C2, + B1234 and B12: the same nodes, exact); B12 partition; re-verify b12 (DEFAULT, VOL0.2, VOL1.0), b1234, knob jumps b12 / b1234, + M4 acceptance at 768 kHz and 384 kHz exact J4 + HOT, plugin model check (Full 2x), null test, CPU. +- D-062 done. b12 / b1234 first failed on DC (≈ 0.65 %): the standalone blocks' default supplies were pre-D-058; fixed + (engine headers + block DC fixtures). Then: b12 DEFAULT / VOL0.2 / VOL1.0 105 / 106 / 106 PASS, b1234 119 PASS, b3 87 PASS, + b34 94 PASS (0 FAIL each); knob jumps b12 −55.9 dB, b1234 −39.1 … −55.1 dB, b34 −53.1 … −67.6 dB; M4 full acceptance 107 + PASS (768 kHz and 384 kHz exact J4); HOT 20 PASS / 1 FAIL (2 rescued first-solves, as after D-061); null test 26 / 26. ## Questions for the owner _(Claude Code: add questions here and also ask them in the session.)_ diff --git a/engine/include/amp2203/PhaseInverter.h b/engine/include/amp2203/PhaseInverter.h index 6789bac..d249d18 100644 --- a/engine/include/amp2203/PhaseInverter.h +++ b/engine/include/amp2203/PhaseInverter.h @@ -26,7 +26,7 @@ namespace amp2203 { /// (g3b−k3, p3b−k3). Presence is smoothed (SPEC §6.2); R_th4 follows the preamp's knobs. class PhaseInverter { public: - static constexpr double kSupplyBpX = 402.335999; // CIRCUIT.md §5 + static constexpr double kSupplyBpX = 404.998185; // CIRCUIT.md §5 static constexpr int kParamUpdateInterval = 32; static constexpr int kNodes = 8, kElements = 18, kRootPorts = 4; diff --git a/engine/include/amp2203/PowerStage.h b/engine/include/amp2203/PowerStage.h index ab78be0..b6f8f9a 100644 --- a/engine/include/amp2203/PowerStage.h +++ b/engine/include/amp2203/PowerStage.h @@ -25,7 +25,7 @@ namespace amp2203 { /// resistances as one coupled element, the load); root ports (g, s, p) of each pair against ground. class PowerStage { public: - static constexpr double kSupplyCt = 488.708422, kSupplyScreen = 485.649287; // CIRCUIT.md §5 + static constexpr double kSupplyCt = 491.346637, kSupplyScreen = 488.880467; // CIRCUIT.md §5 /// J5 Thevenin resistances (harness/junctions.py j5a / j5b, provisional; CIRCUIT.md §4). static constexpr double kRthA = 58067.6, kRthB = 56937.4; static constexpr int kNodes = 17, kElements = 31, kRootPorts = 6; diff --git a/engine/include/amp2203/Preamp.h b/engine/include/amp2203/Preamp.h index f6be57e..e31707a 100644 --- a/engine/include/amp2203/Preamp.h +++ b/engine/include/amp2203/Preamp.h @@ -25,14 +25,14 @@ namespace amp2203 { /// while one moves, the matrices are recomputed every kParamUpdateInterval samples. class Preamp { public: - static constexpr double kSupplyBpA = 389.349603; // CIRCUIT.md §5; B7 sets them in M4 - static constexpr double kSupplyBpX = 402.335999; + static constexpr double kSupplyBpA = 391.921506; // CIRCUIT.md §5 (after D-058); B7 sets them in M4 + static constexpr double kSupplyBpX = 404.998185; static constexpr int kParamUpdateInterval = 128; // samples between matrix updates while a knob moves (D-057; was 32) static constexpr int kNodes = 20, kElements = 38, kRootPorts = 9; // 8 triode ports + the load at y // Component values, CIRCUIT.md §1 and tubes.lib (SI units). static constexpr double R1 = 2.7e3, R3 = 68e3, R4 = 100e3, R5 = 470e3, R6 = 10e3, R7 = 100e3; - static constexpr double C1 = 0.68e-6, C3 = 0.022e-6, C4 = 470e-12, C5 = 1e-9, VR1 = 1e6; + static constexpr double C1 = 0.68e-6, C2 = 100e-12, C3 = 0.022e-6, C4 = 470e-12, C5 = 1e-9, VR1 = 1e6; static constexpr double R9 = 820.0, R10 = 470e3, R11 = 470e3, R12 = 100e3, R13 = 100e3, R15 = 33e3; static constexpr double C7 = 0.022e-6, C8 = 470e-12, C10 = 470e-12, C11 = 0.022e-6, C12 = 0.022e-6; static constexpr double VR3 = 220e3, VR4 = 22e3, VR5 = 1e6, VR2 = 1e6; @@ -114,7 +114,8 @@ class Preamp { chowdsp::wdft::ResistorT vr1b_{1.0}; chowdsp::wdft::ResistorT r6_{R6}; chowdsp::wdft::ResistiveVoltageSourceT src7_{R7}; - detail::DcCapacitor cgk1a_{Cgk}, cgp1a_{Cgp}, cpk1a_{Cpk}, cgk1b_{Cgk}, cgp1b_{Cgp}, cpk1b_{Cpk}; + // cpk1a_: V1a's Cpk in parallel with C2 (100 pF plate–cathode, D-062): one p1a – k1a port + detail::DcCapacitor cgk1a_{Cgk}, cgp1a_{Cgp}, cpk1a_{Cpk + C2}, cgk1b_{Cgk}, cgp1b_{Cgp}, cpk1b_{Cpk}; // B3 elements detail::DcCapacitor c7_{C7}; chowdsp::wdft::ResistorT r10_{R10}; diff --git a/engine/include/amp2203/StageV1aV1b.h b/engine/include/amp2203/StageV1aV1b.h index 6d13284..dd9af0b 100644 --- a/engine/include/amp2203/StageV1aV1b.h +++ b/engine/include/amp2203/StageV1aV1b.h @@ -28,13 +28,13 @@ namespace amp2203 { class StageV1aV1b { public: /// Supply node bpA at the F operating point (CIRCUIT.md §5, as the B12 testbench); B7 sets it in M4. - static constexpr double kSupplyBpA = 389.349603; + static constexpr double kSupplyBpA = 391.921506; static constexpr int kParamUpdateInterval = 32; static constexpr int kNodes = 8, kElements = 15, kRootPorts = 4; // Component values, CIRCUIT.md §1 B12 and tubes.lib (SI units). static constexpr double R1 = 2.7e3, R3 = 68e3, R4 = 100e3, R5 = 470e3, R6 = 10e3, R7 = 100e3; - static constexpr double C1 = 0.68e-6, C3 = 0.022e-6, C4 = 470e-12, C5 = 1e-9, VR1 = 1e6; + static constexpr double C1 = 0.68e-6, C2 = 100e-12, C3 = 0.022e-6, C4 = 470e-12, C5 = 1e-9, VR1 = 1e6; static constexpr double Cgk = 2.3e-12, Cgp = 2.4e-12, Cpk = 0.9e-12; StageV1aV1b(); @@ -90,7 +90,8 @@ class StageV1aV1b { chowdsp::wdft::ResistorT vr1b_{1.0}; chowdsp::wdft::ResistorT r6_{R6}; chowdsp::wdft::ResistiveVoltageSourceT src7_{R7}; - detail::DcCapacitor cgk1a_{Cgk}, cgp1a_{Cgp}, cpk1a_{Cpk}, cgk1b_{Cgk}, cgp1b_{Cgp}, cpk1b_{Cpk}; + // cpk1a_: V1a's Cpk in parallel with C2 (100 pF plate–cathode, D-062): one p1a – k1a port + detail::DcCapacitor cgk1a_{Cgk}, cgp1a_{Cgp}, cpk1a_{Cpk + C2}, cgk1b_{Cgk}, cgp1b_{Cgp}, cpk1b_{Cpk}; auto elements() noexcept { return std::tie(vin_, k1a_, src4_, c3_, r5c4_, c5vr1a_, vr1b_, r6_, src7_, cgk1a_, cgp1a_, cpk1a_, cgk1b_, diff --git a/engine/include/amp2203/StageV2aV2b.h b/engine/include/amp2203/StageV2aV2b.h index 655fcad..4b7373c 100644 --- a/engine/include/amp2203/StageV2aV2b.h +++ b/engine/include/amp2203/StageV2aV2b.h @@ -25,7 +25,7 @@ class StageV2aV2b { /// J2 Thevenin resistance (harness/junctions.py j2, |Z(1 kHz)| of B12 at p1b; DECISIONS D-018). static constexpr double kRth2 = 89732.8; /// Supply node bpX at the F operating point (CIRCUIT.md §5, as the B3 testbench); B7 sets it in M4. - static constexpr double kSupplyBpX = 402.335999; + static constexpr double kSupplyBpX = 404.998185; static constexpr int kNodes = 6, kElements = 13, kRootPorts = 4; // Component values, CIRCUIT.md §1 B3 and tubes.lib (SI units). diff --git a/engine/include/amp2203/StageV2aV2bToneStack.h b/engine/include/amp2203/StageV2aV2bToneStack.h index 99f29e1..daca4af 100644 --- a/engine/include/amp2203/StageV2aV2bToneStack.h +++ b/engine/include/amp2203/StageV2aV2bToneStack.h @@ -26,7 +26,7 @@ namespace amp2203 { class StageV2aV2bToneStack { public: static constexpr double kRth2 = 89732.8; // harness/junctions.py j2 (D-018) - static constexpr double kSupplyBpX = 402.335999; // CIRCUIT.md §5; B7 sets it in M4 + static constexpr double kSupplyBpX = 404.998185; // CIRCUIT.md §5; B7 sets it in M4 static constexpr int kParamUpdateInterval = 32; static constexpr int kNodes = 13, kElements = 24, kRootPorts = 4; diff --git a/harness/reports/M2/20261018_b12_DEFAULT.md b/harness/reports/M2/20261018_b12_DEFAULT.md new file mode 100644 index 0000000..42a5169 --- /dev/null +++ b/harness/reports/M2/20261018_b12_DEFAULT.md @@ -0,0 +1,198 @@ +# M2 report: b12 / DEFAULT + +- Block: B12 StageV1aV1b (V1a + V1b, joint root) +- Preset: DEFAULT — Default knobs; standard signal set at the block levels +- Knobs: preampVolume=0.6, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b12.cir` sha256 `ddc48819203d327c`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 105 · FAIL 0 · INFO 16 (INFO = measured, not scored in M2) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpa) | 1.45e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(g1a) | 0.0001717 | ≤ 0.005 | PASS | +| dc_rel_error | v(in) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1a) | 4.576e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1b) | 0.000107 | ≤ 0.005 | PASS | +| dc_rel_error | v(na) | 0.0006024 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1a) | 1.436e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.121e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(vtop) | 0.0006024 | ≤ 0.005 | PASS | +| dc_rel_error | v(w1) | 0.0006024 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.01V | -76.08 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.01V | — | ≤ 0.5 | INFO | +| thd_pp | SIN-100Hz-0.01V | 1.078e-05 pp | — | INFO | +| newton_failures | SIN-100Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.01V | 1 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.01V | -68.16 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.01V | 0.0136 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.01V | 0.0001133 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.01V | -57.18 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.01V | 0.01576 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.01V | 0.0003894 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.01V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -76.07 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.0117 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 0.0001065 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -68.06 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.02226 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 0.001254 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -57.08 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.01389 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.004654 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.5V | -75.63 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.5V | 0.02413 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.5V | 0.0003982 pp | — | INFO | +| newton_failures | SIN-100Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.5V | -64.63 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.5V | 0.163 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.5V | 0.0193 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.5V | -56.46 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.5V | 0.01751 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.5V | 0.01231 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.5V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-2V | -66.58 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-2V | 0.0261 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-2V | 0.0177 pp | — | INFO | +| newton_failures | SIN-100Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-2V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-2V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-2V | -67.36 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-2V | 0.01549 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-2V | 0.01299 pp | — | INFO | +| newton_failures | SIN-1000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-2V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-2V | -55.38 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-2V | 0.01022 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-2V | 0.00766 pp | — | INFO | +| newton_failures | SIN-5000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-2V | 6 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-lo-0.01V | -55.39 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.01V | 0.01735 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.01V | 0.02413 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.01V | 0.03087 dB | — | INFO | +| newton_failures | SWP-lo-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.01V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-hi-0.1V | -55.37 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-0.1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | TT-0.05V | -73.66 dB | ≤ -20 | PASS | +| newton_failures | TT-0.05V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.05V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.05V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | BURST-0.5V | -64.63 dB | ≤ -20 | PASS | +| newton_failures | BURST-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | BURST-0.5V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | STEP-0.1V | -61.4 dB | ≤ -20 | PASS | +| newton_failures | STEP-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-0.1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR L | -69.48 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR L | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR L | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR L | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR LL | -69.44 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR LL | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR LL | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR LL | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR R | -69.73 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR R | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR R | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR R | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR RR | -69.16 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR RR | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR RR | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR RR | 3 | ≤ 12 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.01V | 0.2762 | -76.08 | 0 | -76.08 | 0.00925 / 0.00926 | — | 289.6 | 0 / 1 / 1 | +| SIN-1000Hz-0.01V | 1.275 | -68.16 | 0 | -68.16 | 0.0634 / 0.0632 | — | 292.0 | 0 / 1 / 2 | +| SIN-5000Hz-0.01V | 2.832 | -57.18 | 0 | -57.18 | 0.151 / 0.15 | — | 458.8 | 0 / 2 / 2 | +| SIN-100Hz-0.1V | 2.763 | -76.07 | 0 | -76.07 | 0.0902 / 0.0904 | — | 286.9 | 0 / 1 / 2 | +| SIN-1000Hz-0.1V | 12.83 | -68.06 | 0 | -68.06 | 0.655 / 0.653 | — | 404.5 | 0 / 2 / 2 | +| SIN-5000Hz-0.1V | 28.88 | -57.08 | 0 | -57.08 | 1.98 / 1.98 | — | 438.8 | 0 / 2 / 2 | +| SIN-100Hz-0.5V | 13.79 | -75.63 | 0 | -75.63 | 0.462 / 0.463 | — | 290.5 | 0 / 1 / 2 | +| SIN-1000Hz-0.5V | 63.77 | -64.63 | 0 | -64.63 | 12.8 / 12.8 | — | 433.1 | 0 / 2 / 2 | +| SIN-5000Hz-0.5V | 146 | -56.46 | 0 | -56.46 | 27.4 / 27.4 | — | 477.0 | 0 / 2 / 4 | +| SIN-100Hz-2V | 52.13 | -66.58 | 0 | -66.58 | 8.21 / 8.2 | — | 288.3 | 0 / 1 / 2 | +| SIN-1000Hz-2V | 226.3 | -67.36 | 0 | -67.36 | 30.2 / 30.2 | — | 465.7 | 0 / 2 / 3 | +| SIN-5000Hz-2V | 270 | -55.38 | 0 | -55.38 | 34.3 / 34.3 | — | 509.1 | 0 / 2 / 6 | +| SWP-lo-0.01V | 2.746 | -55.39 | 0 | -55.39 | — | — | 334.1 | 0 / 1 / 3 | +| SWP-hi-0.1V | 28.05 | -55.37 | 0 | -55.37 | — | — | 361.8 | 0 / 1 / 3 | +| TT-0.05V | 5.308 | -73.66 | 0 | -73.66 | — | — | 286.1 | 0 / 1 / 2 | +| BURST-0.5V | 63.74 | -64.63 | 0 | -64.63 | — | — | 359.5 | 0 / 1 / 3 | +| STEP-0.1V | 22.79 | -61.40 | 0 | -61.40 | — | — | 299.0 | 0 / 1 / 3 | +| DI-GTR L | 126 | -69.48 | 0 | -69.48 | — | — | 312.4 | 0 / 1 / 2 | +| DI-GTR LL | 122.9 | -69.44 | 0 | -69.44 | — | — | 307.1 | 0 / 1 / 3 | +| DI-GTR R | 114.5 | -69.73 | 0 | -69.73 | — | — | 306.4 | 0 / 1 / 3 | +| DI-GTR RR | 121.1 | -69.16 | 0 | -69.16 | — | — | 308.5 | 0 / 1 / 3 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpa | 391.9215 | 391.9215 | 1.45e-16 | +| g1a | 0.0001 | 0.0001 | 0.0001717 | +| in | 0.0000 | 0.0000 | 0 | +| k1a | 2.5271 | 2.5270 | 4.576e-05 | +| k1b | 3.7171 | 3.7167 | 0.000107 | +| na | 0.0002 | 0.0002 | 0.0006024 | +| p1a | 298.3260 | 298.3303 | 1.436e-05 | +| p1b | 354.7502 | 354.7542 | 1.121e-05 | +| vtop | 0.0002 | 0.0002 | 0.0006024 | +| w1 | 0.0002 | 0.0002 | 0.0006024 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b12_DEFAULT/waveform.png) + +### Harmonics + +![Harmonics](20261018_b12_DEFAULT/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b12_DEFAULT/magnitude.png) + +### Spectrogram (DI) + +![Spectrogram (DI)](20261018_b12_DEFAULT/spectrogram.png) diff --git a/harness/reports/M2/20261018_b12_DEFAULT/harmonics.png b/harness/reports/M2/20261018_b12_DEFAULT/harmonics.png new file mode 100644 index 0000000..ba56726 Binary files /dev/null and b/harness/reports/M2/20261018_b12_DEFAULT/harmonics.png differ diff --git a/harness/reports/M2/20261018_b12_DEFAULT/magnitude.png b/harness/reports/M2/20261018_b12_DEFAULT/magnitude.png new file mode 100644 index 0000000..03691a0 Binary files /dev/null and b/harness/reports/M2/20261018_b12_DEFAULT/magnitude.png differ diff --git a/harness/reports/M2/20261018_b12_DEFAULT/spectrogram.png b/harness/reports/M2/20261018_b12_DEFAULT/spectrogram.png new file mode 100644 index 0000000..b1240be Binary files /dev/null and b/harness/reports/M2/20261018_b12_DEFAULT/spectrogram.png differ diff --git a/harness/reports/M2/20261018_b12_DEFAULT/waveform.png b/harness/reports/M2/20261018_b12_DEFAULT/waveform.png new file mode 100644 index 0000000..a445830 Binary files /dev/null and b/harness/reports/M2/20261018_b12_DEFAULT/waveform.png differ diff --git a/harness/reports/M2/20261018_b12_VOL0.2.md b/harness/reports/M2/20261018_b12_VOL0.2.md new file mode 100644 index 0000000..a58ad21 --- /dev/null +++ b/harness/reports/M2/20261018_b12_VOL0.2.md @@ -0,0 +1,198 @@ +# M2 report: b12 / VOL0.2 + +- Block: B12 StageV1aV1b (V1a + V1b, joint root) +- Preset: VOL0.2 — Preamp Volume 0.2; standard signal set (M2) +- Knobs: preampVolume=0.2, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b12.cir` sha256 `ddc48819203d327c`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 106 · FAIL 0 · INFO 15 (INFO = measured, not scored in M2) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpa) | 1.45e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(g1a) | 0.0001717 | ≤ 0.005 | PASS | +| dc_rel_error | v(in) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1a) | 4.576e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1b) | 0.0001069 | ≤ 0.005 | PASS | +| dc_rel_error | v(na) | 6.543e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1a) | 1.436e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.12e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(vtop) | 6.543e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(w1) | 6.543e-05 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.01V | -76.23 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.01V | 0.001939 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.01V | 9.992e-06 pp | — | INFO | +| newton_failures | SIN-100Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.01V | 1 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.01V | -69.84 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.01V | 0.0001541 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.01V | 2.054e-05 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.01V | -58.53 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.01V | 0.01449 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.01V | 8.281e-05 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.01V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -76.23 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.001969 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 0.0001001 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -69.83 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.005029 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 0.0002044 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -58.53 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.08524 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.0008574 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.5V | -76.19 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.5V | 0.005208 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.5V | 0.0005098 pp | — | INFO | +| newton_failures | SIN-100Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.5V | -69.67 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.5V | 0.0147 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.5V | 0.001054 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.5V | -58.39 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.5V | 0.01418 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.5V | 0.003571 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.5V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-2V | -75.41 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-2V | 0.008804 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-2V | 0.002683 pp | — | INFO | +| newton_failures | SIN-100Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-2V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-2V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-2V | -66.81 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-2V | 0.01702 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-2V | 0.006508 pp | — | INFO | +| newton_failures | SIN-1000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-2V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-2V | -57.12 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-2V | 0.02244 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-2V | 0.001298 pp | — | INFO | +| newton_failures | SIN-5000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-2V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-lo-0.01V | -53.06 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.01V | 0.02046 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.01V | 0.0127 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.01V | 0.02721 dB | — | INFO | +| newton_failures | SWP-lo-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.01V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-hi-0.1V | -53.06 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-0.1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | TT-0.05V | -74.31 dB | ≤ -20 | PASS | +| newton_failures | TT-0.05V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.05V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.05V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | BURST-0.5V | -69.68 dB | ≤ -20 | PASS | +| newton_failures | BURST-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | BURST-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | STEP-0.1V | -56.71 dB | ≤ -20 | PASS | +| newton_failures | STEP-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR L | -71.2 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR L | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR L | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR L | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR LL | -70.92 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR LL | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR LL | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR LL | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR R | -71.3 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR R | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR R | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR R | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR RR | -71.15 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR RR | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR RR | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR RR | 2 | ≤ 12 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.01V | 0.03095 | -76.23 | 0 | -76.23 | 0.0269 / 0.0269 | — | 285.1 | 0 / 1 / 1 | +| SIN-1000Hz-0.01V | 0.1658 | -69.84 | 0 | -69.84 | 0.0938 / 0.0938 | — | 290.9 | 0 / 1 / 2 | +| SIN-5000Hz-0.01V | 0.5588 | -58.53 | 0 | -58.53 | 0.0802 / 0.0803 | — | 400.1 | 0 / 2 / 2 | +| SIN-100Hz-0.1V | 0.3086 | -76.23 | 0 | -76.23 | 0.267 / 0.267 | — | 288.2 | 0 / 1 / 2 | +| SIN-1000Hz-0.1V | 1.647 | -69.83 | 0 | -69.83 | 0.939 / 0.939 | — | 289.6 | 0 / 1 / 2 | +| SIN-5000Hz-0.1V | 5.585 | -58.53 | 0 | -58.53 | 0.802 / 0.803 | — | 433.9 | 0 / 2 / 2 | +| SIN-100Hz-0.5V | 1.529 | -76.19 | 0 | -76.19 | 1.34 / 1.34 | — | 287.7 | 0 / 1 / 2 | +| SIN-1000Hz-0.5V | 8.292 | -69.67 | 0 | -69.67 | 4.76 / 4.76 | — | 381.1 | 0 / 2 / 2 | +| SIN-5000Hz-0.5V | 27.55 | -58.39 | 0 | -58.39 | 4.03 / 4.03 | — | 437.6 | 0 / 2 / 3 | +| SIN-100Hz-2V | 6.256 | -75.41 | 0 | -75.41 | 5.98 / 5.98 | — | 286.8 | 0 / 1 / 2 | +| SIN-1000Hz-2V | 31.68 | -66.81 | 0 | -66.81 | 22.9 / 22.9 | — | 430.5 | 0 / 2 / 3 | +| SIN-5000Hz-2V | 101.4 | -57.12 | 0 | -57.12 | 26.7 / 26.7 | — | 476.8 | 0 / 2 / 4 | +| SWP-lo-0.01V | 0.7803 | -53.06 | 0 | -53.06 | — | — | 319.2 | 0 / 1 / 3 | +| SWP-hi-0.1V | 7.821 | -53.06 | 0 | -53.06 | — | — | 337.8 | 0 / 1 / 3 | +| TT-0.05V | 0.6466 | -74.31 | 0 | -74.31 | — | — | 288.3 | 0 / 1 / 2 | +| BURST-0.5V | 8.292 | -69.68 | 0 | -69.68 | — | — | 331.2 | 0 / 1 / 2 | +| STEP-0.1V | 5.434 | -56.71 | 0 | -56.71 | — | — | 292.5 | 0 / 1 / 2 | +| DI-GTR L | 15.65 | -71.20 | 0 | -71.20 | — | — | 288.8 | 0 / 1 / 2 | +| DI-GTR LL | 15.26 | -70.92 | 0 | -70.92 | — | — | 281.9 | 0 / 1 / 2 | +| DI-GTR R | 13.84 | -71.30 | 0 | -71.30 | — | — | 287.1 | 0 / 1 / 2 | +| DI-GTR RR | 15.42 | -71.15 | 0 | -71.15 | — | — | 285.3 | 0 / 1 / 2 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpa | 391.9215 | 391.9215 | 1.45e-16 | +| g1a | 0.0001 | 0.0001 | 0.0001717 | +| in | 0.0000 | 0.0000 | 0 | +| k1a | 2.5271 | 2.5270 | 4.576e-05 | +| k1b | 3.7170 | 3.7166 | 0.0001069 | +| na | 0.0000 | 0.0000 | 6.543e-05 | +| p1a | 298.3260 | 298.3303 | 1.436e-05 | +| p1b | 354.7514 | 354.7553 | 1.12e-05 | +| vtop | 0.0000 | 0.0000 | 6.543e-05 | +| w1 | 0.0000 | 0.0000 | 6.543e-05 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b12_VOL0.2/waveform.png) + +### Harmonics + +![Harmonics](20261018_b12_VOL0.2/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b12_VOL0.2/magnitude.png) + +### Spectrogram (DI) + +![Spectrogram (DI)](20261018_b12_VOL0.2/spectrogram.png) diff --git a/harness/reports/M2/20261018_b12_VOL0.2/harmonics.png b/harness/reports/M2/20261018_b12_VOL0.2/harmonics.png new file mode 100644 index 0000000..e86538c Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL0.2/harmonics.png differ diff --git a/harness/reports/M2/20261018_b12_VOL0.2/magnitude.png b/harness/reports/M2/20261018_b12_VOL0.2/magnitude.png new file mode 100644 index 0000000..8e934d9 Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL0.2/magnitude.png differ diff --git a/harness/reports/M2/20261018_b12_VOL0.2/spectrogram.png b/harness/reports/M2/20261018_b12_VOL0.2/spectrogram.png new file mode 100644 index 0000000..9f46431 Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL0.2/spectrogram.png differ diff --git a/harness/reports/M2/20261018_b12_VOL0.2/waveform.png b/harness/reports/M2/20261018_b12_VOL0.2/waveform.png new file mode 100644 index 0000000..48aa0b8 Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL0.2/waveform.png differ diff --git a/harness/reports/M2/20261018_b12_VOL1.0.md b/harness/reports/M2/20261018_b12_VOL1.0.md new file mode 100644 index 0000000..22b25e4 --- /dev/null +++ b/harness/reports/M2/20261018_b12_VOL1.0.md @@ -0,0 +1,198 @@ +# M2 report: b12 / VOL1.0 + +- Block: B12 StageV1aV1b (V1a + V1b, joint root) +- Preset: VOL1.0 — Preamp Volume 1.0; standard signal set (M2) +- Knobs: preampVolume=1, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b12.cir` sha256 `ddc48819203d327c`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 106 · FAIL 0 · INFO 15 (INFO = measured, not scored in M2) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpa) | 1.45e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(g1a) | 0.0001717 | ≤ 0.005 | PASS | +| dc_rel_error | v(in) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1a) | 4.576e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1b) | 0.0001076 | ≤ 0.005 | PASS | +| dc_rel_error | v(na) | 0.003703 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1a) | 1.436e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.128e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(vtop) | 0.003703 | ≤ 0.005 | PASS | +| dc_rel_error | v(w1) | 0.003703 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.01V | -75.65 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.01V | 0.01302 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.01V | 0.0001619 pp | — | INFO | +| newton_failures | SIN-100Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.01V | 1 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.01V | -66.56 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.01V | 0.01679 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.01V | 0.0004362 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.01V | -57.21 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.01V | 0.01187 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.01V | 0.0004926 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.01V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.01V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -75.15 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.0242 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 0.001852 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -65.65 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.02272 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 0.007833 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -57.01 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.00886 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.006626 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.5V | -67.4 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.5V | 0.04441 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.5V | 0.0174 pp | — | INFO | +| newton_failures | SIN-100Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.5V | -65.17 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.5V | 0.01001 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.5V | 0.01103 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.5V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.5V | -56.6 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.5V | 0.0126 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.5V | 0.01142 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.5V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-2V | -74.08 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-2V | 0.0105 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-2V | 0.003024 pp | — | INFO | +| newton_failures | SIN-100Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-2V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-2V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-2V | -64.32 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-2V | 0.001354 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-2V | 0.0006628 pp | — | INFO | +| newton_failures | SIN-1000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-2V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-2V | -54.32 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-2V | 0.01782 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-2V | 0.009844 pp | — | INFO | +| newton_failures | SIN-5000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-2V | 7 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-lo-0.01V | -58.57 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.01V | 0.02988 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.01V | 0.0343 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.01V | 0.03277 dB | — | INFO | +| newton_failures | SWP-lo-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.01V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-hi-0.1V | -58.41 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-0.1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | TT-0.05V | -71.86 dB | ≤ -20 | PASS | +| newton_failures | TT-0.05V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.05V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.05V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | BURST-0.5V | -65.18 dB | ≤ -20 | PASS | +| newton_failures | BURST-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | BURST-0.5V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | STEP-0.1V | -68.47 dB | ≤ -20 | PASS | +| newton_failures | STEP-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-0.1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR L | -68.01 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR L | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR L | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR L | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR LL | -68.29 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR LL | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR LL | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR LL | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR R | -68.31 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR R | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR R | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR R | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | DI-GTR RR | -67.83 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR RR | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR RR | 1 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR RR | 4 | ≤ 12 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.01V | 1.598 | -75.65 | 0 | -75.65 | 0.0981 / 0.0979 | — | 291.0 | 0 / 1 / 1 | +| SIN-1000Hz-0.01V | 3.577 | -66.56 | 0 | -66.56 | 0.195 / 0.195 | — | 292.6 | 0 / 1 / 2 | +| SIN-5000Hz-0.01V | 3.859 | -57.21 | 0 | -57.21 | 0.225 / 0.225 | — | 438.5 | 0 / 2 / 2 | +| SIN-100Hz-0.1V | 16.22 | -75.15 | 0 | -75.15 | 1.06 / 1.06 | — | 293.0 | 0 / 1 / 2 | +| SIN-1000Hz-0.1V | 36.57 | -65.65 | 0 | -65.65 | 3.14 / 3.13 | — | 430.3 | 0 / 2 / 2 | +| SIN-5000Hz-0.1V | 39.52 | -57.01 | 0 | -57.01 | 3.78 / 3.78 | — | 440.0 | 0 / 2 / 2 | +| SIN-100Hz-0.5V | 83.21 | -67.40 | 0 | -67.40 | 19.4 / 19.4 | — | 294.2 | 0 / 1 / 2 | +| SIN-1000Hz-0.5V | 183.1 | -65.17 | 0 | -65.17 | 30.2 / 30.1 | — | 404.0 | 0 / 2 / 3 | +| SIN-5000Hz-0.5V | 199.1 | -56.60 | 0 | -56.60 | 31.2 / 31.2 | — | 493.5 | 0 / 2 / 4 | +| SIN-100Hz-2V | 230.6 | -74.08 | 0 | -74.08 | 35 / 35 | — | 329.2 | 0 / 1 / 2 | +| SIN-1000Hz-2V | 250.7 | -64.32 | 0 | -64.32 | 40 / 40 | — | 467.1 | 0 / 2 / 4 | +| SIN-5000Hz-2V | 274.5 | -54.32 | 0 | -54.32 | 49 / 49 | — | 504.2 | 0 / 2 / 7 | +| SWP-lo-0.01V | 3.826 | -58.57 | 0 | -58.57 | — | — | 344.4 | 0 / 1 / 3 | +| SWP-hi-0.1V | 39.33 | -58.41 | 0 | -58.41 | — | — | 377.6 | 0 / 2 / 3 | +| TT-0.05V | 22.4 | -71.86 | 0 | -71.86 | — | — | 288.0 | 0 / 1 / 2 | +| BURST-0.5V | 182.9 | -65.18 | 0 | -65.18 | — | — | 365.7 | 0 / 2 / 3 | +| STEP-0.1V | 37.88 | -68.47 | 0 | -68.47 | — | — | 297.0 | 0 / 1 / 3 | +| DI-GTR L | 237.4 | -68.01 | 0 | -68.01 | — | — | 314.2 | 0 / 1 / 3 | +| DI-GTR LL | 236.9 | -68.29 | 0 | -68.29 | — | — | 306.5 | 0 / 1 / 3 | +| DI-GTR R | 238.4 | -68.31 | 0 | -68.31 | — | — | 310.8 | 0 / 1 / 3 | +| DI-GTR RR | 238.1 | -67.83 | 0 | -67.83 | — | — | 312.9 | 0 / 1 / 4 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpa | 391.9215 | 391.9215 | 1.45e-16 | +| g1a | 0.0001 | 0.0001 | 0.0001717 | +| in | 0.0000 | 0.0000 | 0 | +| k1a | 2.5271 | 2.5270 | 4.576e-05 | +| k1b | 3.7178 | 3.7174 | 0.0001076 | +| na | 0.0010 | 0.0010 | 0.003703 | +| p1a | 298.3260 | 298.3303 | 1.436e-05 | +| p1b | 354.7437 | 354.7477 | 1.128e-05 | +| vtop | 0.0010 | 0.0010 | 0.003703 | +| w1 | 0.0010 | 0.0010 | 0.003703 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b12_VOL1.0/waveform.png) + +### Harmonics + +![Harmonics](20261018_b12_VOL1.0/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b12_VOL1.0/magnitude.png) + +### Spectrogram (DI) + +![Spectrogram (DI)](20261018_b12_VOL1.0/spectrogram.png) diff --git a/harness/reports/M2/20261018_b12_VOL1.0/harmonics.png b/harness/reports/M2/20261018_b12_VOL1.0/harmonics.png new file mode 100644 index 0000000..666a639 Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL1.0/harmonics.png differ diff --git a/harness/reports/M2/20261018_b12_VOL1.0/magnitude.png b/harness/reports/M2/20261018_b12_VOL1.0/magnitude.png new file mode 100644 index 0000000..ac2179a Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL1.0/magnitude.png differ diff --git a/harness/reports/M2/20261018_b12_VOL1.0/spectrogram.png b/harness/reports/M2/20261018_b12_VOL1.0/spectrogram.png new file mode 100644 index 0000000..5794959 Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL1.0/spectrogram.png differ diff --git a/harness/reports/M2/20261018_b12_VOL1.0/waveform.png b/harness/reports/M2/20261018_b12_VOL1.0/waveform.png new file mode 100644 index 0000000..b54dbec Binary files /dev/null and b/harness/reports/M2/20261018_b12_VOL1.0/waveform.png differ diff --git a/harness/reports/M2/20261018_b12_knob_jump.md b/harness/reports/M2/20261018_b12_knob_jump.md new file mode 100644 index 0000000..1317893 --- /dev/null +++ b/harness/reports/M2/20261018_b12_knob_jump.md @@ -0,0 +1,9 @@ +# M2 report: B12 knob-jump test + +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 +- Knob targets 0 → 1 in 10 ms from t = 20 ms during a 1000 Hz, 0.1 V tone at the guitar input (DC 0.0000 V); other knobs at their defaults. Engine: smoothing 20 ms, matrix update every 32 samples. SPICE: pot resistances follow the same smoothed trajectory continuously. +- Window: the ramp and the 20 ms after it. Pass (D-025): no NaN/Inf, ESR ≤ -20 dB. + +| Case | Finite | ESR | Status | Peak error / ref peak | Error energy > 5 kHz vs tone | +|---|---|---|---|---|---| +| preampVolume | yes | -55.9 dB | PASS | 1.31e-03 | -64.9 dB | diff --git a/harness/reports/M3/20261018_b1234_DEFAULT.md b/harness/reports/M3/20261018_b1234_DEFAULT.md new file mode 100644 index 0000000..f8d0223 --- /dev/null +++ b/harness/reports/M3/20261018_b1234_DEFAULT.md @@ -0,0 +1,224 @@ +# M3 report: b1234 / DEFAULT + +- Block: B1234 Preamp (B12 + B3 + B4 in one tree, 8-port root, D-038) +- Preset: DEFAULT — Default knobs; standard signal set at the block levels +- Knobs: preampVolume=0.6, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b1234.cir` sha256 `a99cb5b98a48184b`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 119 · FAIL 0 · INFO 15 (INFO = measured, not scored in M3) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpa) | 1.45e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(bpx) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(g1a) | 0.0001717 | ≤ 0.005 | PASS | +| dc_rel_error | v(g2a) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(in) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1a) | 4.576e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k1b) | 0.000107 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2a) | 2.495e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2b) | 1.794e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(mw) | 1.175e-08 | ≤ 0.005 | PASS | +| dc_rel_error | v(na) | 0.0006024 | ≤ 0.005 | PASS | +| dc_rel_error | v(nb) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(nbb) | 1.175e-08 | ≤ 0.005 | PASS | +| dc_rel_error | v(nd) | 1.794e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(ne) | 1.179e-08 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1a) | 1.436e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.121e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(p2a) | 1.85e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(tt) | 8.356e-09 | ≤ 0.005 | PASS | +| dc_rel_error | v(tw) | 9.614e-09 | ≤ 0.005 | PASS | +| dc_rel_error | v(vtop) | 0.0006024 | ≤ 0.005 | PASS | +| dc_rel_error | v(w1) | 0.0006024 | ≤ 0.005 | PASS | +| dc_rel_error | v(y) | 3.257e-10 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.01V | -73.08 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.01V | 0.002595 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.01V | 1.433e-05 pp | — | INFO | +| newton_failures | SIN-100Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.01V | 2 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.01V | -60.63 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.01V | 0.01803 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.01V | 0.001323 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.01V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.01V | 2 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.01V | -53.07 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.01V | 0.1088 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.01V | 0.03125 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.01V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.01V | 6 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -73.53 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.02799 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 0.001435 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 2 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -57.75 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.02889 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 0.007326 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 6 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -47.24 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.03821 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.008787 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 3 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.5V | -75.29 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.5V | 0.002416 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.5V | 6.976e-05 pp | — | INFO | +| newton_failures | SIN-100Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.5V | 5 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.5V | -50.57 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.5V | 0.02096 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.5V | 0.005945 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.5V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.5V | -39.33 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.5V | 0.0322 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.5V | 0.00618 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.5V | 3 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.5V | 9 | ≤ 32 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-2V | -70.14 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-2V | 0.00951 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-2V | 0.004205 pp | — | INFO | +| newton_failures | SIN-100Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-2V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-2V | 5 | ≤ 32 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-2V | -47.39 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-2V | 0.00316 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-2V | 0.0003278 pp | — | INFO | +| newton_failures | SIN-1000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-2V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-2V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-2V | -34.32 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-2V | 0.1697 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-2V | 0.007558 pp | — | INFO | +| newton_failures | SIN-5000Hz-2V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-2V | 3 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-2V | 10 | ≤ 32 | PASS | +| nonlinear_esr_db | SWP-lo-0.01V | -51.28 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.01V | 1.146 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.01V | 1.073 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.01V | 1.155 dB | — | INFO | +| newton_failures | SWP-lo-0.01V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.01V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.01V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | SWP-hi-0.1V | -46.6 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-0.1V | 10 | ≤ 32 | PASS | +| nonlinear_esr_db | TT-0.05V | -69.19 dB | ≤ -20 | PASS | +| newton_failures | TT-0.05V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.05V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.05V | 3 | ≤ 32 | PASS | +| nonlinear_esr_db | BURST-0.5V | -51.14 dB | ≤ -20 | PASS | +| newton_failures | BURST-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-0.5V | 2 | ≤ 3 | PASS | +| newton_max_iterations | BURST-0.5V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | STEP-0.1V | -56.98 dB | ≤ -20 | PASS | +| newton_failures | STEP-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-0.1V | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | DI-GTR L | -62.5 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR L | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR L | 2 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR L | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | DI-GTR LL | -62.95 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR LL | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR LL | 2 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR LL | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | DI-GTR R | -63.68 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR R | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR R | 2 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR R | 7 | ≤ 32 | PASS | +| nonlinear_esr_db | DI-GTR RR | -62.6 dB | ≤ -20 | PASS | +| newton_failures | DI-GTR RR | 0 | ≤ 0 | PASS | +| newton_median_iterations | DI-GTR RR | 2 | ≤ 3 | PASS | +| newton_max_iterations | DI-GTR RR | 7 | ≤ 32 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.01V | 0.1088 | -73.08 | 0 | -73.08 | 0.129 / 0.129 | — | 729.9 | 0 / 1 / 2 | +| SIN-1000Hz-0.01V | 0.4171 | -60.63 | 0 | -60.63 | 0.864 / 0.866 | — | 1085.8 | 0 / 2 / 2 | +| SIN-5000Hz-0.01V | 1.39 | -53.07 | 0 | -53.07 | 6.4 / 6.43 | — | 1238.8 | 0 / 2 / 6 | +| SIN-100Hz-0.1V | 1.071 | -73.53 | 0 | -73.53 | 1.65 / 1.65 | — | 741.1 | 0 / 1 / 2 | +| SIN-1000Hz-0.1V | 1.771 | -57.75 | 0 | -57.75 | 42.6 / 42.6 | — | 1142.8 | 0 / 2 / 6 | +| SIN-5000Hz-0.1V | 2.482 | -47.24 | 0 | -47.24 | 48 / 48 | — | 1437.1 | 0 / 3 / 7 | +| SIN-100Hz-0.5V | 2.723 | -75.29 | 0 | -75.29 | 15.9 / 15.9 | — | 777.2 | 0 / 1 / 5 | +| SIN-1000Hz-0.5V | 2.543 | -50.57 | 0 | -50.57 | 63.6 / 63.6 | — | 1116.4 | 0 / 2 / 7 | +| SIN-5000Hz-0.5V | 2.549 | -39.33 | 0 | -39.33 | 44.7 / 44.7 | — | 1451.0 | 0 / 3 / 9 | +| SIN-100Hz-2V | 2.881 | -70.14 | 0 | -70.14 | 28.2 / 28.3 | — | 779.8 | 0 / 1 / 5 | +| SIN-1000Hz-2V | 2.798 | -47.39 | 0 | -47.39 | 63.6 / 63.6 | — | 1228.5 | 0 / 2 / 7 | +| SIN-5000Hz-2V | 2.542 | -34.32 | 0 | -34.32 | 44.4 / 44.5 | — | 1438.5 | 0 / 3 / 10 | +| SWP-lo-0.01V | 1.367 | -51.28 | 0 | -51.28 | — | — | 957.7 | 0 / 1 / 7 | +| SWP-hi-0.1V | 1.928 | -46.60 | 0 | -46.60 | — | — | 1099.4 | 0 / 2 / 10 | +| TT-0.05V | 1.627 | -69.19 | 0 | -69.19 | — | — | 805.5 | 0 / 1 / 3 | +| BURST-0.5V | 2.548 | -51.14 | 0 | -51.14 | — | — | 1138.4 | 0 / 2 / 7 | +| STEP-0.1V | 2.403 | -56.98 | 0 | -56.98 | — | — | 882.0 | 0 / 1 / 7 | +| DI-GTR L | 2.564 | -62.50 | 0 | -62.50 | — | — | 954.6 | 0 / 2 / 7 | +| DI-GTR LL | 2.571 | -62.95 | 0 | -62.95 | — | — | 952.9 | 0 / 2 / 7 | +| DI-GTR R | 2.628 | -63.68 | 0 | -63.68 | — | — | 950.9 | 0 / 2 / 7 | +| DI-GTR RR | 2.679 | -62.60 | 0 | -62.60 | — | — | 966.2 | 0 / 2 / 7 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpa | 391.9215 | 391.9215 | 1.45e-16 | +| bpx | 404.9982 | 404.9982 | 0 | +| g1a | 0.0001 | 0.0001 | 0.0001717 | +| g2a | 0.0005 | 0.0005 | 0.0006604 | +| in | 0.0000 | 0.0000 | 0 | +| k1a | 2.5271 | 2.5270 | 4.576e-05 | +| k1b | 3.7171 | 3.7167 | 0.000107 | +| k2a | 1.4139 | 1.4138 | 2.495e-05 | +| k2b | 233.1404 | 233.1446 | 1.794e-05 | +| mw | 0.0000 | -0.0000 | 1.175e-08 | +| na | 0.0002 | 0.0002 | 0.0006024 | +| nb | 0.0005 | 0.0005 | 0.0006604 | +| nbb | 0.0000 | -0.0000 | 1.175e-08 | +| nd | 233.1404 | 233.1446 | 1.794e-05 | +| ne | 0.0000 | -0.0000 | 1.179e-08 | +| p1a | 298.3260 | 298.3303 | 1.436e-05 | +| p1b | 354.7502 | 354.7542 | 1.121e-05 | +| p2a | 232.5771 | 232.5814 | 1.85e-05 | +| tt | 0.0000 | -0.0000 | 8.356e-09 | +| tw | 0.0000 | -0.0000 | 9.614e-09 | +| vtop | 0.0002 | 0.0002 | 0.0006024 | +| w1 | 0.0002 | 0.0002 | 0.0006024 | +| y | 0.0000 | -0.0000 | 3.257e-10 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b1234_DEFAULT/waveform.png) + +### Harmonics + +![Harmonics](20261018_b1234_DEFAULT/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b1234_DEFAULT/magnitude.png) + +### Spectrogram (DI) + +![Spectrogram (DI)](20261018_b1234_DEFAULT/spectrogram.png) diff --git a/harness/reports/M3/20261018_b1234_DEFAULT/harmonics.png b/harness/reports/M3/20261018_b1234_DEFAULT/harmonics.png new file mode 100644 index 0000000..0672b69 Binary files /dev/null and b/harness/reports/M3/20261018_b1234_DEFAULT/harmonics.png differ diff --git a/harness/reports/M3/20261018_b1234_DEFAULT/magnitude.png b/harness/reports/M3/20261018_b1234_DEFAULT/magnitude.png new file mode 100644 index 0000000..2e5e9d0 Binary files /dev/null and b/harness/reports/M3/20261018_b1234_DEFAULT/magnitude.png differ diff --git a/harness/reports/M3/20261018_b1234_DEFAULT/spectrogram.png b/harness/reports/M3/20261018_b1234_DEFAULT/spectrogram.png new file mode 100644 index 0000000..3ab05ab Binary files /dev/null and b/harness/reports/M3/20261018_b1234_DEFAULT/spectrogram.png differ diff --git a/harness/reports/M3/20261018_b1234_DEFAULT/waveform.png b/harness/reports/M3/20261018_b1234_DEFAULT/waveform.png new file mode 100644 index 0000000..3f9c1e3 Binary files /dev/null and b/harness/reports/M3/20261018_b1234_DEFAULT/waveform.png differ diff --git a/harness/reports/M3/20261018_b1234_knob_jump.md b/harness/reports/M3/20261018_b1234_knob_jump.md new file mode 100644 index 0000000..3bb6f6c --- /dev/null +++ b/harness/reports/M3/20261018_b1234_knob_jump.md @@ -0,0 +1,14 @@ +# M3 report: B1234 knob-jump test + +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 +- Knob targets 0 → 1 in 10 ms from t = 20 ms during a 1000 Hz, 0.1 V tone at the guitar input (DC 0.0000 V); other knobs at their defaults. Engine: smoothing 20 ms, matrix update every 32 samples. SPICE: pot resistances follow the same smoothed trajectory continuously. +- Window: the ramp and the 20 ms after it. Pass (D-025): no NaN/Inf, ESR ≤ -20 dB. + +| Case | Finite | ESR | Status | Peak error / ref peak | Error energy > 5 kHz vs tone | +|---|---|---|---|---|---| +| preampVolume | yes | -40.9 dB | PASS | 2.56e-02 | -44.1 dB | +| treble | yes | -54.2 dB | PASS | 5.45e-03 | -56.8 dB | +| middle | yes | -50.3 dB | PASS | 5.17e-03 | -57.9 dB | +| bass | yes | -55.1 dB | PASS | 3.54e-03 | -64.9 dB | +| master | yes | -41.7 dB | PASS | 7.99e-03 | -46.1 dB | +| preampVolume+treble+middle+bass+master | yes | -39.1 dB | PASS | 1.16e-02 | -43.4 dB | diff --git a/harness/reports/M3/20261018_b34_DEFAULT.md b/harness/reports/M3/20261018_b34_DEFAULT.md new file mode 100644 index 0000000..e541df1 --- /dev/null +++ b/harness/reports/M3/20261018_b34_DEFAULT.md @@ -0,0 +1,182 @@ +# M3 report: b34 / DEFAULT + +- Block: B34 StageV2aV2bToneStack (B3 + B4 in one tree, D-033) +- Preset: DEFAULT — Default knobs; standard signal set at the block levels +- Knobs: preampVolume=0.6, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b34.cir` sha256 `07117b5737acfc59`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 94 · FAIL 0 · INFO 15 (INFO = measured, not scored in M3) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpx) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(g2a) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2a) | 2.495e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2b) | 1.794e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(mw) | 1.776e-12 | ≤ 0.005 | PASS | +| dc_rel_error | v(nb) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(nbb) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(nd) | 1.794e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(ne) | 4.086e-11 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.602e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(p2a) | 1.85e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(tt) | 2.132e-11 | ≤ 0.005 | PASS | +| dc_rel_error | v(tw) | 3.553e-12 | ≤ 0.005 | PASS | +| dc_rel_error | v(y) | 6.661e-13 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -82.13 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.001176 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 7.992e-06 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 1 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -65.33 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.01302 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 8.693e-05 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -58.54 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.03089 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.0001545 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-1V | -82.11 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-1V | 0.003703 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-1V | 8.123e-05 pp | — | INFO | +| newton_failures | SIN-100Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-1V | -65.3 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-1V | 0.01307 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-1V | 0.0008653 pp | — | INFO | +| newton_failures | SIN-1000Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-1V | -58.5 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-1V | 0.03105 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-1V | 0.00154 pp | — | INFO | +| newton_failures | SIN-5000Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-10V | -78.5 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-10V | 0.005395 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-10V | 0.002693 pp | — | INFO | +| newton_failures | SIN-100Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-10V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-10V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-10V | -63.53 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-10V | 0.01261 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-10V | 0.001774 pp | — | INFO | +| newton_failures | SIN-1000Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-10V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-10V | 6 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-10V | -57.72 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-10V | 0.02582 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-10V | 0.01119 pp | — | INFO | +| newton_failures | SIN-5000Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-10V | 3 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-10V | 7 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-50V | -76.52 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-50V | 0.00116 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-50V | 0.0009068 pp | — | INFO | +| newton_failures | SIN-100Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-50V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-50V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-50V | -59.44 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-50V | 0.003692 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-50V | 4.422e-05 pp | — | INFO | +| newton_failures | SIN-1000Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-50V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-50V | 7 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-50V | -48.13 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-50V | 0.01608 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-50V | 0.01416 pp | — | INFO | +| newton_failures | SIN-5000Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-50V | 3 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-50V | 7 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-lo-0.1V | -57.59 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.1V | 0.01347 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.1V | 0.01496 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.1V | 0.02764 dB | — | INFO | +| newton_failures | SWP-lo-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-hi-1V | -57.57 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | TT-0.5V | -74.6 dB | ≤ -20 | PASS | +| newton_failures | TT-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | BURST-10V | -63.52 dB | ≤ -20 | PASS | +| newton_failures | BURST-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-10V | 1 | ≤ 3 | PASS | +| newton_max_iterations | BURST-10V | 6 | ≤ 12 | PASS | +| nonlinear_esr_db | STEP-1V | -72.86 dB | ≤ -20 | PASS | +| newton_failures | STEP-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-1V | 2 | ≤ 12 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.1V | 0.04206 | -82.13 | 0 | -82.13 | 0.0456 / 0.0456 | — | 328.2 | 0 / 1 / 1 | +| SIN-1000Hz-0.1V | 0.03283 | -65.33 | 0 | -65.33 | 0.073 / 0.0731 | — | 330.0 | 0 / 1 / 2 | +| SIN-5000Hz-0.1V | 0.05907 | -58.54 | 0 | -58.54 | 0.0582 / 0.0584 | — | 479.9 | 0 / 2 / 2 | +| SIN-100Hz-1V | 0.4183 | -82.11 | 0 | -82.11 | 0.458 / 0.458 | — | 323.5 | 0 / 1 / 2 | +| SIN-1000Hz-1V | 0.3312 | -65.30 | 0 | -65.30 | 0.73 / 0.731 | — | 462.7 | 0 / 2 / 2 | +| SIN-5000Hz-1V | 0.5848 | -58.50 | 0 | -58.50 | 0.581 / 0.583 | — | 506.8 | 0 / 2 / 2 | +| SIN-100Hz-10V | 2.747 | -78.50 | 0 | -78.50 | 10.8 / 10.8 | — | 368.8 | 0 / 1 / 2 | +| SIN-1000Hz-10V | 1.642 | -63.53 | 0 | -63.53 | 36.8 / 36.8 | — | 507.0 | 0 / 2 / 6 | +| SIN-5000Hz-10V | 2.381 | -57.72 | 0 | -57.72 | 32.4 / 32.4 | — | 628.1 | 0 / 3 / 7 | +| SIN-100Hz-50V | 3.15 | -76.52 | 0 | -76.52 | 29.4 / 29.4 | — | 350.8 | 0 / 1 / 4 | +| SIN-1000Hz-50V | 2.419 | -59.44 | 0 | -59.44 | 67.2 / 67.2 | — | 484.0 | 0 / 2 / 7 | +| SIN-5000Hz-50V | 2.527 | -48.13 | 0 | -48.13 | 55.6 / 55.6 | — | 611.2 | 0 / 3 / 7 | +| SWP-lo-0.1V | 0.05772 | -57.59 | 0 | -57.59 | — | — | 378.9 | 0 / 1 / 2 | +| SWP-hi-1V | 0.5784 | -57.57 | 0 | -57.57 | — | — | 408.8 | 0 / 1 / 3 | +| TT-0.5V | 0.318 | -74.60 | 0 | -74.60 | — | — | 324.9 | 0 / 1 / 2 | +| BURST-10V | 1.64 | -63.52 | 0 | -63.52 | — | — | 424.5 | 0 / 1 / 6 | +| STEP-1V | 0.621 | -72.86 | 0 | -72.86 | — | — | 332.6 | 0 / 1 / 2 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpx | 404.9982 | 404.9982 | 0 | +| g2a | 0.0005 | 0.0005 | 0.0006604 | +| k2a | 1.4139 | 1.4138 | 2.495e-05 | +| k2b | 233.1404 | 233.1446 | 1.794e-05 | +| mw | 0.0000 | 0.0000 | 1.776e-12 | +| nb | 0.0005 | 0.0005 | 0.0006604 | +| nbb | 0.0000 | 0.0000 | 0 | +| nd | 233.1404 | 233.1446 | 1.794e-05 | +| ne | 0.0000 | -0.0000 | 4.086e-11 | +| p1b | 354.7502 | 354.7502 | 1.602e-16 | +| p2a | 232.5771 | 232.5814 | 1.85e-05 | +| tt | 0.0000 | 0.0000 | 2.132e-11 | +| tw | 0.0000 | -0.0000 | 3.553e-12 | +| y | 0.0000 | 0.0000 | 6.661e-13 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b34_DEFAULT/waveform.png) + +### Harmonics + +![Harmonics](20261018_b34_DEFAULT/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b34_DEFAULT/magnitude.png) diff --git a/harness/reports/M3/20261018_b34_DEFAULT/harmonics.png b/harness/reports/M3/20261018_b34_DEFAULT/harmonics.png new file mode 100644 index 0000000..7d7587f Binary files /dev/null and b/harness/reports/M3/20261018_b34_DEFAULT/harmonics.png differ diff --git a/harness/reports/M3/20261018_b34_DEFAULT/magnitude.png b/harness/reports/M3/20261018_b34_DEFAULT/magnitude.png new file mode 100644 index 0000000..33d890d Binary files /dev/null and b/harness/reports/M3/20261018_b34_DEFAULT/magnitude.png differ diff --git a/harness/reports/M3/20261018_b34_DEFAULT/waveform.png b/harness/reports/M3/20261018_b34_DEFAULT/waveform.png new file mode 100644 index 0000000..cd4669e Binary files /dev/null and b/harness/reports/M3/20261018_b34_DEFAULT/waveform.png differ diff --git a/harness/reports/M3/20261018_b34_knob_jump.md b/harness/reports/M3/20261018_b34_knob_jump.md new file mode 100644 index 0000000..41f0e6e --- /dev/null +++ b/harness/reports/M3/20261018_b34_knob_jump.md @@ -0,0 +1,13 @@ +# M3 report: B34 knob-jump test + +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 +- Knob targets 0 → 1 in 10 ms from t = 20 ms during a 1000 Hz, 1 V tone on the J2 DC level (DC 354.7502 V); other knobs at their defaults. Engine: smoothing 20 ms, matrix update every 32 samples. SPICE: pot resistances follow the same smoothed trajectory continuously. +- Window: the ramp and the 20 ms after it. Pass (D-025): no NaN/Inf, ESR ≤ -20 dB. + +| Case | Finite | ESR | Status | Peak error / ref peak | Error energy > 5 kHz vs tone | +|---|---|---|---|---|---| +| treble | yes | -67.6 dB | PASS | 1.04e-03 | -68.4 dB | +| middle | yes | -64.2 dB | PASS | 1.03e-03 | -72.4 dB | +| bass | yes | -62.9 dB | PASS | 9.12e-04 | -109.9 dB | +| master | yes | -54.1 dB | PASS | 2.47e-03 | -56.1 dB | +| treble+middle+bass+master | yes | -53.1 dB | PASS | 2.89e-03 | -54.8 dB | diff --git a/harness/reports/M3/20261018_b3_DEFAULT.md b/harness/reports/M3/20261018_b3_DEFAULT.md new file mode 100644 index 0000000..62d9d4f --- /dev/null +++ b/harness/reports/M3/20261018_b3_DEFAULT.md @@ -0,0 +1,168 @@ +# M3 report: b3 / DEFAULT + +- Block: B3 StageV2aV2b +- Preset: DEFAULT — Default knobs; standard signal set at the block levels +- Knobs: preampVolume=0.6, treble=0.5, middle=0.5, bass=0.5, master=0.3, presence=0.5 +- Date: 2026-10-18 +- Engine commit: `d37baf0 (dirty)` +- Testbench: `harness/testbenches/b3.cir` sha256 `7e2f0a59288617d9`; netlist sha256 `ffd9b2812204248f`; tubes.lib sha256 `c9c9c88346c69010` +- ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 + +## Summary + +PASS 87 · FAIL 0 · INFO 15 (INFO = measured, not scored in M3) + +| Check | Item | Measured | Tolerance | Status | +|---|---|---|---|---| +| dc_rel_error | v(bpx) | 0 | ≤ 0.005 | PASS | +| dc_rel_error | v(g2a) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2a) | 2.495e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(k2b) | 1.794e-05 | ≤ 0.005 | PASS | +| dc_rel_error | v(nb) | 0.0006604 | ≤ 0.005 | PASS | +| dc_rel_error | v(p1b) | 1.602e-16 | ≤ 0.005 | PASS | +| dc_rel_error | v(p2a) | 1.85e-05 | ≤ 0.005 | PASS | +| nonlinear_esr_db | SIN-100Hz-0.1V | -82.22 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-0.1V | 0.001141 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-0.1V | 8.687e-06 pp | — | INFO | +| newton_failures | SIN-100Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-0.1V | 1 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-0.1V | -65.4 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-0.1V | 0.01272 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-0.1V | 6.728e-05 pp | — | INFO | +| newton_failures | SIN-1000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-0.1V | -58.58 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-0.1V | 0.03003 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-0.1V | 0.0001551 pp | — | INFO | +| newton_failures | SIN-5000Hz-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-0.1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-1V | -82.19 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-1V | 0.003423 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-1V | 8.843e-05 pp | — | INFO | +| newton_failures | SIN-100Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-1V | -65.38 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-1V | 0.01281 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-1V | 0.0006782 pp | — | INFO | +| newton_failures | SIN-1000Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-1V | -58.54 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-1V | 0.031 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-1V | 0.00162 pp | — | INFO | +| newton_failures | SIN-5000Hz-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-1V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-100Hz-10V | -80.18 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-10V | 0.01487 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-10V | 0.0009158 pp | — | INFO | +| newton_failures | SIN-100Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-10V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-10V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-1000Hz-10V | -65.85 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-10V | 0.01237 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-10V | 0.004707 pp | — | INFO | +| newton_failures | SIN-1000Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-10V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-10V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | SIN-5000Hz-10V | -59.93 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-10V | 0.01483 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-10V | 0.01898 pp | — | INFO | +| newton_failures | SIN-5000Hz-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-10V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-10V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-100Hz-50V | -76.63 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-100Hz-50V | 0.001125 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-100Hz-50V | 0.0003032 pp | — | INFO | +| newton_failures | SIN-100Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-100Hz-50V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SIN-100Hz-50V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-1000Hz-50V | -64.03 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-1000Hz-50V | 0.00263 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-1000Hz-50V | 0.0009813 pp | — | INFO | +| newton_failures | SIN-1000Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-1000Hz-50V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-1000Hz-50V | 4 | ≤ 12 | PASS | +| nonlinear_esr_db_overdrive | SIN-5000Hz-50V | -54.24 dB | ≤ -20 | PASS | +| harmonics_2_5_db | SIN-5000Hz-50V | 0.004271 dB | ≤ 0.5 | PASS | +| thd_pp | SIN-5000Hz-50V | 0.0137 pp | — | INFO | +| newton_failures | SIN-5000Hz-50V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SIN-5000Hz-50V | 2 | ≤ 3 | PASS | +| newton_max_iterations | SIN-5000Hz-50V | 5 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-lo-0.1V | -58.73 dB | ≤ -20 | PASS | +| linear_mag_db_20_10k | SWP-lo-0.1V | 0.01374 dB | ≤ 0.1 | INFO | +| linear_mag_db_10k_20k | SWP-lo-0.1V | 0.01517 dB | ≤ 0.3 | INFO | +| method_mag_db_spice_tran_vs_ac | SWP-lo-0.1V | 0.02799 dB | — | INFO | +| newton_failures | SWP-lo-0.1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-lo-0.1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-lo-0.1V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | SWP-hi-1V | -58.7 dB | ≤ -20 | PASS | +| newton_failures | SWP-hi-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | SWP-hi-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | SWP-hi-1V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | TT-0.5V | -74.27 dB | ≤ -20 | PASS | +| newton_failures | TT-0.5V | 0 | ≤ 0 | PASS | +| newton_median_iterations | TT-0.5V | 1 | ≤ 3 | PASS | +| newton_max_iterations | TT-0.5V | 2 | ≤ 12 | PASS | +| nonlinear_esr_db | BURST-10V | -65.85 dB | ≤ -20 | PASS | +| newton_failures | BURST-10V | 0 | ≤ 0 | PASS | +| newton_median_iterations | BURST-10V | 1 | ≤ 3 | PASS | +| newton_max_iterations | BURST-10V | 3 | ≤ 12 | PASS | +| nonlinear_esr_db | STEP-1V | -73.14 dB | ≤ -20 | PASS | +| newton_failures | STEP-1V | 0 | ≤ 0 | PASS | +| newton_median_iterations | STEP-1V | 1 | ≤ 3 | PASS | +| newton_max_iterations | STEP-1V | 2 | ≤ 12 | PASS | + +## Signals + +| Signal | Peak F [V] | ESR [dB] | Best lag | ESR at lag [dB] | THD F / E [%] | Power F / E [W] | ns/sample | Newton fail / median / max it | +|---|---|---|---|---|---|---|---|---| +| SIN-100Hz-0.1V | 2.04 | -82.22 | 0 | -82.22 | 0.051 / 0.051 | — | 305.3 | 0 / 1 / 1 | +| SIN-1000Hz-0.1V | 2.497 | -65.40 | 0 | -65.40 | 0.0581 / 0.0582 | — | 300.9 | 0 / 1 / 2 | +| SIN-5000Hz-0.1V | 3.013 | -58.58 | 0 | -58.58 | 0.0603 / 0.0605 | — | 450.1 | 0 / 2 / 2 | +| SIN-100Hz-1V | 20.19 | -82.19 | 0 | -82.19 | 0.511 / 0.511 | — | 293.5 | 0 / 1 / 2 | +| SIN-1000Hz-1V | 25.12 | -65.38 | 0 | -65.38 | 0.583 / 0.584 | — | 403.5 | 0 / 2 / 2 | +| SIN-5000Hz-1V | 29.73 | -58.54 | 0 | -58.54 | 0.606 / 0.608 | — | 460.7 | 0 / 2 / 2 | +| SIN-100Hz-10V | 127.9 | -80.18 | 0 | -80.18 | 14.3 / 14.3 | — | 334.1 | 0 / 1 / 2 | +| SIN-1000Hz-10V | 130.3 | -65.85 | 0 | -65.85 | 19 / 19 | — | 492.5 | 0 / 2 / 3 | +| SIN-5000Hz-10V | 130.4 | -59.93 | 0 | -59.93 | 28 / 28 | — | 545.9 | 0 / 2 / 4 | +| SIN-100Hz-50V | 130.3 | -76.63 | 0 | -76.63 | 40.1 / 40.1 | — | 329.8 | 0 / 1 / 3 | +| SIN-1000Hz-50V | 139.5 | -64.03 | 0 | -64.03 | 45.5 / 45.5 | — | 397.7 | 0 / 2 / 4 | +| SIN-5000Hz-50V | 163.6 | -54.24 | 0 | -54.24 | 54.9 / 54.9 | — | 492.0 | 0 / 2 / 5 | +| SWP-lo-0.1V | 2.938 | -58.73 | 0 | -58.73 | — | — | 344.6 | 0 / 1 / 2 | +| SWP-hi-1V | 29.71 | -58.70 | 0 | -58.70 | — | — | 362.6 | 0 / 1 / 3 | +| TT-0.5V | 19.5 | -74.27 | 0 | -74.27 | — | — | 292.9 | 0 / 1 / 2 | +| BURST-10V | 130.3 | -65.85 | 0 | -65.85 | — | — | 378.9 | 0 / 1 / 3 | +| STEP-1V | 30.83 | -73.14 | 0 | -73.14 | — | — | 294.0 | 0 / 1 / 2 | + +## DC operating point + +| Node | SPICE [V] | Engine [V] | Rel. error | +|---|---|---|---| +| bpx | 404.9982 | 404.9982 | 0 | +| g2a | 0.0005 | 0.0005 | 0.0006604 | +| k2a | 1.4139 | 1.4138 | 2.495e-05 | +| k2b | 233.1404 | 233.1446 | 1.794e-05 | +| nb | 0.0005 | 0.0005 | 0.0006604 | +| p1b | 354.7502 | 354.7502 | 1.602e-16 | +| p2a | 232.5771 | 232.5814 | 1.85e-05 | + +Engine values are the probe values after the first sample (zero input) following `reset()`. Nodes the engine does not probe yet show —. + +## Figures + +### Waveform overlay and error (most demanding signal) + +![Waveform overlay and error (most demanding signal)](20261018_b3_DEFAULT/waveform.png) + +### Harmonics + +![Harmonics](20261018_b3_DEFAULT/harmonics.png) + +### Magnitude response + +![Magnitude response](20261018_b3_DEFAULT/magnitude.png) diff --git a/harness/reports/M3/20261018_b3_DEFAULT/harmonics.png b/harness/reports/M3/20261018_b3_DEFAULT/harmonics.png new file mode 100644 index 0000000..71cda0d Binary files /dev/null and b/harness/reports/M3/20261018_b3_DEFAULT/harmonics.png differ diff --git a/harness/reports/M3/20261018_b3_DEFAULT/magnitude.png b/harness/reports/M3/20261018_b3_DEFAULT/magnitude.png new file mode 100644 index 0000000..27a85a4 Binary files /dev/null and b/harness/reports/M3/20261018_b3_DEFAULT/magnitude.png differ diff --git a/harness/reports/M3/20261018_b3_DEFAULT/waveform.png b/harness/reports/M3/20261018_b3_DEFAULT/waveform.png new file mode 100644 index 0000000..751fd1a Binary files /dev/null and b/harness/reports/M3/20261018_b3_DEFAULT/waveform.png differ diff --git a/harness/reports/M4/20261018_full_acceptance.md b/harness/reports/M4/20261018_full_acceptance.md index 2a5e713..992d414 100644 --- a/harness/reports/M4/20261018_full_acceptance.md +++ b/harness/reports/M4/20261018_full_acceptance.md @@ -1,7 +1,7 @@ # M4 acceptance: full amplifier vs the full netlist -- Date: 2026-10-18, engine commit `9a422dd (dirty)`, ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 -- Netlist sha256 `83f01b6fd8b64a06`, tubes.lib sha256 `c9c9c88346c69010` +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 768000 Hz, SPICE reltol 1e-08 +- Netlist sha256 `ffd9b2812204248f`, tubes.lib sha256 `c9c9c88346c69010` - Engine: `ampwav --block full` (volts at the jack and across the 16 Ω load), the checks of SPEC §7 M4. ## Summary @@ -38,90 +38,90 @@ PASS 107 · FAIL 0 | nfb | newton_unrescued | closed 100 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 100 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | closed 100 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | closed 1000 Hz | 0.005358 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | closed 1000 Hz | 0.00536 dB | ≤ 0.5 | PASS | | nfb | newton_failures | closed 1000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | closed 1000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 1000 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | closed 1000 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | closed 5000 Hz | 0.01505 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | closed 5000 Hz | 0.01479 dB | ≤ 0.5 | PASS | | nfb | newton_failures | closed 5000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | closed 5000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 5000 Hz | 2 | ≤ 3 | PASS | | nfb | newton_max_iterations | closed 5000 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | open 100 Hz | 0.002271 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | open 100 Hz | 0.00227 dB | ≤ 0.5 | PASS | | nfb | newton_failures | open 100 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | open 100 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 100 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 100 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | open 1000 Hz | 0.007852 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | open 1000 Hz | 0.007856 dB | ≤ 0.5 | PASS | | nfb | newton_failures | open 1000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | open 1000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 1000 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 1000 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | open 5000 Hz | 0.0599 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | open 5000 Hz | 0.05701 dB | ≤ 0.5 | PASS | | nfb | newton_failures | open 5000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | open 5000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 5000 Hz | 2 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 5000 Hz | 2 | ≤ 32 | PASS | | clean | total_esr_db | CLEAN SIN-1000Hz-0.025V | -30.3 dB | ≤ -20 | PASS | -| clean | total_harmonics_2_9_db | CLEAN SIN-1000Hz-0.025V | 0.8439 dB | ≤ 1.5 | PASS | +| clean | total_harmonics_2_9_db | CLEAN SIN-1000Hz-0.025V | 0.7255 dB | ≤ 1.5 | PASS | | clean | newton_failures | CLEAN SIN-1000Hz-0.025V | 0 | ≤ 0 | PASS | | clean | newton_unrescued | CLEAN SIN-1000Hz-0.025V | 0 | — | INFO | | clean | newton_median_iterations | CLEAN SIN-1000Hz-0.025V | 2 | ≤ 3 | PASS | -| clean | newton_max_iterations | CLEAN SIN-1000Hz-0.025V | 5 | ≤ 32 | PASS | -| clean | total_power_rel | CLEAN SIN-1000Hz-0.025V | 0.03926 | ≤ 0.05 | PASS | -| clean | total_thd_pp | CLEAN SIN-1000Hz-0.025V | 0.2177 pp | ≤ 0.5 | PASS | -| stability | stability_out_v | max |out| | 4.355e-05 V | ≤ 0.001 | PASS | -| stability | stability_growth | RMS last 10 s − first 10 s | 4.006e-13 V | ≤ 1e-06 | PASS | +| clean | newton_max_iterations | CLEAN SIN-1000Hz-0.025V | 3 | ≤ 32 | PASS | +| clean | total_power_rel | CLEAN SIN-1000Hz-0.025V | 0.03927 | ≤ 0.05 | PASS | +| clean | total_thd_pp | CLEAN SIN-1000Hz-0.025V | 0.2173 pp | ≤ 0.5 | PASS | +| stability | stability_out_v | max |out| | 4.267e-05 V | ≤ 0.001 | PASS | +| stability | stability_growth | RMS last 10 s − first 10 s | 8.08e-12 V | ≤ 1e-06 | PASS | | stability | newton_failures | 60 s silence | 0 | ≤ 0 | PASS | | stability | newton_unrescued | 60 s silence | 0 | — | INFO | | stability | newton_median_iterations | 60 s silence | 1 | ≤ 3 | PASS | | stability | newton_max_iterations | 60 s silence | 1 | ≤ 32 | PASS | -| overdrive | total_esr_db | OVERDRIVE SIN-220Hz-0.3V | -68.01 dB | ≤ -20 | PASS | -| overdrive | total_harmonics_2_9_db | OVERDRIVE SIN-220Hz-0.3V | 0.008618 dB | ≤ 1.5 | PASS | -| overdrive | sag_min_v | OVERDRIVE SIN-220Hz-0.3V | 0.003538 V | ≤ 2 | PASS | +| overdrive | total_esr_db | OVERDRIVE SIN-220Hz-0.3V | -67.99 dB | ≤ -20 | PASS | +| overdrive | total_harmonics_2_9_db | OVERDRIVE SIN-220Hz-0.3V | 0.008614 dB | ≤ 1.5 | PASS | +| overdrive | sag_min_v | OVERDRIVE SIN-220Hz-0.3V | 0.003537 V | ≤ 2 | PASS | | overdrive | newton_failures | OVERDRIVE SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | overdrive | newton_unrescued | OVERDRIVE SIN-220Hz-0.3V | 0 | — | INFO | | overdrive | newton_median_iterations | OVERDRIVE SIN-220Hz-0.3V | 1 | ≤ 3 | PASS | | overdrive | newton_max_iterations | OVERDRIVE SIN-220Hz-0.3V | 5 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH SIN-220Hz-0.3V | -70.27 dB | ≤ -20 | PASS | -| crunch_drive | total_harmonics_2_9_db | CRUNCH SIN-220Hz-0.3V | 0.00792 dB | ≤ 1.5 | PASS | +| crunch_drive | total_esr_db | CRUNCH SIN-220Hz-0.3V | -70.25 dB | ≤ -20 | PASS | +| crunch_drive | total_harmonics_2_9_db | CRUNCH SIN-220Hz-0.3V | 0.007954 dB | ≤ 1.5 | PASS | | crunch_drive | newton_failures | CRUNCH SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH SIN-220Hz-0.3V | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH SIN-220Hz-0.3V | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | CRUNCH SIN-220Hz-0.3V | 5 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR L | -60.76 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR L | -60.8 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR L | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR L | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR L | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | CRUNCH DI-GTR L | 7 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR LL | -61.31 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR LL | -61.36 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR LL | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR LL | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR LL | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | CRUNCH DI-GTR LL | 7 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR R | -62.06 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR R | -62.11 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR R | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR R | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR R | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | CRUNCH DI-GTR R | 7 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR RR | -60.9 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR RR | -60.94 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR RR | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR RR | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR RR | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | CRUNCH DI-GTR RR | 9 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE SIN-220Hz-0.3V | -63.51 dB | ≤ -20 | PASS | -| crunch_drive | total_harmonics_2_9_db | DRIVE SIN-220Hz-0.3V | 0.03181 dB | ≤ 1.5 | PASS | +| crunch_drive | newton_max_iterations | CRUNCH DI-GTR RR | 7 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | DRIVE SIN-220Hz-0.3V | -63.49 dB | ≤ -20 | PASS | +| crunch_drive | total_harmonics_2_9_db | DRIVE SIN-220Hz-0.3V | 0.03171 dB | ≤ 1.5 | PASS | | crunch_drive | newton_failures | DRIVE SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE SIN-220Hz-0.3V | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE SIN-220Hz-0.3V | 1 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | DRIVE SIN-220Hz-0.3V | 5 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR L | -60.26 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR L | -60.24 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR L | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR L | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR L | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | DRIVE DI-GTR L | 7 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR LL | -61.53 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR LL | -61.54 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR LL | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR LL | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR LL | 2 | ≤ 3 | PASS | @@ -131,11 +131,11 @@ PASS 107 · FAIL 0 | crunch_drive | newton_unrescued | DRIVE DI-GTR R | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR R | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | DRIVE DI-GTR R | 7 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR RR | -60.29 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR RR | -60.27 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR RR | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR RR | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR RR | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | DRIVE DI-GTR RR | 7 | ≤ 32 | PASS | +| crunch_drive | newton_max_iterations | DRIVE DI-GTR RR | 8 | ≤ 32 | PASS | ## DC operating point @@ -167,30 +167,30 @@ PASS 107 · FAIL 0 | f | SPICE closed | engine closed | SPICE open | engine open | NFB SPICE | NFB engine | |---|---|---|---|---|---|---| -| 100 Hz | 45.92 | 45.92 | 56.34 | 56.34 | 10.42 | 10.42 | -| 1000 Hz | 53.54 | 53.54 | 57.85 | 57.86 | 4.32 | 4.32 | -| 5000 Hz | 69.86 | 69.88 | 77.77 | 77.83 | 7.91 | 7.95 | +| 100 Hz | 45.93 | 45.93 | 56.34 | 56.34 | 10.42 | 10.42 | +| 1000 Hz | 53.54 | 53.55 | 57.86 | 57.86 | 4.32 | 4.32 | +| 5000 Hz | 69.59 | 69.61 | 77.50 | 77.55 | 7.91 | 7.95 | ## Signals | Preset | Signal | ESR | best lag | harm. 2–9 | THD F / E | Power F / E | min v(ct) F / E | |---|---|---|---|---|---|---|---| -| CLEAN | SIN-1000Hz-0.025V | -30.3 dB | 2 | 0.84 dB | 7.37 / 7.59 % | 81.1 / 78.0 W | — | -| OVERDRIVE | SIN-220Hz-0.3V | -68.0 dB | 0 | 0.01 dB | 19.61 / 19.61 % | 32.2 / 32.2 W | 474.38 / 474.37 V | -| CRUNCH | SIN-220Hz-0.3V | -70.3 dB | 0 | 0.01 dB | 12.00 / 12.00 % | 31.6 / 31.6 W | — | +| CLEAN | SIN-1000Hz-0.025V | -30.3 dB | 2 | 0.73 dB | 7.37 / 7.59 % | 81.1 / 77.9 W | — | +| OVERDRIVE | SIN-220Hz-0.3V | -68.0 dB | 0 | 0.01 dB | 19.62 / 19.62 % | 32.2 / 32.2 W | 474.38 / 474.37 V | +| CRUNCH | SIN-220Hz-0.3V | -70.3 dB | 0 | 0.01 dB | 12.01 / 12.01 % | 31.6 / 31.6 W | — | | CRUNCH | DI-GTR L | -60.8 dB | 0 | — | — | — | — | -| CRUNCH | DI-GTR LL | -61.3 dB | 0 | — | — | — | — | +| CRUNCH | DI-GTR LL | -61.4 dB | 0 | — | — | — | — | | CRUNCH | DI-GTR R | -62.1 dB | 0 | — | — | — | — | | CRUNCH | DI-GTR RR | -60.9 dB | 0 | — | — | — | — | -| DRIVE | SIN-220Hz-0.3V | -63.5 dB | 0 | 0.03 dB | 22.53 / 22.53 % | 34.5 / 34.5 W | — | -| DRIVE | DI-GTR L | -60.3 dB | 0 | — | — | — | — | +| DRIVE | SIN-220Hz-0.3V | -63.5 dB | 0 | 0.03 dB | 22.53 / 22.53 % | 34.5 / 34.6 W | — | +| DRIVE | DI-GTR L | -60.2 dB | 0 | — | — | — | — | | DRIVE | DI-GTR LL | -61.5 dB | 0 | — | — | — | — | | DRIVE | DI-GTR R | -61.0 dB | 0 | — | — | — | — | | DRIVE | DI-GTR RR | -60.3 dB | 0 | — | — | — | — | ## Stability -60 s silence at Preamp / Master / Presence 1.0: max |out| 4.36e-05 V, RMS first / last 10 s 4.24e-05 / 4.24e-05 V. +60 s silence at Preamp / Master / Presence 1.0: max |out| 4.27e-05 V, RMS first / last 10 s 4.24e-05 / 4.24e-05 V. ## Delayed-NFB break diff --git a/harness/reports/M6/20261018_auval.log b/harness/reports/M6/20261018_auval.log index 78ae3db..c8eb1a9 100644 --- a/harness/reports/M6/20261018_auval.log +++ b/harness/reports/M6/20261018_auval.log @@ -15,12 +15,12 @@ Component Version: 0.0.1 (0x1) -------------------------------------------------- TESTING OPEN TIMES: COLD: -Time to open AudioUnit: 10.250 ms +Time to open AudioUnit: 10.234 ms WARM: -Time to open AudioUnit: 5.935 ms +Time to open AudioUnit: 6.247 ms This AudioUnit is a version 2 implementation. FIRST TIME: -Time for initialization: 9.994 ms +Time for initialization: 10.030 ms * * PASS -------------------------------------------------- @@ -65,7 +65,7 @@ VERIFYING SPECIAL PROPERTIES: VERIFYING CUSTOM UI Cocoa Views Available: 1 - JUCE_AUCocoaViewClass_387eba94ef07be2a + JUCE_AUCocoaViewClass_a0ff1c23697f1de4 PASS HAS FACTORY PRESETS diff --git a/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact.md b/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact.md index b37c301..167d538 100644 --- a/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact.md +++ b/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact.md @@ -1,7 +1,7 @@ # M4 acceptance: full amplifier vs the full netlist -- Date: 2026-10-18, engine commit `9a422dd (dirty)`, ngspice 47, fs = 384000 Hz, J4 exact, SPICE reltol 1e-08 -- Netlist sha256 `83f01b6fd8b64a06`, tubes.lib sha256 `c9c9c88346c69010` +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 384000 Hz, J4 exact, SPICE reltol 1e-08 +- Netlist sha256 `ffd9b2812204248f`, tubes.lib sha256 `c9c9c88346c69010` - Engine: `ampwav --block full` (volts at the jack and across the 16 Ω load), the checks of SPEC §7 M4. ## Summary @@ -38,12 +38,12 @@ PASS 107 · FAIL 0 | nfb | newton_unrescued | closed 100 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 100 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | closed 100 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | closed 1000 Hz | 0.00581 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | closed 1000 Hz | 0.005811 dB | ≤ 0.5 | PASS | | nfb | newton_failures | closed 1000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | closed 1000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 1000 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | closed 1000 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | closed 5000 Hz | 0.01713 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | closed 5000 Hz | 0.01669 dB | ≤ 0.5 | PASS | | nfb | newton_failures | closed 5000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | closed 5000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | closed 5000 Hz | 2 | ≤ 3 | PASS | @@ -53,89 +53,89 @@ PASS 107 · FAIL 0 | nfb | newton_unrescued | open 100 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 100 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 100 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | open 1000 Hz | 0.008418 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | open 1000 Hz | 0.008421 dB | ≤ 0.5 | PASS | | nfb | newton_failures | open 1000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | open 1000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 1000 Hz | 1 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 1000 Hz | 2 | ≤ 32 | PASS | -| nfb | nfb_gain_db | open 5000 Hz | 0.06358 dB | ≤ 0.5 | PASS | +| nfb | nfb_gain_db | open 5000 Hz | 0.06051 dB | ≤ 0.5 | PASS | | nfb | newton_failures | open 5000 Hz | 0 | ≤ 0 | PASS | | nfb | newton_unrescued | open 5000 Hz | 0 | — | INFO | | nfb | newton_median_iterations | open 5000 Hz | 2 | ≤ 3 | PASS | | nfb | newton_max_iterations | open 5000 Hz | 2 | ≤ 32 | PASS | -| clean | total_esr_db | CLEAN SIN-1000Hz-0.025V | -59.66 dB | ≤ -20 | PASS | -| clean | total_harmonics_2_9_db | CLEAN SIN-1000Hz-0.025V | 0.02005 dB | ≤ 1.5 | PASS | +| clean | total_esr_db | CLEAN SIN-1000Hz-0.025V | -59.65 dB | ≤ -20 | PASS | +| clean | total_harmonics_2_9_db | CLEAN SIN-1000Hz-0.025V | 0.02006 dB | ≤ 1.5 | PASS | | clean | newton_failures | CLEAN SIN-1000Hz-0.025V | 0 | ≤ 0 | PASS | | clean | newton_unrescued | CLEAN SIN-1000Hz-0.025V | 0 | — | INFO | | clean | newton_median_iterations | CLEAN SIN-1000Hz-0.025V | 2 | ≤ 3 | PASS | -| clean | newton_max_iterations | CLEAN SIN-1000Hz-0.025V | 5 | ≤ 32 | PASS | +| clean | newton_max_iterations | CLEAN SIN-1000Hz-0.025V | 6 | ≤ 32 | PASS | | clean | total_power_rel | CLEAN SIN-1000Hz-0.025V | 0.001223 | ≤ 0.05 | PASS | -| clean | total_thd_pp | CLEAN SIN-1000Hz-0.025V | 0.0004268 pp | ≤ 0.5 | PASS | -| stability | stability_out_v | max |out| | 4.853e-05 V | ≤ 0.001 | PASS | -| stability | stability_growth | RMS last 10 s − first 10 s | 5.72e-12 V | ≤ 1e-06 | PASS | +| clean | total_thd_pp | CLEAN SIN-1000Hz-0.025V | 0.0004352 pp | ≤ 0.5 | PASS | +| stability | stability_out_v | max |out| | 4.546e-05 V | ≤ 0.001 | PASS | +| stability | stability_growth | RMS last 10 s − first 10 s | 7.426e-12 V | ≤ 1e-06 | PASS | | stability | newton_failures | 60 s silence | 0 | ≤ 0 | PASS | | stability | newton_unrescued | 60 s silence | 0 | — | INFO | | stability | newton_median_iterations | 60 s silence | 1 | ≤ 3 | PASS | | stability | newton_max_iterations | 60 s silence | 1 | ≤ 32 | PASS | -| overdrive | total_esr_db | OVERDRIVE SIN-220Hz-0.3V | -67.51 dB | ≤ -20 | PASS | -| overdrive | total_harmonics_2_9_db | OVERDRIVE SIN-220Hz-0.3V | 0.009061 dB | ≤ 1.5 | PASS | +| overdrive | total_esr_db | OVERDRIVE SIN-220Hz-0.3V | -67.5 dB | ≤ -20 | PASS | +| overdrive | total_harmonics_2_9_db | OVERDRIVE SIN-220Hz-0.3V | 0.009058 dB | ≤ 1.5 | PASS | | overdrive | sag_min_v | OVERDRIVE SIN-220Hz-0.3V | 0.003903 V | ≤ 2 | PASS | | overdrive | newton_failures | OVERDRIVE SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | overdrive | newton_unrescued | OVERDRIVE SIN-220Hz-0.3V | 0 | — | INFO | | overdrive | newton_median_iterations | OVERDRIVE SIN-220Hz-0.3V | 2 | ≤ 3 | PASS | | overdrive | newton_max_iterations | OVERDRIVE SIN-220Hz-0.3V | 6 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH SIN-220Hz-0.3V | -69.67 dB | ≤ -20 | PASS | -| crunch_drive | total_harmonics_2_9_db | CRUNCH SIN-220Hz-0.3V | 0.008084 dB | ≤ 1.5 | PASS | +| crunch_drive | total_esr_db | CRUNCH SIN-220Hz-0.3V | -69.66 dB | ≤ -20 | PASS | +| crunch_drive | total_harmonics_2_9_db | CRUNCH SIN-220Hz-0.3V | 0.008117 dB | ≤ 1.5 | PASS | | crunch_drive | newton_failures | CRUNCH SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH SIN-220Hz-0.3V | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH SIN-220Hz-0.3V | 1 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | CRUNCH SIN-220Hz-0.3V | 5 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR L | -59.59 dB | ≤ -20 | PASS | +| crunch_drive | newton_max_iterations | CRUNCH SIN-220Hz-0.3V | 4 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR L | -59.73 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR L | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR L | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR L | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | CRUNCH DI-GTR L | 8 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR LL | -59.82 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR LL | -60.06 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR LL | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR LL | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR LL | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | CRUNCH DI-GTR LL | 8 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR R | -60.79 dB | ≤ -20 | PASS | +| crunch_drive | newton_max_iterations | CRUNCH DI-GTR LL | 7 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR R | -60.65 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR R | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR R | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR R | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | CRUNCH DI-GTR R | 8 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | CRUNCH DI-GTR RR | -59.38 dB | ≤ -20 | PASS | +| crunch_drive | newton_max_iterations | CRUNCH DI-GTR R | 7 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | CRUNCH DI-GTR RR | -59.5 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | CRUNCH DI-GTR RR | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | CRUNCH DI-GTR RR | 0 | — | INFO | | crunch_drive | newton_median_iterations | CRUNCH DI-GTR RR | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | CRUNCH DI-GTR RR | 11 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE SIN-220Hz-0.3V | -63.13 dB | ≤ -20 | PASS | -| crunch_drive | total_harmonics_2_9_db | DRIVE SIN-220Hz-0.3V | 0.03227 dB | ≤ 1.5 | PASS | +| crunch_drive | newton_max_iterations | CRUNCH DI-GTR RR | 8 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | DRIVE SIN-220Hz-0.3V | -63.12 dB | ≤ -20 | PASS | +| crunch_drive | total_harmonics_2_9_db | DRIVE SIN-220Hz-0.3V | 0.03219 dB | ≤ 1.5 | PASS | | crunch_drive | newton_failures | DRIVE SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE SIN-220Hz-0.3V | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE SIN-220Hz-0.3V | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | DRIVE SIN-220Hz-0.3V | 6 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR L | -59.39 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR L | -59.48 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR L | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR L | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR L | 2 | ≤ 3 | PASS | | crunch_drive | newton_max_iterations | DRIVE DI-GTR L | 9 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR LL | -60.32 dB | ≤ -20 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR LL | -60.63 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR LL | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR LL | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR LL | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | DRIVE DI-GTR LL | 10 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR R | -60.22 dB | ≤ -20 | PASS | +| crunch_drive | newton_max_iterations | DRIVE DI-GTR LL | 9 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR R | -60.43 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR R | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR R | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR R | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | DRIVE DI-GTR R | 9 | ≤ 32 | PASS | -| crunch_drive | total_esr_db | DRIVE DI-GTR RR | -59.42 dB | ≤ -20 | PASS | +| crunch_drive | newton_max_iterations | DRIVE DI-GTR R | 10 | ≤ 32 | PASS | +| crunch_drive | total_esr_db | DRIVE DI-GTR RR | -59.46 dB | ≤ -20 | PASS | | crunch_drive | newton_failures | DRIVE DI-GTR RR | 0 | ≤ 0 | PASS | | crunch_drive | newton_unrescued | DRIVE DI-GTR RR | 0 | — | INFO | | crunch_drive | newton_median_iterations | DRIVE DI-GTR RR | 2 | ≤ 3 | PASS | -| crunch_drive | newton_max_iterations | DRIVE DI-GTR RR | 8 | ≤ 32 | PASS | +| crunch_drive | newton_max_iterations | DRIVE DI-GTR RR | 9 | ≤ 32 | PASS | ## DC operating point @@ -167,30 +167,30 @@ PASS 107 · FAIL 0 | f | SPICE closed | engine closed | SPICE open | engine open | NFB SPICE | NFB engine | |---|---|---|---|---|---|---| -| 100 Hz | 45.92 | 45.92 | 56.34 | 56.34 | 10.42 | 10.42 | -| 1000 Hz | 53.54 | 53.54 | 57.85 | 57.86 | 4.32 | 4.32 | -| 5000 Hz | 69.86 | 69.88 | 77.77 | 77.83 | 7.91 | 7.95 | +| 100 Hz | 45.93 | 45.93 | 56.34 | 56.34 | 10.42 | 10.42 | +| 1000 Hz | 53.54 | 53.55 | 57.86 | 57.86 | 4.32 | 4.32 | +| 5000 Hz | 69.59 | 69.61 | 77.50 | 77.56 | 7.91 | 7.95 | ## Signals | Preset | Signal | ESR | best lag | harm. 2–9 | THD F / E | Power F / E | min v(ct) F / E | |---|---|---|---|---|---|---|---| -| CLEAN | SIN-1000Hz-0.025V | -59.7 dB | 0 | 0.02 dB | 7.37 / 7.37 % | 81.1 / 81.2 W | — | -| OVERDRIVE | SIN-220Hz-0.3V | -67.5 dB | 0 | 0.01 dB | 19.61 / 19.61 % | 32.2 / 32.2 W | 474.38 / 474.37 V | -| CRUNCH | SIN-220Hz-0.3V | -69.7 dB | 0 | 0.01 dB | 12.00 / 12.00 % | 31.6 / 31.6 W | — | -| CRUNCH | DI-GTR L | -59.6 dB | 0 | — | — | — | — | -| CRUNCH | DI-GTR LL | -59.8 dB | 0 | — | — | — | — | -| CRUNCH | DI-GTR R | -60.8 dB | 0 | — | — | — | — | -| CRUNCH | DI-GTR RR | -59.4 dB | 0 | — | — | — | — | -| DRIVE | SIN-220Hz-0.3V | -63.1 dB | 0 | 0.03 dB | 22.53 / 22.53 % | 34.5 / 34.5 W | — | -| DRIVE | DI-GTR L | -59.4 dB | 0 | — | — | — | — | -| DRIVE | DI-GTR LL | -60.3 dB | 0 | — | — | — | — | -| DRIVE | DI-GTR R | -60.2 dB | 0 | — | — | — | — | -| DRIVE | DI-GTR RR | -59.4 dB | 0 | — | — | — | — | +| CLEAN | SIN-1000Hz-0.025V | -59.6 dB | 0 | 0.02 dB | 7.37 / 7.37 % | 81.1 / 81.2 W | — | +| OVERDRIVE | SIN-220Hz-0.3V | -67.5 dB | 0 | 0.01 dB | 19.62 / 19.62 % | 32.2 / 32.2 W | 474.38 / 474.37 V | +| CRUNCH | SIN-220Hz-0.3V | -69.7 dB | 0 | 0.01 dB | 12.01 / 12.01 % | 31.6 / 31.6 W | — | +| CRUNCH | DI-GTR L | -59.7 dB | 0 | — | — | — | — | +| CRUNCH | DI-GTR LL | -60.1 dB | 0 | — | — | — | — | +| CRUNCH | DI-GTR R | -60.7 dB | 0 | — | — | — | — | +| CRUNCH | DI-GTR RR | -59.5 dB | 0 | — | — | — | — | +| DRIVE | SIN-220Hz-0.3V | -63.1 dB | 0 | 0.03 dB | 22.53 / 22.54 % | 34.5 / 34.6 W | — | +| DRIVE | DI-GTR L | -59.5 dB | 0 | — | — | — | — | +| DRIVE | DI-GTR LL | -60.6 dB | 0 | — | — | — | — | +| DRIVE | DI-GTR R | -60.4 dB | 0 | — | — | — | — | +| DRIVE | DI-GTR RR | -59.5 dB | 0 | — | — | — | — | ## Stability -60 s silence at Preamp / Master / Presence 1.0: max |out| 4.85e-05 V, RMS first / last 10 s 4.24e-05 / 4.24e-05 V. +60 s silence at Preamp / Master / Presence 1.0: max |out| 4.55e-05 V, RMS first / last 10 s 4.24e-05 / 4.24e-05 V. ## Delayed-NFB break diff --git a/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact_hot.md b/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact_hot.md index 69dc4fe..081078d 100644 --- a/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact_hot.md +++ b/harness/reports/M6/20261018_full_acceptance_fs384000_j4exact_hot.md @@ -1,7 +1,7 @@ # M4 acceptance: full amplifier vs the full netlist -- Date: 2026-10-18, engine commit `9a422dd (dirty)`, ngspice 47, fs = 384000 Hz, J4 exact, SPICE reltol 1e-08 -- Netlist sha256 `83f01b6fd8b64a06`, tubes.lib sha256 `c9c9c88346c69010` +- Date: 2026-10-18, engine commit `d37baf0 (dirty)`, ngspice 47, fs = 384000 Hz, J4 exact, SPICE reltol 1e-08 +- Netlist sha256 `ffd9b2812204248f`, tubes.lib sha256 `c9c9c88346c69010` - Engine: `ampwav --block full` (volts at the jack and across the 16 Ω load), the checks of SPEC §7 M4. ## Summary @@ -10,29 +10,29 @@ PASS 20 · FAIL 1 | Section | Check | Item | Measured | Tolerance | Status | |---|---|---|---|---|---| -| hot | total_esr_db | HOT SIN-220Hz-0.3V | -54.54 dB | ≤ -20 | PASS | -| hot | total_harmonics_2_9_db | HOT SIN-220Hz-0.3V | 0.008907 dB | ≤ 1.5 | PASS | +| hot | total_esr_db | HOT SIN-220Hz-0.3V | -54.53 dB | ≤ -20 | PASS | +| hot | total_harmonics_2_9_db | HOT SIN-220Hz-0.3V | 0.008763 dB | ≤ 1.5 | PASS | | hot | newton_failures | HOT SIN-220Hz-0.3V | 0 | ≤ 0 | PASS | | hot | newton_unrescued | HOT SIN-220Hz-0.3V | 0 | — | INFO | | hot | newton_median_iterations | HOT SIN-220Hz-0.3V | 2 | ≤ 3 | PASS | -| hot | newton_max_iterations | HOT SIN-220Hz-0.3V | 7 | ≤ 32 | PASS | -| hot | total_esr_db | HOT DI-GTR L | -40.32 dB | ≤ -20 | PASS | +| hot | newton_max_iterations | HOT SIN-220Hz-0.3V | 6 | ≤ 32 | PASS | +| hot | total_esr_db | HOT DI-GTR L | -40.27 dB | ≤ -20 | PASS | | hot | newton_failures | HOT DI-GTR L | 0 | ≤ 0 | PASS | | hot | newton_unrescued | HOT DI-GTR L | 0 | — | INFO | | hot | newton_median_iterations | HOT DI-GTR L | 2 | ≤ 3 | PASS | -| hot | newton_max_iterations | HOT DI-GTR L | 12 | ≤ 32 | PASS | -| hot | total_esr_db | HOT DI-GTR LL | -40.87 dB | ≤ -20 | PASS | +| hot | newton_max_iterations | HOT DI-GTR L | 15 | ≤ 32 | PASS | +| hot | total_esr_db | HOT DI-GTR LL | -41 dB | ≤ -20 | PASS | | hot | newton_failures | HOT DI-GTR LL | 0 | ≤ 0 | PASS | | hot | newton_unrescued | HOT DI-GTR LL | 0 | — | INFO | | hot | newton_median_iterations | HOT DI-GTR LL | 2 | ≤ 3 | PASS | -| hot | newton_max_iterations | HOT DI-GTR LL | 19 | ≤ 32 | PASS | -| hot | total_esr_db | HOT DI-GTR R | -41.26 dB | ≤ -20 | PASS | +| hot | newton_max_iterations | HOT DI-GTR LL | 13 | ≤ 32 | PASS | +| hot | total_esr_db | HOT DI-GTR R | -41.5 dB | ≤ -20 | PASS | | hot | newton_failures | HOT DI-GTR R | 0 | ≤ 0 | PASS | | hot | newton_unrescued | HOT DI-GTR R | 0 | — | INFO | | hot | newton_median_iterations | HOT DI-GTR R | 2 | ≤ 3 | PASS | -| hot | newton_max_iterations | HOT DI-GTR R | 13 | ≤ 32 | PASS | -| hot | total_esr_db | HOT DI-GTR RR | -40.91 dB | ≤ -20 | PASS | -| hot | newton_failures | HOT DI-GTR RR | 2 | ≤ 0 | FAIL | +| hot | newton_max_iterations | HOT DI-GTR R | 12 | ≤ 32 | PASS | +| hot | total_esr_db | HOT DI-GTR RR | -40.86 dB | ≤ -20 | PASS | +| hot | newton_failures | HOT DI-GTR RR | 1 | ≤ 0 | FAIL | | hot | newton_unrescued | HOT DI-GTR RR | 0 | — | INFO | | hot | newton_median_iterations | HOT DI-GTR RR | 2 | ≤ 3 | PASS | | hot | newton_max_iterations | HOT DI-GTR RR | 32 | ≤ 32 | PASS | @@ -41,10 +41,10 @@ PASS 20 · FAIL 1 | Preset | Signal | ESR | best lag | harm. 2–9 | THD F / E | Power F / E | min v(ct) F / E | |---|---|---|---|---|---|---|---| -| HOT | SIN-220Hz-0.3V | -54.5 dB | 0 | 0.01 dB | 37.87 / 37.87 % | 178.4 / 178.4 W | — | +| HOT | SIN-220Hz-0.3V | -54.5 dB | 0 | 0.01 dB | 37.86 / 37.86 % | 178.4 / 178.4 W | — | | HOT | DI-GTR L | -40.3 dB | 0 | — | — | — | — | -| HOT | DI-GTR LL | -40.9 dB | 0 | — | — | — | — | -| HOT | DI-GTR R | -41.3 dB | 0 | — | — | — | — | +| HOT | DI-GTR LL | -41.0 dB | 0 | — | — | — | — | +| HOT | DI-GTR R | -41.5 dB | 0 | — | — | — | — | | HOT | DI-GTR RR | -40.9 dB | 0 | — | — | — | — | ## Delayed-NFB break diff --git a/harness/reports/M6/20261018_plugin_cpu.md b/harness/reports/M6/20261018_plugin_cpu.md index ddff5ee..e01907b 100644 --- a/harness/reports/M6/20261018_plugin_cpu.md +++ b/harness/reports/M6/20261018_plugin_cpu.md @@ -1,39 +1,39 @@ # M6 plugin CPU under knob automation -- Date 2026-10-18, commit `9a422dd (dirty)`; `amp2203_render plugin` at the plugin defaults (2x, Power Amp Rate Full, exact J4, Newton tol 1e-4 V, half-steps on; D-054 – D-056, D-060), FIR oversampling, 20 s of DI GTR L at 48000 Hz; processBlock time only. +- Date 2026-10-18, commit `d37baf0 (dirty)`; `amp2203_render plugin` at the plugin defaults (2x, Power Amp Rate Full, exact J4, Newton tol 1e-4 V, half-steps on; D-054 – D-056, D-060), FIR oversampling, 20 s of DI GTR L at 48000 Hz; processBlock time only. - Automation between host blocks: lfo = 10 Hz triangle 0 → 10 → 0, jump = 0 ↔ 10 every 50 ms; "all" moves the six knobs together. One render at a time. | Base | Knob(s) | Modulation | Host block | CPU (% of one core) | Newton failures (rescued) | |---|---|---|---|---|---| -| default | — | static | 512 | 27.4 | 0 (0) | -| every knob 10 | — | static | 512 | 50.8 | 32 (32) | -| default | preampVolume | lfo | 512 | 26.3 | 0 (0) | -| default | preampVolume | jump | 512 | 25.9 | 0 (0) | +| default | — | static | 512 | 27.1 | 0 (0) | +| every knob 10 | — | static | 512 | 50.8 | 40 (40) | +| default | preampVolume | lfo | 512 | 26.2 | 0 (0) | +| default | preampVolume | jump | 512 | 25.8 | 0 (0) | | default | treble | lfo | 512 | 27.6 | 0 (0) | -| default | treble | jump | 512 | 27.7 | 0 (0) | -| default | middle | lfo | 512 | 27.4 | 0 (0) | -| default | middle | jump | 512 | 27.4 | 0 (0) | -| default | bass | lfo | 512 | 27.3 | 0 (0) | -| default | bass | jump | 512 | 27.3 | 0 (0) | -| default | master | lfo | 512 | 31.6 | 2 (2) | -| default | master | jump | 512 | 31.9 | 2 (2) | -| default | presence | lfo | 512 | 28.8 | 0 (0) | -| default | presence | jump | 512 | 28.7 | 0 (0) | -| default | all | lfo | 512 | 32.5 | 4 (4) | -| default | all | jump | 512 | 34.7 | 4 (4) | -| every knob 10 | preampVolume | lfo | 512 | 43.7 | 18 (18) | -| every knob 10 | preampVolume | jump | 512 | 43.6 | 19 (19) | -| every knob 10 | treble | lfo | 512 | 48.6 | 27 (27) | -| every knob 10 | treble | jump | 512 | 47.8 | 32 (32) | -| every knob 10 | middle | lfo | 512 | 48.6 | 31 (31) | -| every knob 10 | middle | jump | 512 | 48.9 | 23 (23) | -| every knob 10 | bass | lfo | 512 | 52.8 | 32 (32) | -| every knob 10 | bass | jump | 512 | 52.2 | 31 (31) | -| every knob 10 | master | lfo | 512 | 38.2 | 6 (6) | -| every knob 10 | master | jump | 512 | 38.5 | 5 (5) | -| every knob 10 | presence | lfo | 512 | 47.3 | 34 (34) | -| every knob 10 | presence | jump | 512 | 47.8 | 26 (26) | -| every knob 10 | all | lfo | 512 | 33.2 | 3 (3) | -| every knob 10 | all | jump | 512 | 34.7 | 1 (1) | -| default | all | jump | 64 | 34.3 | 5 (5) | -| every knob 10 | all | jump | 64 | 34.7 | 4 (4) | +| default | treble | jump | 512 | 27.3 | 0 (0) | +| default | middle | lfo | 512 | 27.2 | 0 (0) | +| default | middle | jump | 512 | 27.2 | 0 (0) | +| default | bass | lfo | 512 | 27.1 | 0 (0) | +| default | bass | jump | 512 | 27.2 | 0 (0) | +| default | master | lfo | 512 | 31.4 | 4 (4) | +| default | master | jump | 512 | 31.2 | 5 (5) | +| default | presence | lfo | 512 | 28.4 | 0 (0) | +| default | presence | jump | 512 | 28.5 | 0 (0) | +| default | all | lfo | 512 | 32.8 | 0 (0) | +| default | all | jump | 512 | 34.6 | 2 (2) | +| every knob 10 | preampVolume | lfo | 512 | 43.4 | 16 (16) | +| every knob 10 | preampVolume | jump | 512 | 43.0 | 24 (24) | +| every knob 10 | treble | lfo | 512 | 48.7 | 24 (24) | +| every knob 10 | treble | jump | 512 | 47.8 | 25 (25) | +| every knob 10 | middle | lfo | 512 | 48.2 | 28 (28) | +| every knob 10 | middle | jump | 512 | 48.5 | 24 (24) | +| every knob 10 | bass | lfo | 512 | 52.4 | 35 (35) | +| every knob 10 | bass | jump | 512 | 52.0 | 31 (31) | +| every knob 10 | master | lfo | 512 | 38.3 | 6 (6) | +| every knob 10 | master | jump | 512 | 38.4 | 8 (8) | +| every knob 10 | presence | lfo | 512 | 47.4 | 23 (23) | +| every knob 10 | presence | jump | 512 | 48.3 | 27 (27) | +| every knob 10 | all | lfo | 512 | 33.1 | 0 (0) | +| every knob 10 | all | jump | 512 | 34.6 | 4 (4) | +| default | all | jump | 64 | 34.2 | 7 (7) | +| every knob 10 | all | jump | 64 | 34.7 | 10 (10) | diff --git a/harness/reports/M6/20261018_plugin_null_2x_full.md b/harness/reports/M6/20261018_plugin_null_2x_full.md index 01fc0d2..6a63df8 100644 --- a/harness/reports/M6/20261018_plugin_null_2x_full.md +++ b/harness/reports/M6/20261018_plugin_null_2x_full.md @@ -1,6 +1,6 @@ # M5 wrapper null test: plugin vs ampwav at 96 kHz with the same resampling -- Date: 2026-10-18, commit `9a422dd (dirty)`; host rate 48000 Hz, 2x, Power Amp Rate full, exact J4 +- Date: 2026-10-18, commit `d37baf0 (dirty)`; host rate 48000 Hz, 2x, Power Amp Rate full, exact J4 - Plugin: `amp2203_render plugin` (the Amp2203Processor offline). Reference: the processor's oversampler up stage, `ampwav --block full --units fs --j4 exact` at 96000 Hz, the down stage. Default knobs and levels. - Tolerance (SPEC §7 M5): ESR ≤ -60 dB. @@ -8,55 +8,55 @@ PASS 26 · FAIL 0 | Filter | Signal | Peak out [FS] | ESR | Status | Render log | |---|---|---|---|---|---| -| fir | SIN-100Hz--40dBFS | 0.145 | -138.5 dB | PASS | processBlock 0.043 s for 0.200 s of audio: 21.5 % of one core, real-time factor 4.64 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 3 | -| fir | SIN-100Hz--20dBFS | 0.869 | -138.5 dB | PASS | processBlock 0.049 s for 0.200 s of audio: 24.6 % of one core, real-time factor 4.06 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 4 | -| fir | SIN-100Hz--6dBFS | 0.915 | -138.5 dB | PASS | processBlock 0.049 s for 0.200 s of audio: 24.5 % of one core, real-time factor 4.08 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 9 | -| fir | SIN-1000Hz--40dBFS | 0.374 | -138.5 dB | PASS | processBlock 0.072 s for 0.200 s of audio: 35.9 % of one core, real-time factor 2.78 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 6 | -| fir | SIN-1000Hz--20dBFS | 0.828 | -138.5 dB | PASS | processBlock 0.071 s for 0.200 s of audio: 35.4 % of one core, real-time factor 2.83 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 9 | -| fir | SIN-1000Hz--6dBFS | 0.972 | -138.5 dB | PASS | processBlock 0.076 s for 0.200 s of audio: 38.2 % of one core, real-time factor 2.62 +| fir | SIN-100Hz--40dBFS | 0.145 | -138.5 dB | PASS | processBlock 0.046 s for 0.200 s of audio: 23.1 % of one core, real-time factor 4.32 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 2 | +| fir | SIN-100Hz--20dBFS | 0.870 | -138.5 dB | PASS | processBlock 0.048 s for 0.200 s of audio: 24.0 % of one core, real-time factor 4.18 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 5 | +| fir | SIN-100Hz--6dBFS | 0.915 | -138.5 dB | PASS | processBlock 0.050 s for 0.200 s of audio: 24.8 % of one core, real-time factor 4.03 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 10 | +| fir | SIN-1000Hz--40dBFS | 0.383 | -138.5 dB | PASS | processBlock 0.073 s for 0.200 s of audio: 36.6 % of one core, real-time factor 2.73 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 7 | +| fir | SIN-1000Hz--20dBFS | 0.850 | -138.5 dB | PASS | processBlock 0.072 s for 0.200 s of audio: 35.9 % of one core, real-time factor 2.78 latency 49 samples, Newton failures 0 (rescued 0), max iterations 12 | -| fir | SIN-5000Hz--40dBFS | 0.864 | -138.5 dB | PASS | processBlock 0.090 s for 0.200 s of audio: 44.9 % of one core, real-time factor 2.22 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 19 | -| fir | SIN-5000Hz--20dBFS | 0.889 | -138.5 dB | PASS | processBlock 0.102 s for 0.200 s of audio: 50.9 % of one core, real-time factor 1.96 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 19 | -| fir | SIN-5000Hz--6dBFS | 0.930 | -138.5 dB | PASS | processBlock 0.235 s for 0.200 s of audio: 117.3 % of one core, real-time factor 0.85 -latency 49 samples, Newton failures 1009 (rescued 68), max iterations 32 | -| fir | DI-GTR L | 0.977 | -138.5 dB | PASS | processBlock 1.242 s for 5.000 s of audio: 24.8 % of one core, real-time factor 4.03 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 19 | -| fir | DI-GTR LL | 0.857 | -138.5 dB | PASS | processBlock 1.202 s for 5.000 s of audio: 24.0 % of one core, real-time factor 4.16 +| fir | SIN-1000Hz--6dBFS | 0.918 | -138.5 dB | PASS | processBlock 0.079 s for 0.200 s of audio: 39.3 % of one core, real-time factor 2.55 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 13 | +| fir | SIN-5000Hz--40dBFS | 0.857 | -138.5 dB | PASS | processBlock 0.089 s for 0.200 s of audio: 44.7 % of one core, real-time factor 2.24 latency 49 samples, Newton failures 0 (rescued 0), max iterations 17 | -| fir | DI-GTR R | 0.945 | -138.5 dB | PASS | processBlock 1.215 s for 5.000 s of audio: 24.3 % of one core, real-time factor 4.12 -latency 49 samples, Newton failures 0 (rescued 0), max iterations 20 | -| fir | DI-GTR RR | 0.979 | -138.5 dB | PASS | processBlock 1.252 s for 5.000 s of audio: 25.0 % of one core, real-time factor 3.99 +| fir | SIN-5000Hz--20dBFS | 0.891 | -138.5 dB | PASS | processBlock 0.102 s for 0.200 s of audio: 50.8 % of one core, real-time factor 1.97 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 19 | +| fir | SIN-5000Hz--6dBFS | 0.863 | -138.5 dB | PASS | processBlock 0.515 s for 0.200 s of audio: 257.3 % of one core, real-time factor 0.39 +latency 49 samples, Newton failures 3518 (rescued 89), max iterations 32 | +| fir | DI-GTR L | 0.984 | -138.5 dB | PASS | processBlock 1.236 s for 5.000 s of audio: 24.7 % of one core, real-time factor 4.04 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 18 | +| fir | DI-GTR LL | 0.861 | -138.5 dB | PASS | processBlock 1.189 s for 5.000 s of audio: 23.8 % of one core, real-time factor 4.21 latency 49 samples, Newton failures 0 (rescued 0), max iterations 17 | -| iir | SIN-100Hz--40dBFS | 0.145 | -138.5 dB | PASS | processBlock 0.041 s for 0.200 s of audio: 20.7 % of one core, real-time factor 4.82 +| fir | DI-GTR R | 0.944 | -138.5 dB | PASS | processBlock 1.206 s for 5.000 s of audio: 24.1 % of one core, real-time factor 4.15 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 16 | +| fir | DI-GTR RR | 0.990 | -138.5 dB | PASS | processBlock 1.245 s for 5.000 s of audio: 24.9 % of one core, real-time factor 4.02 +latency 49 samples, Newton failures 0 (rescued 0), max iterations 19 | +| iir | SIN-100Hz--40dBFS | 0.145 | -138.5 dB | PASS | processBlock 0.042 s for 0.200 s of audio: 20.8 % of one core, real-time factor 4.81 latency 4 samples, Newton failures 0 (rescued 0), max iterations 2 | -| iir | SIN-100Hz--20dBFS | 0.870 | -138.5 dB | PASS | processBlock 0.044 s for 0.200 s of audio: 22.2 % of one core, real-time factor 4.51 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 6 | -| iir | SIN-100Hz--6dBFS | 0.915 | -138.5 dB | PASS | processBlock 0.046 s for 0.200 s of audio: 22.8 % of one core, real-time factor 4.39 +| iir | SIN-100Hz--20dBFS | 0.870 | -138.5 dB | PASS | processBlock 0.044 s for 0.200 s of audio: 22.1 % of one core, real-time factor 4.52 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 4 | +| iir | SIN-100Hz--6dBFS | 0.915 | -138.5 dB | PASS | processBlock 0.045 s for 0.200 s of audio: 22.4 % of one core, real-time factor 4.47 latency 4 samples, Newton failures 0 (rescued 0), max iterations 6 | -| iir | SIN-1000Hz--40dBFS | 0.414 | -138.5 dB | PASS | processBlock 0.067 s for 0.200 s of audio: 33.4 % of one core, real-time factor 3.00 +| iir | SIN-1000Hz--40dBFS | 0.402 | -138.5 dB | PASS | processBlock 0.066 s for 0.200 s of audio: 32.8 % of one core, real-time factor 3.05 latency 4 samples, Newton failures 0 (rescued 0), max iterations 7 | -| iir | SIN-1000Hz--20dBFS | 0.928 | -138.5 dB | PASS | processBlock 0.071 s for 0.200 s of audio: 35.3 % of one core, real-time factor 2.84 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 9 | -| iir | SIN-1000Hz--6dBFS | 1.044 | -138.5 dB | PASS | processBlock 0.075 s for 0.200 s of audio: 37.4 % of one core, real-time factor 2.67 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 22 | -| iir | SIN-5000Hz--40dBFS | 0.982 | -138.5 dB | PASS | processBlock 0.090 s for 0.200 s of audio: 44.9 % of one core, real-time factor 2.23 +| iir | SIN-1000Hz--20dBFS | 0.932 | -138.5 dB | PASS | processBlock 0.070 s for 0.200 s of audio: 34.9 % of one core, real-time factor 2.87 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 10 | +| iir | SIN-1000Hz--6dBFS | 1.087 | -138.5 dB | PASS | processBlock 0.076 s for 0.200 s of audio: 37.8 % of one core, real-time factor 2.65 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 19 | +| iir | SIN-5000Hz--40dBFS | 0.987 | -138.5 dB | PASS | processBlock 0.090 s for 0.200 s of audio: 45.0 % of one core, real-time factor 2.22 latency 4 samples, Newton failures 0 (rescued 0), max iterations 16 | -| iir | SIN-5000Hz--20dBFS | 1.015 | -138.5 dB | PASS | processBlock 0.101 s for 0.200 s of audio: 50.6 % of one core, real-time factor 1.98 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 22 | -| iir | SIN-5000Hz--6dBFS | 1.020 | -138.5 dB | PASS | processBlock 0.139 s for 0.200 s of audio: 69.3 % of one core, real-time factor 1.44 -latency 4 samples, Newton failures 268 (rescued 184), max iterations 32 | -| iir | DI-GTR L | 0.985 | -138.5 dB | PASS | processBlock 1.250 s for 5.000 s of audio: 25.0 % of one core, real-time factor 4.00 +| iir | SIN-5000Hz--20dBFS | 1.048 | -138.5 dB | PASS | processBlock 0.100 s for 0.200 s of audio: 50.1 % of one core, real-time factor 1.99 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 18 | +| iir | SIN-5000Hz--6dBFS | 1.032 | -138.5 dB | PASS | processBlock 0.574 s for 0.200 s of audio: 286.8 % of one core, real-time factor 0.35 +latency 4 samples, Newton failures 3955 (rescued 58), max iterations 32 | +| iir | DI-GTR L | 0.950 | -138.5 dB | PASS | processBlock 1.230 s for 5.000 s of audio: 24.6 % of one core, real-time factor 4.07 latency 4 samples, Newton failures 0 (rescued 0), max iterations 18 | -| iir | DI-GTR LL | 0.985 | -138.5 dB | PASS | processBlock 1.217 s for 5.000 s of audio: 24.3 % of one core, real-time factor 4.11 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 22 | -| iir | DI-GTR R | 1.027 | -138.5 dB | PASS | processBlock 1.216 s for 5.000 s of audio: 24.3 % of one core, real-time factor 4.11 +| iir | DI-GTR LL | 0.955 | -138.5 dB | PASS | processBlock 1.175 s for 5.000 s of audio: 23.5 % of one core, real-time factor 4.25 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 19 | +| iir | DI-GTR R | 1.046 | -138.5 dB | PASS | processBlock 1.192 s for 5.000 s of audio: 23.8 % of one core, real-time factor 4.19 latency 4 samples, Newton failures 0 (rescued 0), max iterations 18 | -| iir | DI-GTR RR | 1.036 | -138.5 dB | PASS | processBlock 1.250 s for 5.000 s of audio: 25.0 % of one core, real-time factor 4.00 -latency 4 samples, Newton failures 0 (rescued 0), max iterations 21 | +| iir | DI-GTR RR | 1.049 | -138.5 dB | PASS | processBlock 1.230 s for 5.000 s of audio: 24.6 % of one core, real-time factor 4.07 +latency 4 samples, Newton failures 0 (rescued 0), max iterations 23 | diff --git a/harness/reports/M6/20261018_pluginval_au.log b/harness/reports/M6/20261018_pluginval_au.log index 277776b..ff74411 100644 --- a/harness/reports/M6/20261018_pluginval_au.log +++ b/harness/reports/M6/20261018_pluginval_au.log @@ -1,5 +1,5 @@ Started validating: /Users/kimmo/Library/Audio/Plug-Ins/Components/Amp2203.component -Random seed: 0xe186bf +Random seed: 0x2e108e Validation started Strictness level: 5 ----------------------------------------------------------------- diff --git a/harness/reports/M6/20261018_pluginval_vst3.log b/harness/reports/M6/20261018_pluginval_vst3.log index 7f785b4..619f549 100644 --- a/harness/reports/M6/20261018_pluginval_vst3.log +++ b/harness/reports/M6/20261018_pluginval_vst3.log @@ -1,5 +1,5 @@ Started validating: /Users/kimmo/Library/Audio/Plug-Ins/VST3/Amp2203.vst3 -Random seed: 0x39def85 +Random seed: 0x1ec231b Validation started Strictness level: 5 ----------------------------------------------------------------- diff --git a/harness/reports/M6/20261018_x2_rates_d062_full2x.md b/harness/reports/M6/20261018_x2_rates_d062_full2x.md new file mode 100644 index 0000000..f226790 --- /dev/null +++ b/harness/reports/M6/20261018_x2_rates_d062_full2x.md @@ -0,0 +1,48 @@ +# M6 A1: full engine (exact J4) at lower internal rates, plugin model check + +- Date 2026-10-18; options: tol 0.0001; rates 48 kHz × [2]. +- Plugin model check (D-051): ESR ≤ -20 dB vs SPICE (cached 384000 Hz references, 48 kHz band, first 5 s of every DI track, first 0.1 s excluded). Unseen settings: the 16 X4 validation settings, 10 s, vs the engine at 16x (first 1 s excluded). Cost: ampwav --stats on 10 s of DI GTR L, one run at a time; oversampling filters not included. + +## Summary + +| Rate | vs SPICE worst (CRUNCH / DRIVE / HOT) | Check | Unseen settings vs 16x (worst / median) | Newton failures (not rescued) / runs, max iterations | Cost default / HOT (% of one core) | +|---|---|---|---|---|---| +| 2x (96 kHz) | -45.3 / -48.5 / -24.0 dB | PASS | -20.8 / -39.0 dB | 102 (3) / 28, 32 | 27.1 / 42.2 | + +## vs SPICE per clip + +| Clip | 2x | +|---|---| +| CRUNCH GTR L | -45.8 dB | +| CRUNCH GTR LL | -45.3 dB | +| CRUNCH GTR R | -46.1 dB | +| CRUNCH GTR RR | -45.7 dB | +| DRIVE GTR L | -48.5 dB | +| DRIVE GTR LL | -49.7 dB | +| DRIVE GTR R | -49.5 dB | +| DRIVE GTR RR | -48.9 dB | +| HOT GTR L | -24.3 dB | +| HOT GTR LL | -25.2 dB | +| HOT GTR R | -25.2 dB | +| HOT GTR RR | -24.0 dB | + +## Aliasing (power outside the harmonics of f0, relative to the total; 16x for reference) + +Each cell: non-harmonic power, then Newton failures (not rescued) in that 2 s run. Non-converged samples add non-harmonic power, so a cell with many failures measures solver error as well as aliasing. + +| Preset | f0 | amplitude (FS) | 16x | 2x | +|---|---|---|---|---| +| CRUNCH | 5000 Hz | 0.1 | -25.3 dB, 0 (0) | -20.5 dB, 0 (0) | +| CRUNCH | 5000 Hz | 0.4 | -24.4 dB, 0 (0) | -17.4 dB, 4705 (3589) | +| CRUNCH | 9000 Hz | 0.1 | -40.9 dB, 0 (0) | -18.2 dB, 0 (0) | +| CRUNCH | 9000 Hz | 0.4 | -40.0 dB, 0 (0) | -14.9 dB, 5374 (147) | +| HOT | 5000 Hz | 0.1 | -25.1 dB, 0 (0) | -16.5 dB, 369 (0) | +| HOT | 5000 Hz | 0.4 | -25.0 dB, 0 (0) | -12.1 dB, 10446 (8982) | +| HOT | 9000 Hz | 0.1 | -38.8 dB, 20 (0) | -16.4 dB, 915 (0) | +| HOT | 9000 Hz | 0.4 | -33.3 dB, 42 (0) | -15.0 dB, 4243 (18) | + +## Cost + +| Rate | ns per engine sample (default / HOT) | % of one core at 48 kHz | +|---|---|---| +| 2x | 2820 / 4400 | 27.1 / 42.2 | diff --git a/harness/testbench_gen.py b/harness/testbench_gen.py index 1611397..2fc84bc 100644 --- a/harness/testbench_gen.py +++ b/harness/testbench_gen.py @@ -28,7 +28,7 @@ # Partition of the reference netlist (SPEC §4.2). Every element belongs to exactly one block. PARTITION = { - 'B12': 'Vin R2 R3 X1a R1 C1 R4 C3 R5 C4 C5 RVR1a RVR1b X1b R6 R7', # V1a + V1b, joint root (D-017) + 'B12': 'Vin R2 R3 X1a R1 C1 C2 R4 C3 R5 C4 C5 RVR1a RVR1b X1b R6 R7', # V1a + V1b, joint root (D-017); C2 D-062 'B3': 'C7 R10 C8 R11 X2a R9 R12 X2b R13', 'B4': 'C10 R15 C11 C12 RVR3a RVR3b RVR5 RVR4a RVR4b RVR2a RVR2b', 'B5': 'C9 R17 R16 R19 C15 R20 R23 C17 RVR6 R22 X3a X3b R18 R21', diff --git a/harness/testbenches/b12.cir b/harness/testbenches/b12.cir index fb30271..9bb46fe 100644 --- a/harness/testbenches/b12.cir +++ b/harness/testbenches/b12.cir @@ -1,5 +1,5 @@ * harness testbench "b12" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B12 StageV1aV1b (V1a and V1b, joint root). Input: guitar source at node in. * Output: p1b (open). Supply bpA: constant from F op. .include tubes.lib @@ -16,6 +16,7 @@ R3 in g1a 68k X1a p1a g1a k1a 12AX7 R1 k1a 0 2.7k C1 k1a 0 0.68u +C2 p1a k1a 100p R4 bpA p1a 100k C3 p1a nA 0.022u R5 nA vtop 470k diff --git a/harness/testbenches/b123.cir b/harness/testbenches/b123.cir index a8d8721..19d8b82 100644 --- a/harness/testbenches/b123.cir +++ b/harness/testbenches/b123.cir @@ -1,5 +1,5 @@ * harness testbench "b123" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * Junction reference for J2: B12 and B3 joined directly (no J-Thevenin source), for the SPICE * partition-error study of J2 (harness/partition.py). Input: guitar source at node in. * Output: k2b (open). Supplies bpA, bpX: constant from F op. @@ -17,6 +17,7 @@ R3 in g1a 68k X1a p1a g1a k1a 12AX7 R1 k1a 0 2.7k C1 k1a 0 0.68u +C2 p1a k1a 100p R4 bpA p1a 100k C3 p1a nA 0.022u R5 nA vtop 470k diff --git a/harness/testbenches/b1234.cir b/harness/testbenches/b1234.cir index 34f2361..ff9d135 100644 --- a/harness/testbenches/b1234.cir +++ b/harness/testbenches/b1234.cir @@ -1,5 +1,5 @@ * harness testbench "b1234" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B1234 Preamp: B12, B3 and B4 in one tree with an 8-port root (no J2 / J3; DECISIONS D-038). * Input: guitar source at node in. Output: y (open, master wiper). Supplies bpA, bpX: constant * from F op (the cascade study drives them with F's recorded waveforms). @@ -17,6 +17,7 @@ R3 in g1a 68k X1a p1a g1a k1a 12AX7 R1 k1a 0 2.7k C1 k1a 0 0.68u +C2 p1a k1a 100p R4 bpA p1a 100k C3 p1a nA 0.022u R5 nA vtop 470k diff --git a/harness/testbenches/b3.cir b/harness/testbenches/b3.cir index 1041315..14635e3 100644 --- a/harness/testbenches/b3.cir +++ b/harness/testbenches/b3.cir @@ -1,5 +1,5 @@ * harness testbench "b3" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B3 StageV2aV2b. Input: J2 Thevenin source (v_oc(p1b), R_th2) into node p1b. * Output: k2b (open). Supply bpX: constant from F op. .include tubes.lib diff --git a/harness/testbenches/b34.cir b/harness/testbenches/b34.cir index 09bb7f3..306ce45 100644 --- a/harness/testbenches/b34.cir +++ b/harness/testbenches/b34.cir @@ -1,5 +1,5 @@ * harness testbench "b34" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B34 StageV2aV2bToneStack: B3 and B4 joined in one tree (no J3; DECISIONS D-033). * Input: J2 Thevenin source (v_oc(p1b), R_th2) into node p1b. Output: y (open, master wiper). * Supply bpX: constant from F op. diff --git a/harness/testbenches/b4.cir b/harness/testbenches/b4.cir index c381998..c5c988b 100644 --- a/harness/testbenches/b4.cir +++ b/harness/testbenches/b4.cir @@ -1,5 +1,5 @@ * harness testbench "b4" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B4 ToneStackMaster. Input: J3 Thevenin source (v_oc(k2b), R_th3) into node k2b. * Output: y (open, master wiper). .include tubes.lib diff --git a/harness/testbenches/b56.cir b/harness/testbenches/b56.cir index a30b8bb..7f48cf1 100644 --- a/harness/testbenches/b56.cir +++ b/harness/testbenches/b56.cir @@ -1,5 +1,5 @@ * harness testbench "b56" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B56+B7: phase inverter, power stage and supply with instantaneous NFB (VERIFICATION §1). * Input: J4 Thevenin source (v_oc(y), R_th4) into node y; R_th4 = DC formula (WDF_DESIGN §6). * Preamp loads on bpA / bpX: constant current sinks from F op (recorded waveforms in M4). diff --git a/harness/testbenches/b56j5.cir b/harness/testbenches/b56j5.cir index 4fade9a..c37cd5e 100644 --- a/harness/testbenches/b56j5.cir +++ b/harness/testbenches/b56j5.cir @@ -1,5 +1,5 @@ * harness testbench "b56j5" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * J5 partition reference: B56+B7 as b56 (closed loop, instantaneous NFB), but C14 / C16 are fed * by J5 Thevenin sources (VCVS copies of the unloaded PI plates p3a / p3b behind R_thA / R_thB) * instead of the plates themselves (harness/partition_j5.py). diff --git a/harness/testbenches/b5open.cir b/harness/testbenches/b5open.cir index c8791ee..48b6eb4 100644 --- a/harness/testbenches/b5open.cir +++ b/harness/testbenches/b5open.cir @@ -1,5 +1,5 @@ * harness testbench "b5open" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B5-open: phase inverter with R22 driven by the recorded speaker voltage (ideal source). * Input: J4 Thevenin source into node y. Outputs: p3a, p3b (open). * Recorded sources (from a B56 run): out, bpX. DC values from F op. diff --git a/harness/testbenches/b6.cir b/harness/testbenches/b6.cir index 9aaefbe..9559eb0 100644 --- a/harness/testbenches/b6.cir +++ b/harness/testbenches/b6.cir @@ -1,5 +1,5 @@ * harness testbench "b6" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * B6 PowerStage driven by the recorded PI open-circuit outputs through R_thA / R_thB. * No Vin: both inputs are recorded sources (from a B56 / B5-open run). Output: out. * Recorded supply rails (from a B56 run): ct, nScr. DC values from F op. diff --git a/harness/testbenches/full.cir b/harness/testbenches/full.cir index 9b3ceb9..57cc396 100644 --- a/harness/testbenches/full.cir +++ b/harness/testbenches/full.cir @@ -1,5 +1,5 @@ * harness testbench "full" -- GENERATED by harness/testbench_gen.py, do not edit -* source: reference/spice/jcm800_2203.cir (sha256 83f01b6fd8b64a06) +* source: reference/spice/jcm800_2203.cir (sha256 ffd9b2812204248f) * Reference F: identical to the reference netlist. * Input: Vin in 0 (replaced by a filesource for transient runs). * Reference model. Knob params are rotations 0..1. See ASSUMPTIONS in README. @@ -18,6 +18,7 @@ R3 in g1a 68k X1a p1a g1a k1a 12AX7 R1 k1a 0 2.7k C1 k1a 0 0.68u +C2 p1a k1a 100p R4 bpA p1a 100k C3 p1a nA 0.022u diff --git a/reference/spice/jcm800_2203.cir b/reference/spice/jcm800_2203.cir index b743393..813f89e 100644 --- a/reference/spice/jcm800_2203.cir +++ b/reference/spice/jcm800_2203.cir @@ -15,6 +15,7 @@ R3 in g1a 68k X1a p1a g1a k1a 12AX7 R1 k1a 0 2.7k C1 k1a 0 0.68u +C2 p1a k1a 100p R4 bpA p1a 100k C3 p1a nA 0.022u diff --git a/tests/test_phase_inverter.cpp b/tests/test_phase_inverter.cpp index 534146e..2952f23 100644 --- a/tests/test_phase_inverter.cpp +++ b/tests/test_phase_inverter.cpp @@ -41,10 +41,10 @@ TEST_CASE("PhaseInverter starts at the DC operating point", "[stage5][m4]") { setup(s); // full-netlist op (ngspice 47), DC tolerance 0.5 % (VERIFICATION §7); the engine is ≈ 1 mV off at // the tail because tubes.lib's 1 GΩ plate–cathode resistors are omitted (WDF_DESIGN §3.1) - const std::pair ref[] = {{"g3a", 43.52260078966601}, {"nf", 43.521599385375474}, - {"k3", 44.93336791716606}, {"g3b", 43.522600789666015}, - {"ng", 13.483951021319733}, {"p3a", 270.8809249953309}, - {"p3b", 262.2705821268219}}; + const std::pair ref[] = {{"g3a", 43.8294735664613}, {"nf", 43.82847215398154}, + {"k3", 45.25019513654581}, {"g3b", 43.82947356646135}, + {"ng", 13.57902696479027}, {"p3a", 272.6112625373205}, + {"p3b", 263.9511986968434}}; for (const auto& [n, v] : ref) { INFO(n << ": " << probe(s, n) << " (SPICE " << v << ")"); REQUIRE(std::fabs(probe(s, n) / v - 1.0) < 5e-3); diff --git a/tests/test_preamp.cpp b/tests/test_preamp.cpp index 6f8ca27..3230463 100644 --- a/tests/test_preamp.cpp +++ b/tests/test_preamp.cpp @@ -31,8 +31,8 @@ TEST_CASE("Preamp starts at the DC operating point", "[preamp][m3]") { s.prepare(kFs, 20.0); s.reset(0.0); // CIRCUIT.md §5 (F operating point); the harness checks every node against the testbench op - for (const auto& [node, v] : {std::pair{"p1a", 296.402}, {"k1a", 2.510}, {"p1b", 352.433}, {"p2a", 231.130}, - {"k2a", 1.404}, {"k2b", 231.686}}) { + for (const auto& [node, v] : {std::pair{"p1a", 298.325995}, {"k1a", 2.527076}, {"p1b", 354.750235}, {"p2a", 232.577102}, + {"k2a", 1.413853}, {"k2b", 233.140404}}) { INFO(node); REQUIRE(std::fabs(probe(s, node) / v - 1.0) < 5e-3); } @@ -102,7 +102,7 @@ TEST_CASE("Preamp follows its supply inputs and stays finite far beyond the sign s.setSupplyVoltages(380.0, 395.0); s.reset(0.0); REQUIRE(probe(s, "bpa") == 380.0); - REQUIRE(probe(s, "p1b") < 352.433); // lower supply, lower plate voltage + REQUIRE(probe(s, "p1b") < 354.750235); // lower supply, lower plate voltage for (long k = 0; k < static_cast(0.05 * kFs); ++k) REQUIRE(std::isfinite(s.process(sine(k, 220.0, 20.0)))); // 10× the overdrive level REQUIRE(s.sanitizeEvents() == 0); diff --git a/tests/test_stage12.cpp b/tests/test_stage12.cpp index 23e8564..8272480 100644 --- a/tests/test_stage12.cpp +++ b/tests/test_stage12.cpp @@ -29,9 +29,9 @@ TEST_CASE("StageV1aV1b starts at the DC operating point", "[stage12][m2]") { s.prepare(kFs, 20.0); s.reset(0.0); // CIRCUIT.md §5 (F operating point); the harness checks every node against the testbench op - REQUIRE(std::fabs(probe(s, "p1a") / 296.402 - 1.0) < 5e-3); - REQUIRE(std::fabs(probe(s, "k1a") / 2.510 - 1.0) < 5e-3); - REQUIRE(std::fabs(probe(s, "p1b") / 352.433 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "p1a") / 298.325995 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "k1a") / 2.527076 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "p1b") / 354.750235 - 1.0) < 5e-3); const double p1b = probe(s, "p1b"); for (int n = 0; n < 4096; ++n) { @@ -40,8 +40,8 @@ TEST_CASE("StageV1aV1b starts at the DC operating point", "[stage12][m2]") { } REQUIRE(s.newtonStats().failures == 0); REQUIRE(s.newtonStats().maxIterations == 0); // the warm start is the solution - REQUIRE(std::fabs(s.supplyCurrent() - ((389.349603 - probe(s, "p1a")) / 100e3 + - (389.349603 - p1b) / 100e3)) < 1e-15); + REQUIRE(std::fabs(s.supplyCurrent() - ((391.921506 - probe(s, "p1a")) / 100e3 + + (391.921506 - p1b) / 100e3)) < 1e-15); } TEST_CASE("StageV1aV1b Preamp Volume jump stays finite and rate-limits matrix updates", "[stage12][m2]") { diff --git a/tests/test_stage3.cpp b/tests/test_stage3.cpp index 38420eb..7d258e5 100644 --- a/tests/test_stage3.cpp +++ b/tests/test_stage3.cpp @@ -30,9 +30,9 @@ TEST_CASE("StageV2aV2b starts at the DC operating point", "[stage3][m3]") { s.prepare(kFs); s.reset(kVp1b); // CIRCUIT.md §5 (F operating point); the harness checks every node against the testbench op - REQUIRE(std::fabs(probe(s, "p2a") / 231.130 - 1.0) < 5e-3); - REQUIRE(std::fabs(probe(s, "k2a") / 1.404 - 1.0) < 5e-3); - REQUIRE(std::fabs(probe(s, "k2b") / 231.686 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "p2a") / 232.577102 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "k2a") / 1.413853 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "k2b") / 233.140404 - 1.0) < 5e-3); const double k2b = probe(s, "k2b"); for (int n = 0; n < 4096; ++n) @@ -43,7 +43,7 @@ TEST_CASE("StageV2aV2b starts at the DC operating point", "[stage3][m3]") { TEST_CASE("StageV2aV2b DC satisfies KCL with the supply on V2b's plate", "[stage3][m3]") { // checks the exact supply offsets: V2b's plate port ends on bpX, which is not a network node - for (double vbpX : {402.335999, 350.0, 450.0}) { + for (double vbpX : {404.998185, 350.0, 450.0}) { StageV2aV2b s; s.prepare(kFs); s.setSupplyVoltage(vbpX); diff --git a/tests/test_stage34.cpp b/tests/test_stage34.cpp index 9ca45b1..8d0719c 100644 --- a/tests/test_stage34.cpp +++ b/tests/test_stage34.cpp @@ -31,9 +31,9 @@ TEST_CASE("StageV2aV2bToneStack starts at the DC operating point", "[stage34][m3 StageV2aV2bToneStack s; s.prepare(kFs, 20.0); s.reset(kVp1b); - REQUIRE(std::fabs(probe(s, "p2a") / 231.130 - 1.0) < 5e-3); // CIRCUIT.md §5 - REQUIRE(std::fabs(probe(s, "k2b") / 231.686 - 1.0) < 5e-3); - REQUIRE(std::fabs(probe(s, "nd") / 231.686 - 1.0) < 5e-3); // R15 carries no DC current + REQUIRE(std::fabs(probe(s, "p2a") / 232.577102 - 1.0) < 5e-3); // CIRCUIT.md §5 + REQUIRE(std::fabs(probe(s, "k2b") / 233.140404 - 1.0) < 5e-3); + REQUIRE(std::fabs(probe(s, "nd") / 233.140404 - 1.0) < 5e-3); // R15 carries no DC current REQUIRE(std::fabs(probe(s, "y")) < 1e-9); // the tone stack is AC-coupled for (int n = 0; n < 4096; ++n) REQUIRE(std::fabs(s.process(kVp1b)) < 1e-9); // silence in, silence out (SPEC §3.6)