Robust Channel EQ Research And Plan
Robust Channel EQ Research And Plan
Decision
Build the next SpaceAge channel EQ as a first-party six-band parametric EQ on the filter core already present in the project. Do not import another EQ library for this phase.
The target band layout is:
- High-pass filter
- Low shelf
- Parametric bell 1
- Parametric bell 2
- High shelf
- Low-pass filter
The drum mixer already has a tested implementation of this topology. The next step is to promote that implementation into a shared channel-EQ processor and give both the regular Mixer and Drum Mixer the same complete controls.
License Research
| Candidate | License | Finding | Decision |
|---|---|---|---|
| JUCE DSP | Commercial JUCE license or AGPL alternative | Already pinned, linked, fingerprinted, and covered by the project's commercial JUCE licensing boundary. It includes the primitives needed for IIR EQ work. | Suitable, but no new JUCE DSP dependency is needed because the current first-party biquad bank already supplies the required topology. |
| DSPFilters by Vinnie Falco | MIT | Capable IIR library with Butterworth, Chebyshev, elliptic, Legendre, shelving, and related designs. Compatible with proprietary use when its notice is retained. | Best external fallback if SpaceAge later needs higher-order crossover or unusual IIR designs. Do not import it merely to replace the working six-band core. |
| iir1 by Bernd Porr | MIT | Maintained realtime-oriented continuation of DSPFilters with sample-by-sample processing and documented filter families. | Viable external fallback. Its exception behavior and integration surface would need a realtime audit before use. |
| Signalsmith DSP | MIT | High-quality header-only DSP collection with measured tests, but its published module list is focused on delay, interpolation, envelopes, FFT, and spectral processing rather than a complete channel EQ. | Keep as a candidate for future spectral/analyzer work, not the channel-EQ filter bank. |
| chowdsp_eq / chowdsp_filters | GPLv3 | Strong JUCE-oriented EQ and filter modules, but the relevant modules are GPLv3 even though some other ChowDSP modules use BSD licenses. | Reject for the proprietary product unless a separate commercial license is obtained and audited. |
Primary sources:
- https://github.com/vinniefalco/DSPFilters
- https://github.com/berndporr/iir1
- https://github.com/Signalsmith-Audio/dsp
- https://github.com/Chowdhury-DSP/chowdsp_utils
Product Scope
Each bell and shelf band needs frequency, gain, Q, and enable controls. The pass filters need frequency, resonance/Q, slope, and enable controls. The default state must be neutral and must not alter existing projects until the user enables the new EQ.
Per-band enable controls are now complete for both mixers. Enabling an empty EQ rack leaves all six bands bypassed, so the default rack is genuinely neutral. The high-pass and low-pass filters provide stable 12 and 24 dB-per-octave choices, with 12 dB as the continuity-safe default.
The EQ detail panel should use consistent band-selection buttons rather than trying to display every parameter in one cramped channel strip. A compact curve display may be added after the controls and automation contract are stable.
Performance Contract
- A fully bypassed EQ performs no per-sample filter work and clears stale state.
- A neutral or individually disabled band is skipped.
- Coefficients are recalculated only after a parameter or sample-rate change.
- Parameter reads and coefficient preparation must not allocate, lock, or perform file/UI work on the audio thread.
- Coefficient transitions must be smoothed or safely staged so automation does not produce zipper noise or unstable intermediate filters.
- A spectrum analyzer must use a bounded lock-free handoff and a decimated background/UI analysis rate. Hidden EQ panels must not analyze or repaint.
- Regression tests must cover finite output, bypass neutrality, distinct band responses, automation safety, state persistence, and a representative multi-channel CPU budget.
Implementation Order
Complete: use the existing six-band topology in both mixer domains while retaining separate fixed-capacity state for independent channels.
Complete: add equivalent regular-mixer parameters. Legacy musical-EQ parameters remain readable in older project state but are no longer the visible instrument-channel processor.
Complete: replace the four-control EQ detail with band selection plus frequency, gain, and Q controls. Pass bands suppress the irrelevant gain control.
Complete: add response-curve rendering from message-thread parameter snapshots, using the same six biquad equations and no FFT or timer.
Complete: add a bounded realtime analyzer. One 2,048-sample atomic capture ring serves the visible EQ panels in round-robin order; FFT work is performed only on the message thread. Capture is disabled on bus, non-mixer, and hidden EQ views, avoiding sixteen simultaneous analyzer streams. Each graph is also an accessible LIVE/STATIC control, so users can suspend individual analyzers; capture stops when no visible graph requests it.
Complete: add selectable 12/24 dB-per-octave slopes to the high-pass and low-pass bands. The 24 dB mode cascades a second instance of the existing biquad with independent state. The default remains 12 dB for project and preset continuity, and disabled pass bands clear both stages.
Complete: stage live EQ automation with a fixed 64-sample dual-bank crossfade. Frequency, gain, Q, slope, and band-enable changes preserve the previous coefficients and filter state while the new bank is prepared. Settled channels process one bank; only an active transition temporarily processes both, with no coefficient interpolation, allocation, or lock.