passive_eq.h
A Pultec-style passive program equaliser.
#include <sonore/passive_eq.h>- 1type
- Guides: Getting started, MIDI and MPE
On this page
Design notes
WHAT THIS IS, stated honestly: the CONTROL TOPOLOGY and curve family of the classic passive program EQ (EQP-1A pattern) -- independent boost and cut at one selected low frequency, a broad bell up top with a bandwidth control, a separate high shelf cut -- with the curves built from this SDK's matched biquads. It is NOT a component-level simulation of any specific unit: that would need the unit's schematic values through circuit.h. What it keeps is the behaviour that makes the topology worth having, each part documented in published measurements of the originals:
- BOOST AND CUT AT ONCE (the "Pultec trick"): the cut network's corner sits about two octaves above the boost's and is shallower when the boost loads it, so full boost + full cut leaves a net low shelf, a dip in the low mids just above it, and a flat top. Neither knob alone can make that shape.
- The boost is a second-order shelf into its corner; the cut is first order. Different orders are WHY their sum is not zero.
- The high boost is a bell whose gain grows as its bandwidth narrows (sharp reaches +18 dB, broad +10), which is how the original's coupled bandwidth/boost network behaved.
- Frequencies snap to the front-panel positions (20/30/60/100 low; 3/4/5/8/10/12/16 k bell; 5/10/20 k atten), because "60 Hz" on this kind of EQ is a switch, not a pot.
Coefficients are recomputed on the setter, not per sample: a program EQ's switches are set, not swept. Smooth outside if you automate it.
Included by dsp.h.
Types 1
A passive program equaliser in the EQP-1A pattern: low boost and low cut at one switched frequency (both at once give the dip-and-shelf "trick"), a high bell with a bandwidth control, and a high shelf cut. The control topology and curve family, not a component simulation of a unit (see the file comment).
One channel, per sample. Call setSampleRate() in prepare(). The amounts are 0..1 of each section's full range; the frequencies snap to the front panel's switch positions. The setters and process() run on the audio thread, but every setter redesigns all four sections and nothing is smoothed: set a control when it changes rather than per sample, and smooth outside if it is automated.