Variable-cadence algorithm:
δ = |dynGainMod − lastDynGainMod|
if δ > 0.1 dB:
update coefficients (per-sample — zero transient lag)
intervalCounter = 0
else:
if intervalCounter++ >= 4:
update coefficients (batched)
Measured savings at 8 bands all-dynamic, sustained note: up to 75% reduction in bq.set() calls with no audible difference. On a transient attack the first sample with δ > 0.1 dB immediately restores per-sample accuracy.
- Allocation-Free Semantic Analysis (ResonanceDetector)
Traditional "smart EQ" products apply machine-learning inference models (Soothe2, iZotope Neutron) — opaque, CPU-heavy, non-deterministic. We introduce a deterministic alternative that adds zero latency and allocates no memory:
Take the 2048-bin log-magnitude spectrum from SpectrumFIFO (UI thread rate).
Re-sample into a 96-bin log-frequency grid (20 Hz → Nyquist).
Estimate local baseline via ±0.5-octave moving average.
Flag peaks where (magnitude − baseline) ≥ 3 dB and peak is local max in ±3-bin neighbourhood.
Score each peak: score = deviation ×ばつ intentWeight(hz, mode) where intentWeight is a log-frequency Gaussian bump per IntentMode profile.
Return top-4 suggestions: {freqHz, gainDb, q, confidence, label}.
The intentWeight function encodes instrument-specific problem zones:
Mode Primary Bump Zone
VocalClean ×ばつ1.6 at 300 Hz mud
DrumPunch ×ばつ1.5 at 300 Hz boxiness
GuitarSpace ×ばつ1.5 at 250 Hz mud
MasterPolish ×ばつ1.3 at 250 Hz low-end buildup
Semantic labels from FrequencyExplainer.h map frequency ranges to strings ("mud", "harshness", "sibilance", "air") enabling explain-on-hover UX.
- Compact View / Mini-Window (v2.2.3)
Inspired by Ableton Live's EQ Eight compact device view. Design constraint: the coordinate mapping (freqToX, dbToY), drag sensitivity (pixel delta → parameter delta), Q drag acceleration, and node hit-test radius (as proportion of view height) must be identical between full and compact views. Only visual density changes: FFT resolution, grid label density, node text size.
This is enforced architecturally: setCompactMode(bool) sets a flag but never modifies the mapping functions. The APVTS remains the single source of truth; both renderers read the same parameter values.
- Future Work (v2.5+)
Explicit SIMD vectorisation: group 8 bands into juce::dsp::SIMDRegister, processing 4 bands per SSE instruction or 8 via AVX2.
Cross-instance masking negotiation: via ARC-Core local IPC spine, multiple plugin instances communicate energy peaks and negotiate inverse dynamic notches.
Spectral dynamics mode: per-bin FFT threshold clamping (Soothe2 territory) using the existing overlap-add Match EQ infrastructure.
Dolby Atmos 9.1.6: expand isBusesLayoutSupported for discrete immersive channel arrays with spatial zone linking.
References
[1] A. Simper, "Solving the continuous SVF equations using trapezoidal integration and equivalent currents," Cytomic, 2013. https://cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf
[2] W. Pirkle, "Designing Audio Effect Plugins in C++," Focal Press, 2019.
[3] J. Reiss and A. McPherson, "Audio Effects: Theory, Implementation and Application," CRC Press, 2014.
[4] F. Renn-Giles and D. Rowland, "Real-time 101," ADC 2019. https://github.com/hogliux/farbot
[5] JUCE, "juce::dsp::Oversampling," Articy, 2023. https://docs.juce.com/master/classjuce_1_1dsp_1_1Oversampling.html
[6] R. Bristow-Johnson, "Audio EQ Cookbook," musicdsp.org, 1994. https://www.musicdsp.org/files/Audio-EQ-Cookbook.txt