Dynamics Dashboard

Compressor / limiter dynamics — WDF engine vs ngspice golden references, measured by the trusted dynamics tools.

5 Circuits
5 Static curves
5 ngspice overlays
96000×4 Sample rate

Run 2026-06-16T06:41:11Z · commit — · 96000 Hz ×4 oversampling

This page shows how the PedalKernel WDF engine reproduces the dynamic behavior of compressors and limiters — static gain curves, gain reduction, and attack/release ballistics — against its ngspice golden references. Every panel is generated from committed golden .npy files by tools/dashboard/generate_dynamics.py , driven by the dynamics subcommand of pedalkernel-validate, which measures both the WDF and ngspice goldens with the same trusted dynamics primitives that gate the test suite (pedalkernel::analysis : compression_ratio, gain_reduction_db, measure_attack_seconds, measure_release_seconds).

This is a mid-campaign snapshot, not a victory lap. The dynamics path is one of the engine’s known weak spots, and these graphs are built to show exactly where and by how much it diverges from SPICE.

What dynamics validation is. A compressor or limiter is defined by how its gain changes with level and time. We feed two deterministic stimuli through both the WDF engine and the ngspice reference:

  • Level sweep — a 1 kHz tone stepped through a series of input levels. The steady-state RMS at each level gives a static gain curve (input dBVU vs output dBVU); its slope is the compression ratio, and the change in applied gain across the sweep is the total gain reduction.
  • Tone burst (temporal attack/release — tracked follow-up, not yet shown) — a single on/off burst would trace the gain-reduction-vs-time transient. The single-burst envelope-settle measurement isn’t yet robust across these diverse circuits (slow-attack opto cells truncate the window; non-compressing paths pick up onset-transient artifacts), so the ballistics panel is deferred until the measurement is hardened. Only the static curves below are graphed today.

For all of these, closer to ngspice is better: where the orange WDF trace tracks the cyan ngspice trace, the engine reproduces the circuit’s dynamics; where they diverge, the gap is real.

Five compressors, one ngspice golden so far. This page now graphs five compressors — the LA-2A (opto + tube, compressor/la2a), the opto-leveler (compressor/opto_leveler), the VCA bus comp (SSL-style, compressor/vca_bus_comp), the FET Leveler (1176-style, compressor/fet_leveler), and the OTA Dyna Comp (MXR/CA3080, compressor/dyna_comp). Only the FET Leveler has a committed ngspice golden today, so it is the one card with an orange-vs-cyan overlay. The other four are WDF-only: there is no ngspice reference yet, so they are measured live through the engine (a 1 kHz level sweep with a generous multi-second settle) and plotted as a single orange WDF trace against the dashed unity line.

ngspice overlays for the four WDF-only circuits need goldens generated from the existing .spice decks (note opto_leveler.spice is missing and would need authoring first). Until then their absolute numbers are WDF self-measurements, not validated against SPICE.

Known gaps, shown honestly. The FET Leveler WDF path produces ~0 dB GR because its feedback compressor path is broken (the envelope-detector → gain-element wiring does not close the loop — audit gap G5 family), so its WDF transfer is flat and linear while the ngspice golden is clearly level-dependent — a measured gap, not a hidden pass. Among the live circuits the LA-2A, opto-leveler, and VCA bus comp show real, monotonic gain reduction (the LA-2A and opto level off hard as input rises; the VCA bends gently below unity), while the Dyna Comp currently reads flat (~0 dB GR, ratio 1:1) — its CA3080 OTA sidechain is not yet modulating the audio gain, a known engine gap rendered as-measured. The page auto-includes any future circuit that gains a level_sweep or tone_burst golden, and any live circuit that gains an ngspice golden will pick up its cyan overlay automatically.

⚠ Preliminary reference. Both sides of these graphs are early. The validation config targets ngspice ~4.2 dB GR (attack 5–10 ms, release 1–2 s), but the committed fet_leveler ngspice golden does not yet match that — it reads as a heavy, non-ideal attenuator (output near the noise floor at low input, large level-step transients, and an anomalous point near −5 dBVU). So treat the absolute numbers — ratio, total GR, attack/release ms — as provisional, and read the panels qualitatively: WDF applies constant gain (no dynamics) while the reference is level-dependent. Hardening the fet_leveler golden (or adding a cleaner compressor reference) is tracked follow-up work.

compressor/dyna_comp

Circuit compressor/dyna_comp.pedal · 1000 Hz probe tone

⚠ Preliminary reference — the committed ngspice golden is rough, so the absolute numbers below are provisional. Read the panels qualitatively (see the note above).

MetricWDFngspiceΔ
Compression ratio1.00:12.80:1-1.80
Total gain reduction (dB)-0.0033.00-33.00
compressor/dyna_comp: static gain curve and gain reduction, WDF vs ngspice
Static gain: input vs output (left) and gain reduction vs input (right). WDF orange, ngspice cyan; dashed grey is unity. Click to open full resolution.

compressor/fet_leveler

Circuit compressor/fet_leveler.pedal · 1000 Hz probe tone

⚠ Preliminary reference — the committed ngspice golden is rough, so the absolute numbers below are provisional. Read the panels qualitatively (see the note above).

MetricWDFngspiceΔ
Compression ratio1.00:10.62:10.38
Total gain reduction (dB)0.02-11.5911.61
compressor/fet_leveler: static gain curve and gain reduction, WDF vs ngspice
Static gain: input vs output (left) and gain reduction vs input (right). WDF orange, ngspice cyan; dashed grey is unity. Click to open full resolution.

compressor/la2a

Circuit compressor/la2a.pedal · 1000 Hz probe tone

⚠ Preliminary reference — the committed ngspice golden is rough, so the absolute numbers below are provisional. Read the panels qualitatively (see the note above).

MetricWDFngspiceΔ
Compression ratio-2.38:12.00:1-4.38
Total gain reduction (dB)57.8719.4638.42
compressor/la2a: static gain curve and gain reduction, WDF vs ngspice
Static gain: input vs output (left) and gain reduction vs input (right). WDF orange, ngspice cyan; dashed grey is unity. Click to open full resolution.

compressor/opto_leveler

Circuit compressor/opto_leveler.pedal · 1000 Hz probe tone

⚠ Preliminary reference — the committed ngspice golden is rough, so the absolute numbers below are provisional. Read the panels qualitatively (see the note above).

MetricWDFngspiceΔ
Compression ratio0.65:11.94:1-1.29
Total gain reduction (dB)-12.9618.86-31.81
compressor/opto_leveler: static gain curve and gain reduction, WDF vs ngspice
Static gain: input vs output (left) and gain reduction vs input (right). WDF orange, ngspice cyan; dashed grey is unity. Click to open full resolution.

compressor/vca_bus_comp

Circuit compressor/vca_bus_comp.pedal · 1000 Hz probe tone

⚠ Preliminary reference — the committed ngspice golden is rough, so the absolute numbers below are provisional. Read the panels qualitatively (see the note above).

MetricWDFngspiceΔ
Compression ratio1.16:1-1.34:12.50
Total gain reduction (dB)6.6882.86-76.18
compressor/vca_bus_comp: static gain curve and gain reduction, WDF vs ngspice
Static gain: input vs output (left) and gain reduction vs input (right). WDF orange, ngspice cyan; dashed grey is unity. Click to open full resolution.