Filter Model Research
Filter Model Research
This note collects filter/DSP sources worth studying for SpaceAge without creating licensing trouble. It is a research map, not a decision to import code.
Recommendation
For the near term, keep improving SpaceAge filters using original code and JUCE DSP building blocks. Add third-party code only when it offers a clearly superior sound or workflow and has a confirmed permissive license.
The highest-priority product need is not merely "more filters"; it is a small set of musically excellent filters that feel predictable under automation, velocity, LFO sync, and hardware control.
Candidate Sources
| Source | License / Risk | Useful Ideas | Recommendation |
|---|---|---|---|
| JUCE DSP | Already part of our JUCE dependency/license path | State-variable filters, ladder filter, IIR helpers, smoothing, parameter infrastructure | Best immediate route. No extra dependency or license surface. |
| Airwindows | MIT | Many tasteful filters, saturation/filter hybrids, console-style tone processors, unusual minimalist DSP | Strong reference/source candidate after file-level review. Code style is plugin-centric, so adapt carefully rather than importing whole processors blindly. |
| Signalsmith DSP | MIT | High-quality DSP utilities, interpolation, curves, spectral-ish helpers, clean modern C++ style | Good candidate for utility ideas. Not a complete VA filter bank by itself. |
| STK | Permissive STK license | Filters, physical-model-oriented DSP patterns, classic educational implementations | Good study source. Use carefully and preserve notices if code is imported. |
| Soundpipe | MIT, archived | Small C DSP modules, filters, oscillators, resonators, and synthesis building blocks | Good reference for algorithms; less attractive as a living dependency. |
| VAStateVariableFilter | MIT | TPT state-variable design with LP, BP, HP, unit-gain BP, shelf, notch, all-pass, and peak outputs | Strong permissive candidate for a smooth multimode model. Audit and adapt only the small filter class, with attribution. |
| DaisySP | MIT core, mixed submodule licensing | Useful one-pole and general DSP building blocks | Review every module header. The Moog ladder was moved to DaisySP-LGPL and must not be treated as MIT. |
| SST Filters | GPLv3 | Broad, mature collection including vintage ladders, K35, diode, OB-Xd, and nonlinear models | Research/listening reference only; do not import into a differently licensed product. |
| ChowDSP filters | Mixed ecosystem; filter packages commonly GPLv3 | Excellent modern filter models and nonlinear analog-style work | Do not import GPL code into proprietary SpaceAge. Use only as high-level inspiration unless a specific permissive module is isolated and verified. |
Redshift Model Plan
Redshift now begins its compact model selector with:
Clean: the existing TPT state-variable path, kept as the exact neutral default.Silk: an original smooth variation with gentle bounded input saturation, resonance compensation, stable modulation behavior, and a smoothed live model transition. It reuses the same preallocated filter topology rather than importing third-party DSP.Bite: an original aggressive TPT character with bounded pre-drive, stronger resonance emphasis, and restrained output clipping. It deliberately does not claim vintage-ladder emulation and imports no GPL/LGPL filter code.
All models should use Redshift's same Cutoff, Resonance, Drive, velocity, envelope, and A-to-B tempo-motion controls. Switching models must preserve perceived level, remain bounded at high resonance, and avoid allocations or coefficient rebuilding when parameters are static.
Slope / Pole Plan
Expose this control as SLOPE, with pole count in its tooltip:
| UI value | Order | Musical behavior |
|---|---|---|
6 dB/oct |
1 pole | Gentle shading; preserves body and upper harmonics. |
12 dB/oct |
2 poles | Open, familiar multimode response; current Redshift character. |
18 dB/oct |
3 poles | Focused middle ground for basses, sequences, and assertive leads. |
24 dB/oct |
4 poles | Strong separation and dramatic sweeps for pads, basses, and showcase sounds. |
Initial model support should be deliberate rather than a misleading Cartesian product:
| Model | Initial slopes | Notes |
|---|---|---|
Clean |
6, 12, 18, 24 dB/oct | Full utility set with predictable modulation. |
Silk |
6, 12, 18, 24 dB/oct | Implemented for LP/HP using the same bounded cascade as Clean. |
Bite |
6, 12, 18, 24 dB/oct | Implemented for LP/HP using the shared bounded cascade. |
Slope is immediately meaningful for low-pass and high-pass. Band-pass needs a separately calibrated order/bandwidth definition; Notch, Peak, Bell, and Shelf modes should hide or disable Slope unless the selected implementation has a truthful, audible order choice.
Changing Slope must not reset Cutoff, Resonance, Drive, envelope, velocity, or Tone motion. It should be click-free through a short state-preserving crossfade between old and new responses. Resonance should be normalized by model and slope rather than multiplied independently through every cascaded stage, and output compensation should keep audition loudness reasonably consistent.
Implementation constraints:
- Preallocate the maximum per-voice filter state and process only active stages.
- Calculate one smoothed Cutoff target per sample and reuse derived coefficients across compatible cascaded stages.
- Take the exact neutral bypass when Filter is Off.
- Add no allocation, lock, or general graph traversal to the audio callback.
- Profile every model/slope combination with static and eight-route modulation.
- Test rapid slope automation, high resonance, Nyquist-adjacent cutoff, low sample rates, tempo changes, and voice retirement for finite bounded output.
Implementation Checkpoint - 2026-08-28
Clean,Silk, andBiteare available on Redshift's Tone page and persist with native patches and projects.- Clean is compile-neutral when Silk amount is zero. Silk's nonlinear work runs only while the smoothed model mix is active.
- The focused audio suite verifies finite bounded LP, HP, and BP output, distinct Silk and Bite signatures, lane/filter isolation, and unchanged hot-path equivalence.
- A genuinely separate ladder topology remains future research. It should be added only when its stability, anti-aliasing cost, and level compensation have dedicated tests and it offers audible value beyond the current three characters.
Filter Direction For SpaceAge
- Build a clean multimode filter family first: low-pass, high-pass, band-pass, notch, low shelf, high shelf, and bell.
- Prefer topology-preserving / TPT-style state-variable filters for modulation because they behave better when cutoff is moving.
- Add musical nonlinear color as a separate stage: drive before filter, drive inside filter if stable, and output saturation after filter.
- Use parameter smoothing everywhere cutoff/Q/drive can move.
- Avoid expensive per-sample coefficient recomputation unless a parameter is actually changing. For tempo-synced modulation, update smoothed targets rather than rebuilding the filter from scratch every sample.
- Keep one shared filter abstraction for Redshift, Propulsion, Liftoff, Glass Moon, SoundFont tone shaping, channel strips, and future Motion Blocks where possible. One good system beats five almost-good one-offs.
- Treat model, mode, and slope as separate concepts: model supplies character, mode selects LP/HP/BP/etc., and slope selects attenuation order only where the combination has a truthful implementation.
Sources
- JUCE: https://juce.com and https://github.com/juce-framework/JUCE
- Airwindows: https://github.com/airwindows/airwindows
- Signalsmith DSP: https://github.com/Signalsmith-Audio/dsp
- STK: https://github.com/thestk/stk
- Soundpipe: https://github.com/PaulBatchelor/Soundpipe
- VAStateVariableFilter: https://github.com/JordanTHarris/VAStateVariableFilter
- DaisySP: https://github.com/electro-smith/DaisySP
- SST Filters (GPL research reference only): https://github.com/surge-synthesizer/sst-filters