Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
4164d14
m6: plugin reinstalled; pluginval (VST3, AU) and auval pass
CatastrophicCoder Oct 15, 2026
0d0ad9c
m6: review of O3 / A5 vs the drawing and datasheets; C2 100 pF missin…
CatastrophicCoder Oct 15, 2026
3ef594d
m6: EL34 study (one-point datasheet fit vs Koren; output impedance ≈ …
CatastrophicCoder Oct 15, 2026
94107d7
m6: EL34 Koren parameters fitted to digitised datasheet curves; SPICE…
CatastrophicCoder Oct 15, 2026
5b9b4ab
m6: EL34 parameters fitted to the data sheet in the reference and the…
CatastrophicCoder Oct 15, 2026
476d21f
m6: junction report plot (after D-058)
CatastrophicCoder Oct 15, 2026
03c141f
m6: re-verification after D-058 (M4 acceptance, HOT, b56 / b5open / b…
CatastrophicCoder Oct 15, 2026
99759d1
m6: plugin with the fitted EL34 reinstalled; pluginval (VST3, AU) and…
CatastrophicCoder Oct 15, 2026
c55912d
m6: speaker-load study (4x12-style impedance vs 16 ohm resistor, SPICE)
CatastrophicCoder Oct 15, 2026
3cb4124
m6: speaker load (representative 4x12 impedance) in the reference and…
CatastrophicCoder Oct 15, 2026
507f856
m6: verification after D-059 (speaker load): acceptance PASS, HOT New…
CatastrophicCoder Oct 16, 2026
4a143f6
m6: plugin with the speaker load (D-059) installed for listening; plu…
CatastrophicCoder Oct 16, 2026
eeea956
m6: owner comparison against a NAM capture of a real 2203
CatastrophicCoder Oct 17, 2026
7a0df21
m6: plugin Power Amp Rate default Full (D-060); null test, automation…
CatastrophicCoder Oct 17, 2026
7f06f83
m6: plugin with Power Amp Rate Full installed; pluginval and auval pass
CatastrophicCoder Oct 17, 2026
f7fe99b
m6: owner listening: no audible difference between Full and Half at t…
CatastrophicCoder Oct 17, 2026
48b8b3c
m6: owner keeps Power Amp Rate Full as the default
CatastrophicCoder Oct 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 29 additions & 23 deletions docs/CIRCUIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ verification. In the engine B5 and B6 form one block B56 with no junction at the
| R35,R37 / R36,R38 | 1 kΩ 5 W each | screens – nScr | (pair equivalent 500 Ω) |
| V4–V7 | EL34 | cathodes to gnd | Fixed bias; V4‖V5 plate pA, V6‖V7 plate pB |
| OT | see §3 | pA – ct – pB, secondary out – gnd | |
| Rload | 16 Ω | out – gnd | |
| Rspk_e / Lspk_e ‖ Rspk_le | 13 Ω / 1.0 mH ‖ 45 Ω | out – spk1 – spk2 | Speaker load (D-059): voice coil R, inductance with eddy loss |
| Rspk_m ‖ Lspk_m ‖ Cspk_m | 37 Ω ‖ 29.4437 mH ‖ 86.0297 µF | spk2 – gnd | Motional resonance 100 Hz, Q 2; \|Z\| 20 / 50 / 14 / 15 / 35 / 48 Ω at 50 / 100 / 400 / 1k / 5k / 10k Hz |

Bias Thevenin check: Vth = −60 V · 51 kΩ / 66 kΩ = −46.364 V; Rth = 15 kΩ ‖ 51 kΩ = 11.59 kΩ.

Expand Down Expand Up @@ -206,32 +207,36 @@ three candidates differ by < 0.4 % and give the same result within 0.1 dB. Worst

## 5. Reference DC operating point (default parameters, from SPICE)

Defaults: vol 0.6, treble/middle/bass/presence 0.5, master 0.3, rv1 4 kΩ, vnl 505 V, rsrc 100 Ω.
Defaults: vol 0.6, treble/middle/bass/presence 0.5, master 0.3, rv1 4 kΩ, vnl 505 V, rsrc 100 Ω. EL34 parameters
fitted to the Ei-RC data sheet curves (D-058; with Koren's set the EL34s idled at 34.08 mA plate / 4.57 mA screen).

| Node | Voltage | Node | Voltage |
|---|---|---|---|
| ct (B+, OT CT) | 488.708 V | p2a | 231.130 V |
| nScr | 485.649 V | k2a | 1.404 V |
| bpX | 402.336 V | k2b | 231.686 V |
| bpA | 389.350 V | p3a | 270.881 V |
| nbias | −46.364 V | p3b | 262.271 V |
| p1a | 296.402 V | k3 | 44.933 V |
| k1a | 2.510 V | nF | 43.522 V |
| p1b | 352.433 V | nG | 13.484 V |
| k1b | 3.692 V | pA / pB (EL34 plates) | 487.662 / 487.580 V |
| ct (B+, OT CT) | 491.347 V | p2a | 232.577 V |
| nScr | 488.880 V | k2a | 1.414 V |
| bpX | 404.998 V | k2b | 233.140 V |
| bpA | 391.921 V | p3a | 272.611 V |
| nbias | −46.364 V | p3b | 263.951 V |
| p1a | 298.326 V | k3 | 45.250 V |
| k1a | 2.527 V | nF | 43.828 V |
| p1b | 354.750 V | nG | 13.579 V |
| k1b | 3.717 V | pA / pB (EL34 plates) | 490.463 / 490.394 V |

| Current | Value |
|---|---|
| V1a plate (R4) | 0.930 mA |
| V1b plate (R7) | 0.369 mA |
| V2a plate (R12) | 1.712 mA |
| V2b cathode (R13) | 2.317 mA |
| PI plates (R18 / R21) | 1.603 / 1.401 mA |
| R29 (preamp + PI total from nScr) | 8.331 mA |
| Choke (Lch) | 26.60 mA |
| EL34 plate, per tube | 34.08 mA |
| EL34 screen, per tube | 4.57 mA |
| Total HT current (Vht) | 162.9 mA |
| V1a plate (R4) | 0.936 mA |
| V1b plate (R7) | 0.372 mA |
| V2a plate (R12) | 1.724 mA |
| V2b cathode (R13) | 2.331 mA |
| PI plates (R18 / R21) | 1.614 / 1.410 mA |
| R29 (preamp + PI total from nScr) | 8.388 mA |
| Choke (Lch) | 21.45 mA |
| EL34 plate, per tube | 28.77 mA |
| EL34 screen, per tube | 3.26 mA |
| Total HT current (Vht) | 136.5 mA |

The speaker load (D-059) leaves these values unchanged to the digits shown (the speaker node carries 42.4 µV of NFB DC,
was 42.6 µV with the 16 Ω resistor).

Regenerate with `python3 reference/spice/spice_tools.py` after any netlist change.

Expand All @@ -245,13 +250,14 @@ Regenerate with `python3 reference/spice/spice_tools.py` after any netlist chang
| O2 | Middle pot wiring | As drawn: C12 to wiper, Bass bottom to top lug | ≤ 1.4 dB, only at low Middle settings |
| O3 | C5 1 nF | VR1 top to wiper | Brightness vs Preamp Volume setting |
| O4 | "50+50 µF" filter cans | 50 µF per node | Sag and ripple time constants |
| O5 | NFB tap | 16 Ω output with 16 Ω load | Feedback amount if taken from another tap |
| 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) |
| 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 |
| A4 | Bias −60 V at C20, RV1 4 kΩ | Assumed | Idle current, crossover |
| A5 | Koren generic tube parameters | Generic | Overall voltages and distortion |
| A5 | Tube parameters | 12AX7: Koren generic; EL34: fitted to the Ei-RC data sheet curves (D-058) | Overall voltages and distortion |

Any change to these must be made in the netlist first, re-verified, and logged in `DECISIONS.md`.
39 changes: 39 additions & 0 deletions docs/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -989,3 +989,42 @@ Consequences: plugin CPU (2x Half, plugin_cpu): automation of any knob or all si
settings −18.9 dB; null test 26 / 26 at Half and Full (−138.5 dB); automation 0 failures. Knob jump vs SPICE (768 kHz)
still PASS with less margin: B1234 −39.2 … −55.1 dB (was −50.0 … −59.4), B56 Presence −63.2 dB (was −77.0); which of
the two changes accounts for it is not separated.

## D-058 EL34 model parameters fitted to the Ei-RC data sheet curves (reference model change)
Date: 2026-10-15 · Status: accepted (owner: "Adopt the fitted EL34 in the reference model"; changes `tubes.lib`, A5)
Context: owner listening ("dark", "lacks gain"); M6 EL34 study (`harness/reports/M6/20261015_el34_curve_fit.md`): Koren's
EL34 set deviated from the data sheet by a median 11.5 % on the plate curves and 28.2 % on the transfer curves.
Decision: `tubes.lib` EL34 mu 14.77, ex 1.046, kg1 194.3, kg2 2243, kp 53.82, kvb 40.43 (was 11 / 1.35 / 650 / 4200 / 60 /
24), fitted to 81 digitised curve points (median error 3.7 / 2.7 %) and the sheet's screen currents; the engine's
`devices::Pentode` / `kEL34Pair` take the same values. The bias network (A4) is unchanged.
Consequences: DC (CIRCUIT.md §5): EL34 idle 28.77 mA plate / 3.26 mA screen per tube (was 34.08 / 4.57), B+ 491.3 V (was
488.7), total HT 136.5 mA (162.9). tests/data EL34 sweeps, the block testbenches and the C++ DC fixtures regenerated; J3
re-measured (359.535 Ω). Every SPICE reference that contains the power amp is re-rendered (netlist hash); the
verification reports from before this entry describe the Koren EL34. Expected from the study: output impedance ≈ 20–23 Ω
(was 14–16), less power (clean 87 vs 101 W at 25 mV, clipped ≈ 156–163 vs 182–194 W).

## D-059 Speaker load: representative nominal 16 Ω 4x12 impedance instead of the 16 Ω resistor (reference model change)
Date: 2026-10-15 · Status: accepted (owner: "put the typical speaker load into the reference and engine")
Context: owner listening ("dark", needs Treble / Presence 7); speaker-load study (`harness/reports/M6/20261015_speaker_load_study.md`):
with the D-058 EL34 the closed-loop output impedance is ≈ 20–23 Ω, so a speaker's rising impedance raises the speaker
voltage +3 … +4.7 dB at 100 Hz and +1.8 … +4.7 dB at 5 kHz relative to a resistor. No published Thiele–Small data for the
Celestion G12T-75 was found.
Decision: `Rload out 0 16` → Rspk_e 13 Ω + (Lspk_e 1.0 mH ‖ Rspk_le 45 Ω) + (Rspk_m 37 Ω ‖ Lspk_m 29.4437 mH ‖ Cspk_m
86.0297 µF; 100 Hz, Q 2), the study's "typical" variant. Engine: B56 (`PowerAmp`) and B6 (`PowerStage`) get nodes spk1 / spk2
and six elements; the inductors are one-winding `CoupledInductors` (shorts at DC, trapezoidal, half-step rescaling in B56),
the capacitor a `DcCapacitor`. The plugin output stays the speaker voltage / 60 V. Power metrics keep V²/16 Ω as a nominal
figure. The parameters are representative, not measured.
Consequences: DC unchanged except v(out) 42.4 µV (was 42.6). Every SPICE reference that contains the power amp is
re-rendered; reports before this entry describe the 16 Ω resistor.

## D-060 Plugin default Power Amp Rate: Full (with the speaker load)
Date: 2026-10-17 · Status: accepted (owner: "switch the power amp to full rate at 2x"; revises D-054's Half default)
Context: with the speaker load (D-059) the plugin model check at half rate 2x fails at HOT (−18.8 dB vs SPICE; half-steps off
−19.2 dB), the full-rate power amp at 2x passes (−24.1 dB, unseen settings −20.8 dB vs 16x; engine 26.8 / 40.8 % default /
HOT). The owner's NAM comparison with a real 2203 (PROGRESS 2026-10-17) is at Master 10 / Presence 8, the HOT region.
Decision: Power Amp Rate default Full; Half stays selectable. Oversampling stays 2x; exact J4, Newton 1e-4 V and half-steps
as D-055 / D-056.
Consequences: no rate-change delay (latency = the oversampler's: 49 samples FIR at 2x, IIR less); CPU as measured in
`harness/reports/M6/20261017_plugin_cpu.md`: default knobs 26.4 % (Half 18.9 %), every knob 10 50.2 % (33.2 %), knob automation
32–35 % (≈ 24 %); at the owner's NAM-matched settings 47.3 % (Half 31.5 %). Null test 26 / 26; automation (96 kHz, Full, exact J4,
1e-4 V) 0 non-finite, 20 rescued first-solve failures. The null test and the CPU tool default to Full.
70 changes: 70 additions & 0 deletions docs/PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,76 @@ Notes:
automation, plugin CPU.
- Done (D-057): plugin CPU under automation 18.7 … 24.6 % (default base), 22.8 … 33.5 % (every knob 10); static
≈ 19 % / 32.5 %. Accuracy: acceptance and HOT unchanged; knob jump PASS (B1234 −39.2 … −55.1 dB, B56 −63.2 dB).
- 2026-10-15 (main after PR #1): plugin reinstalled to ~/Library/Audio/Plug-Ins (VST3, AU); pluginval strictness 5
SUCCESS for VST3 and AU, auval PASS (`harness/reports/M6/20261015_pluginval_*.log`, `…_auval.log`).
- Owner listening in Logic (2026-10-15): "very dark", "lacks gain", Master "just adds volume"; cab IR after the plugin;
compared with a real 2203. Review of O3 / A5 (owner request), SPICE studies on copies, reference unchanged:
- O3: C5 1 nF top-to-wiper matches the drawing. New O8: C2 100 pF V1a plate–cathode is on the drawing but missing
from the netlist; adding it darkens V1a → V1b by 0.3 dB at 5 kHz, 0.7 … 0.9 dB at 10 kHz.
- A5 12AX7: Koren's set vs RCA datasheet: 250 V / −2 V 0.95 mA (1.2), gm 1.67 (1.6) mA/V, rp 53.7 (62.5) kΩ; 100 V /
−1 V 0.10 mA (0.5), gm 0.59 (1.25), rp 141 (80) kΩ. Sarti et al. DAFx-07 set (mu 100.8, ex 1.4979, kg1 1890, kp 828,
kvb 72, Vct 0.612) matches both points (1.22 mA / 1.62 / 61.4; 0.50 mA / 1.22 / 82.0). Full amp with it: DC −1.6 …
−6.6 V, CRUNCH / DRIVE 220 Hz 0.3 V: output −0.3 dB, harmonics H2–H9 within 0.0 … 3.8 dB, spectral centroid +2 %.
- A5 EL34 (Koren set) vs Philips class A (250 / 250 V, −12.2 V): Ia 113 (100) mA, Ig2 19.3 (14.9) mA, gm 13.1 (11)
mA/V, ra 34 (15) kΩ; effect on the sound not studied.
Neither O3 nor the 12AX7 set explains "dark / lacks gain"; open candidates: resistive 16 Ω load (README known
limitation), EL34 model, input level.
- EL34 study (owner request; SPICE copies, reference unchanged): no published Koren EL34 fit found; JJ datasheet typical
point Ua 250 V, Ug2 265 V, Ia 100 mA, S 11 mA/V, Ri 15 kΩ, mu g2-g1 11. Current set there: gm 12.2 mA/V, ri 38.8 kΩ.
One-point fit (mu, ex, kg1, kg2 kept): kp 49.97, kvb 58.9 → gm 11.0, ri 15.0 kΩ; softer knee (Vg1 0 V, Va 50 V:
159 vs 254 mA), not validated against curves. Full amp, current / fit: clean power (CLEAN 25 mV) 101 / 82.5 W
(THD 3.2 / 1.9 %); clipped output at DRIVE Master 0.6–1.0 and HOT 182–194 / 132–137 W into 16 Ω; harmonics
H2–H9 mostly within 0–2 dB (H2 at Master 0.6: −38.6 / −53.2 dB); spectral centroid −1 … −7 % with the fit.
Closed-loop output impedance (16 Ω vs open load) 14.1 / 15.7 / 16.0 Ω at 100 Hz / 1 kHz / 5 kHz (fit: 14.6 / 16.2 /
16.5 Ω): about equal to the load, so a speaker's rising impedance would raise the real amp's output at resonance
and at high frequencies relative to the 16 Ω resistor (not yet simulated). Neither EL34 set explains "dark".
- EL34 curve fit (owner request; poppler installed for the data sheet; `harness/reports/M6/20261015_el34_curve_fit.md`):
Koren parameters fitted to 81 digitised Ei-RC curve points: mu 14.77, ex 1.046, kg1 194.3, kp 53.82,
kvb 40.4, kg2 2243; error vs the curves median 3.7 / 2.7 % (current set 11.5 / 28.2 %). Full amp: output impedance
20–23 Ω (was 14–16), clean 87 W (101), clipped 156–163 W (182–194), harmonics mostly within 1 dB, centroid −1 … −2 %.
Not a cause of "dark"; the higher output impedance makes the resistive-load difference larger.
- Owner 2026-10-15: adopt the fitted EL34 in the reference model (D-058). Plan: tubes.lib EL34 parameters (bias network A4
unchanged); engine `devices::Pentode` defaults; regenerate tests/data el34 sweeps (`harness.device_sweeps`), CIRCUIT.md §5,
README sanity figures; re-verify: b56 block-exact, M4 acceptance at 768 kHz and at 384 kHz exact J4 + HOT, X2 at half 2x
(plugin config), B56 knob jump; SPICE references re-rendered (netlist hash changes).
- D-058 done: re-verified against the new references: M4 full acceptance (768 kHz) 107 PASS (CRUNCH / DRIVE DI −61.1 …
−63.0 dB), 384 kHz exact J4 107 PASS, HOT 21 PASS (DI −42.2 … −43.3 dB); b56 106 PASS, b5open 88 PASS, b6 95 PASS / 2 FAIL
(the known 5 kHz 20 V discretisation FAILs, D-043; SWP-lo reference rendered at RELTOL 1e-7 after "timestep too small"
at 1e-8, noted in the report); half 2x plugin config vs SPICE HOT −23.1 dB, unseen −19.6 dB; B56 knob jump −64.0 dB;
null test 26 / 26; plugin CPU static 31.6 % (every knob 10), automation 22.2 … 24.4 %. SPICE sanity: NFB 5.1 / 4.7 /
4.6 dB (was 6.6 / 6.2 / 6.0), clean 87 / 112 / 126 W at 25 / 30 / 40 mV (was 101 / 133 / 151 W).
- Plugin with the fitted EL34 reinstalled (VST3, AU); pluginval strictness 5 SUCCESS for both, auval PASS.
- Owner listening after D-058: decent with Preamp 10, Interface Level +24 dBu, Bass 0, Treble 7, Middle 1, Presence 7,
Master 3; "bass / mid heavy"; Master above 3 adds nothing to the driven sound. Audient iD4 MkII, DI gain ¼ up (DI lineup
12 dBu = 0 dBFS, 40 dB DI gain range: the correct Interface Level is below +12 dBu, so +24 drives the model ≈ 20 dB
above the real guitar). Engine at Preamp 10: 0.8 / 4.4 / 21.4 % THD at y for 10 / 20 / 100 mV, plateau 26–28 %.
- Speaker-load study (`harness/reports/M6/20261015_speaker_load_study.md`): with three 4x12-style impedances instead of
16 Ω the speaker voltage gains +3 … +4.7 dB at 100 Hz and +1.8 … +4.7 dB at 5 kHz (+2.7 … +5.1 at 8 kHz), −0.3 … −0.9 dB
at 400 Hz – 1 kHz; driven tones at the owner's settings: centroid +11 … +21 %, 5–10 kHz energy +1.7 … +3.5 dB.
- Owner 2026-10-15: put the "typical" speaker load into the reference and the engine (D-059). Plan: netlist Rload →
Re 13 Ω + (Le 1.0 mH ‖ 45 Ω) + (Res 37 Ω ‖ Lm ‖ Cm at 100 Hz, Q 2); engine B56 (`PowerAmp`) and B6 (`PowerStage`): two
nodes, six elements (inductors as one-winding CoupledInductors, the capacitor a DcCapacitor; DC states, half-step
rescaling); testbench_gen / blocks / CLEAN power label; C++ DC fixtures, CIRCUIT.md §5, README; re-verify as after D-058.
- D-059 verification (new references): M4 full acceptance (768 kHz) 107 PASS (CRUNCH / DRIVE DI −60.3 … −62.1 dB); 384 kHz
exact J4 107 PASS; HOT 17 PASS / 4 FAIL: DI ESR −33.5 … −35.7 dB (was −42.2 … −43.3) and 37–56 first-solve Newton failures
per DI clip in the power amp, all rescued (newton_failures ≤ 0 FAIL); b5open 88 PASS; b56 and b6 not scored: their SPICE
references stop with "timestep too small" at RELTOL 1e-8 (long sweeps, t ≈ 1.5–1.8 s). Presence knob jump −62.9 dB;
null test 26 / 26; plugin CPU static 33.2 % (every knob 10), automation ≈ 23–24 %.
Plugin model check (half 2x, 1e-4 V): HOT −18.8 dB vs SPICE (FAIL ≤ −20; was −23.1), unseen −16.5 dB; half-steps off
−19.2 dB (FAIL); full-rate power amp at 2x −24.1 dB (PASS), unseen −20.8 dB, engine 26.8 / 40.8 % (default / HOT).
Power-amp Newton at HOT (DI L): failures 49 / 420 at 8x / 16x (43 unrescued at 16x); maxIter 64 or a looser tolerance
do not change them; half-steps off: 3 / 68; half-steps every sample: 64 / 466. Cause (half-step handling of the speaker
inductors vs a stiffer discretised load) not yet established.
- Owner comparison 2026-10-17 against a NAM capture of a real 2203 (Tone3000, settings published with the capture), plugin
build with D-058 + D-059 at its defaults (2x, Half, Interface Level +12 dBu, trim and output 0 dB): with the capture's
settings (Preamp 10, Treble 8, Middle 7, Bass 4, Master 10, Presence 8) "the tone is pretty accurate"; the output at Master
10 is ≈ 12 dB too loud for the IR loader. The earlier "missing gain" was at Master 3: the capture's sound includes the
power stage at full Master. These settings are in the HOT region (plugin model check there: −18.8 dB vs SPICE at half 2x).
- Owner: power amp at full rate by default (D-060). Plugin CPU: default 26.4 %, every knob 10 50.2 %, NAM-matched settings
47.3 %, knob automation 32–35 %; null test 26 / 26; automation 0 unrescued.
- Owner listening 2026-10-17 (NAM-matched settings, same IR): Power Amp Rate Full vs Half, "can't hear any real audible
difference". The earlier NAM comparison ("pretty accurate") was made at Half (the restored instance setting).
- Owner 2026-10-17: keep Full as the default (D-060 confirmed after the listening test); Half stays selectable per instance.

## Questions for the owner
_(Claude Code: add questions here and also ask them in the session.)_
Expand Down
Loading
Loading