Measured, not asserted

We measured it against a real Wurlitzer 200A

Plenty of Reeds is modeled (modal synthesis), not sampled. To keep the model honest, every per-note render is compared against a real Wurlitzer 200A — the Pifinger sample set — across partial tuning, decay, attack envelope, tremolo depth, and velocity timbre. The numbers below come straight out of the analysis scripts in spectral_analysis/; nothing here is rounded in the model’s favor.

The numbers

~4.5c
Partial tuning vs real 200A
median deviation, k1–k2, n=36 notes
src · spectral_analysis/spectral_match_summary.txt
5.77 dB
Tremolo depth
vs real 5.78 dB swing · ~5.5 Hz
src · spectral_analysis/measure_tremolo_depth.py
14.6 ms
Attack peak time
vs real 12.9 ms
src · spectral_analysis/measure_attack.py
+15 dB
Velocity bark (soft→hard)
vs real +18 dB upper-harmonic growth
src · spectral_analysis/measure_bark.py
64 voices
Polyphony
one per 200A reed
src · dsp/Engine.h

The plots

These are the actual measurement artifacts rendered by the analysis suite — real Pifinger 200A (reference) overlaid against Plenty of Reeds (PoR).

Per-partial frequency deviation in cents, real 200A vs Plenty of Reeds, across notes C2–C6
Per-partial tuning. Each point is one harmonic’s deviation from the ideal integer multiple, in cents (vertical), per note (horizontal). For partials k1–k2 the model tracks the real instrument to a ~4.5-cent median. The visible spread is the real 200A’s own inharmonicity — the model follows it rather than snapping to ideal harmonics. Source: spectral_analysis/spectral_match_summary.txt.
T60 decay time per note, real 200A reference vs Plenty of Reeds
T60 decay time (seconds to −60 dB) per note. Reference vs PoR. The model’s reeds decay slightly longer than the real instrument (e.g. A4 5.10 s modeled vs 3.38 s reference) — an honest, audible difference, not hidden. Source: spectral_analysis/compare_full_summary.txt.
Tremolo amplitude-swing scatter, real 200A vs Plenty of Reeds
Tremolo amplitude swing (dB) measured per sample. The modeled median lands at 5.77 dB against the real instrument’s 5.78dB (67 samples), at the 200A’s characteristic ~5.5 Hz. The model uses an asymmetric-triangle LFO — amplitude modulation only, no pitch vibrato. Source: spectral_analysis/measure_tremolo_depth.py.

Where the model falls short

No model is the instrument. Two gaps are known, measured, and deliberately left visible rather than papered over:

  • Bark dynamics: +15 dB vs +18 dB. The real 200A grows ~+18 dB of upper-harmonic energy from a soft hit to a hard one; the model reaches +15 dB. The shortfall is a modal ceiling — pushing the velocity→timbre law (kVelTilt = 0.38) harder to close the last 3 dB starts to cost mid-velocity centroid accuracy, so the trade is held where it is. Source: spectral_analysis/measure_bark.py, dsp/Reed.h.
  • Upper-partial cents drift in octave 6.The per-partial table shows the highest octave’s upper harmonics (k4–k6 around C6/D6) wandering tens of cents off in the reference itself — those partials sit near Nyquist and are noisy to estimate. The model stays close on k1–k3 there but cannot meaningfully chase the reference’s scattered top partials in octave 6. Source: spectral_analysis/spectral_match_summary.txt (Octave 6 rows).

If a number on this page ever drifts from the script output, the script is the source of truth — not the copy.