Skip to content

[Roadmap] den effects library — v1.0 → v3.0 master plan #8

Description

@yuichkun

[Roadmap] den effects library — v1.0 → v3.0 master plan

Related: #<parent-issue-number> ([Epic] Foundation for den). This roadmap is created after the foundation epic merges. Individual effects are filed as separate issues via .github/ISSUE_TEMPLATE/add-effect.yml and checked off below.

Purpose

This is the curated master list of effects den commits to implementing — ~58 user-facing classes across 5 phases (v1.0 → v3.0). Each effect lists its target version, reference source (from LICENSE-THIRDPARTY allow-list), key parameters, and implementation notes. New effects are added only via a separate chore(roadmap): propose <effect> issue and maintainer approval.

The goal is parity with the serious-producer workflow: after v2.0, a user can construct a complete mix bus and master chain inside the browser using only @denaudio/effects — comparable in capability (not necessarily flavor) to the FabFilter Pro bundle + iZotope Ozone/Neutron core modules.

How to read this document

Each effect has:

  • Class: the exported TS class name (PascalCase)
  • Module: Rust module file (crates/den-core/src/effects/<snake>.rs)
  • Category: filter | dynamics | saturation | modulation | delay | reverb | pitch | spatial | utility | analysis
  • Reference: short-name key from LICENSE-THIRDPARTY Tier A/B
  • Params: top-level AudioParam list
  • Notes: non-obvious implementation constraints

v1.0 — MVP (~20 user-facing classes across 16 modules): a complete bus chain without leaving the browser

Counting note: We count by TS class (user-facing exports). Modules can ship multiple classes (e.g., high_pass.rs exports HighPass12 + HighPass24 from the same biquad-cascade kernel). Gain ships in Sub D's foundation epic and is not a v1.0 work item.

Goal: after v1.0, a user can route source → HPF → EQ → Comp → Limiter → out with pro-grade fidelity.

Utility

  • GainGain / gain.rs / utility / ref: rbj+textbook
    • Params: gain (linear, 0..10, a-rate)
    • Notes: delivered in Sub D (foundation epic)
  • PolarityInvertPolarityInvert / polarity_invert.rs / utility / ref: textbook
    • Params: active (0/1, k-rate)
    • Notes: trivial; good second effect to confirm scaffolder generality
  • StereoWidthStereoWidth / stereo_width.rs / spatial / ref: dafx ch.6 (Mid/Side)
    • Params: width (0..2, a-rate)
    • Notes: M/S encode → scale S → M/S decode. Classic formula.
  • MonoMono / mono.rs / utility / ref: textbook
    • Params: none
    • Notes: out = (L+R)/2 duplicated. Useful as a bus check.
  • DcFilterDcFilter / dc_filter.rs / filter / ref: jos (DC blocker)
    • Params: none
    • Notes: 1-pole HPF at ~5 Hz, y[n] = x[n] − x[n−1] + 0.995·y[n−1]. Should be applied implicitly at input of every effect chain; we expose it explicitly too.

Filter

  • HighPass12 / HighPass24HighPass12, HighPass24 / high_pass.rs / filter / ref: rbj
    • Params: frequency (20..20000 Hz, a-rate, exp), q (0.1..10, a-rate)
    • Notes: biquad single (12 dB/oct) or cascade-of-2 (24 dB/oct). Coefficients from RBJ cookbook.
  • LowPass12 / LowPass24 — same file — ref: rbj
    • Params: frequency, q
  • BandPassBandPass / band_pass.rs / filter / ref: rbj
    • Params: frequency, q
  • NotchNotch / notch.rs / filter / ref: rbj
    • Params: frequency, q
  • LowShelf / HighShelfLowShelf, HighShelf / shelving.rs / filter / ref: rbj
    • Params: frequency, gain_db (-24..+24, a-rate), slope (0.1..2)
  • PeakingEqPeakingEq / peaking_eq.rs / filter / ref: rbj
    • Params: frequency, q, gain_db
    • Notes: single-band only in v1.0. Multi-band cascade is v1.1.

Dynamics

  • CompressorCompressor / compressor.rs / dynamics / ref: dafx ch.4, airwindows/Pressure5
    • Params: threshold_db, ratio, attack_ms, release_ms, knee_db, makeup_db, sidechain_hp_hz
    • Notes: feed-forward, RMS detection (sqrt of 1-pole smoothed square), soft-knee via quadratic interpolation around threshold. No look-ahead in v1.0. sidechain_hp_hz is an INTERNAL high-pass on the detector's RMS signal (not an external sidechain input channel) — the detector ignores energy below this frequency, useful for ducking only mid/high-frequency content. External sidechain (separate input channel) is a v2.0 follow-up.
  • LimiterLimiter / limiter.rs / dynamics / ref: dafx ch.4
    • Params: ceiling_db, release_ms
    • Notes: hard-knee, zero look-ahead ("brickwall-lite"). True-peak ISP limiter is v3.0.
  • GateGate / gate.rs / dynamics / ref: dafx ch.4
    • Params: threshold_db, attack_ms, release_ms, hold_ms, hysteresis_db

Saturation

  • SoftClipSoftClip / soft_clip.rs / saturation / ref: dafx ch.4 (tanh waveshaper), airwindows/Loud
    • Params: drive (1..10, a-rate), mix (0..1, a-rate)
  • BitCrusherBitCrusher / bit_crusher.rs / saturation / ref: dafx ch.4
    • Params: bits (1..16, k-rate), sample_rate_reduction (1..64, k-rate)

Modulation / Delay

  • TremoloTremolo / tremolo.rs / modulation / ref: dafx ch.5
    • Params: rate_hz, depth, shape (sine/triangle/square, k-rate enum)
  • DigitalDelayDigitalDelay / digital_delay.rs / delay / ref: dafx ch.2
    • Params: time_ms (0..2000), feedback (0..0.98), mix (0..1)
    • Notes: power-of-2 circular buffer, linear interpolation on fractional delays. Denormal flush. mix=0 ⇒ bypass fast-path.

v1.1 — Mix essentials (+10 effects): polished mix chain

  • ParametricEq8ParametricEq8 / parametric_eq.rs / filter / ref: rbj, fundsp/Pro-Q-like
    • Params: 8 bands × {enabled, frequency, q, gain_db, type}. State per band, total ~2 KB.
    • Notes: cascade of biquads. Serialization of configurations from v2.0.
  • ExpanderExpander / expander.rs / dynamics / ref: dafx ch.4
  • DeEsserDeEsser / de_esser.rs / dynamics / ref: dafx ch.4
    • Notes: split-band (HPF ~4 kHz side chain into comp, subtract from signal, recombine)
  • MultibandCompressor3MultibandCompressor3 / multiband_compressor.rs / dynamics / ref: fundsp, dafx
    • Notes: Linkwitz-Riley crossovers at 200 Hz / 2000 Hz; 3 independent compressors.
  • HardClipHardClip / hard_clip.rs / saturation / ref: textbook
  • TapeSaturationTapeSaturation / tape_saturation.rs / saturation / ref: airwindows/IronOxide5, dafx ch.7
    • Notes: pre-gain → asymmetric waveshaper → post-LPF + subtle HF rolloff. Airwindows port.
  • TubeSaturationTubeSaturation / tube_saturation.rs / saturation / ref: airwindows/Focus, dafx ch.7
    • Notes: asymmetric waveshaper (positive vs negative half different curves).
  • PingPongDelayPingPongDelay / ping_pong_delay.rs / delay / ref: dafx ch.2
    • Params: time_ms (0..2000, k-rate), feedback (0..0.95, a-rate), width (0..1, k-rate; 0=mono delay, 1=full ping-pong), mix (0..1, a-rate)
    • Notes: pair of cross-feedback delay lines (L→R, R→L), independent fractional read taps.
  • TransientShaperTransientShaper / transient_shaper.rs / dynamics / ref: airwindows/Slew2
    • Params: attack, sustain (each -24..+24 dB)
  • AutoPanAutoPan / auto_pan.rs / modulation / ref: dafx ch.5
    • Params: rate_hz, depth, shape

v1.2 — Modulation & reverb (+10 effects): space and motion

  • ChorusChorus / chorus.rs / modulation / ref: dafx ch.5, fundsp
    • Params: rate_hz, depth_ms, mix, voices (1..4, k-rate)
  • FlangerFlanger / flanger.rs / modulation / ref: dafx ch.5
    • Params: rate_hz, depth_ms, feedback, mix
  • PhaserPhaser / phaser.rs / modulation / ref: dafx ch.5, airwindows
    • Params: rate_hz, depth, stages (4/6/8/12, k-rate enum), feedback, mix
    • Notes: cascade of first-order allpass filters, swept by LFO.
  • VibratoVibrato / vibrato.rs / modulation / ref: dafx ch.5
    • Notes: delay-line-based; linear-interpolation fractional read.
  • RingModRingMod / ring_mod.rs / modulation / ref: dafx ch.5
    • Params: frequency (5..5000 Hz, a-rate), mix
  • PlateReverbPlateReverb / plate_reverb.rs / reverb / ref: jos/physical, fundsp
    • Notes: four-tap delay + allpass network. Classic "plate" decay. Size ~8 KB of state.
  • HallReverbHallReverb / hall_reverb.rs / reverb / ref: jos/physical (FDN), fundsp
    • Notes: 8-node feedback delay network with Hadamard mixing matrix.
  • RoomReverbRoomReverb / room_reverb.rs / reverb / ref: jos/physical, fundsp
    • Notes: shorter decay, denser early reflections.
  • TapeDelayTapeDelay / tape_delay.rs / delay / ref: airwindows/TapeDelay
    • Notes: wow/flutter LFO on read head + saturator in feedback loop.
  • DuckingDelayDuckingDelay / ducking_delay.rs / delay / ref: dafx
    • Notes: sidechain compressor on delay output keyed by input.

v2.0 — Pitch, advanced mastering (+10 effects)

  • PitchShifterPitchShifter / pitch_shifter.rs / pitch / ref: dafx ch.8 (PSOLA)
    • Params: shift_semitones (-12..+12, a-rate), mix (0..1, a-rate), formant_preserve (0/1, k-rate)
    • Notes: PSOLA (Pitch-Synchronous Overlap-Add) is deterministic and avoids phase-vocoder window artifacts. Best for monophonic sources (vocals, leads, single-instrument tracks); polyphonic content will exhibit smearing. Document this caveat in the catalog page.
  • FormantShifterFormantShifter / formant_shifter.rs / pitch / ref: dafx ch.8
  • HarmonizerHarmonizer / harmonizer.rs / pitch / ref: dafx ch.8
    • Notes: multi-voice pitch shifter with configurable intervals.
  • SpringReverbSpringReverb / spring_reverb.rs / reverb / ref: jos/physical, airwindows
    • Notes: physical-model spring (dispersion via allpass cascade).
  • ShimmerReverbShimmerReverb / shimmer_reverb.rs / reverb / ref: jos/physical
    • Notes: pitch-shift the reverb return +12 into feedback loop.
  • ConvolutionReverbConvolutionReverb / convolution_reverb.rs / reverb / ref: dafx ch.9
    • Params: mix (0..1, a-rate), predelay_ms (0..200, k-rate), gain_db (-24..+12, a-rate)
    • Notes: partitioned block convolution (uniform partition for v2, non-uniform later). User supplies IR via loadIR(audioBuffer) method (decoded by user via ctx.decodeAudioData). No default IRs bundled with this effect — bundling commercial/copyrighted IRs would breach licensing. Companion package @denaudio/ir-library (v3.0) ships a curated set of CC0/public-domain IRs separately.
  • DynamicEqDynamicEq / dynamic_eq.rs / filter / ref: dafx ch.4 + ch.3
    • Notes: peaking band whose gain is modulated by a sidechain compressor envelope.
  • LinearPhaseEqLinearPhaseEq / linear_phase_eq.rs / filter / ref: jos/filters, dafx ch.3
    • Notes: FIR via overlap-add convolution. Substantial CPU; v2 target.
  • ExciterExciter / exciter.rs / saturation / ref: dafx ch.7
    • Notes: HPF → saturate → mix back in, restores HF energy.
  • HaasWidenerHaasWidener / haas_widener.rs / spatial / ref: dafx ch.6
    • Notes: sub-30 ms delay on one channel for stereo illusion.

v3.0 — Mastering-grade + analysis (+8 effects)

  • TruePeakLimiterTruePeakLimiter / true_peak_limiter.rs / dynamics / ref: dafx ch.4, jos
    • Notes: 4× oversampled look-ahead limiter with ISP awareness.
  • LoudnessMeterLoudnessMeter / loudness_meter.rs / analysis / ref: ITU BS.1770
    • Notes: integrated LUFS, short-term LUFS, momentary LUFS, true peak.
  • SpectrumAnalyzerSpectrumAnalyzer / spectrum_analyzer.rs / analysis / ref: jos/sasp
    • Notes: streaming FFT. Exposes magnitude array via MessagePort to main thread.
  • StereoImagerStereoImager / stereo_imager.rs / spatial / ref: dafx ch.6
    • Notes: multi-band width control + vectorscope data.
  • MultibandSaturatorMultibandSaturator / multiband_saturator.rs / saturation / ref: dafx ch.7
  • WaveFolderWaveFolder / wave_folder.rs / saturation / ref: dafx ch.7
  • BinauralPanBinauralPan / binaural_pan.rs / spatial / ref: kemar (MIT Media Lab HRTF dataset, free for commercial/non-commercial use)
    • Params: azimuth_deg (-180..+180, a-rate), elevation_deg (-40..+90, a-rate), mix (0..1, a-rate)
    • Notes: HRTF convolution. Bundle a small default subset of the KEMAR dataset (~500 KB) under vendor-licenses/KEMAR/. Attribution required: "KEMAR HRTF measurements © MIT Media Lab".
  • ConvolutionIrLibrary — not an effect per se; companion package @denaudio/ir-library with curated CC0 IR files + loader helper.
    • Requires monorepo addition: this package is NOT in Sub A's initial layout (packages/core, worklet, effects, test-utils, examples). Adding it requires a separate chore(scaffold): add @denaudio/ir-library package issue before this checkbox can land.

Tracking

Counts are TS user-facing classes, not Rust modules (some modules export multiple classes; some classes share a module).

  • v1.0: ~20 classes (16 modules) — goal: 3–4 months post-foundation
  • v1.1: +10 classes — goal: 6 months
  • v1.2: +10 classes — goal: 9 months
  • v2.0: +10 classes — goal: 12 months
  • v3.0: +8 classes — goal: 18 months

Total at v3.0: ~58 user-facing classes. Dates are aspirational, not contractual. Each checkbox above links to its own implementation issue (filed via the Add-Effect template) as work begins.

How to contribute

  1. Pick an unchecked effect from the list.
  2. Open a new issue using .github/ISSUE_TEMPLATE/add-effect.yml with the effect name/ref from this roadmap.
  3. Follow CONTRIBUTING.md §3.
  4. Upon merge, check the box here.

How to propose a NEW effect (not on the list)

Open an issue titled chore(roadmap): propose <EffectName> with:

  • Category (from the 9 listed)
  • Target version (v1.x / v2.x / v3.x)
  • Reference source (must already be in Tier A/B of LICENSE-THIRDPARTY, or propose its addition first)
  • Justification (why does this belong in den?)

Maintainer approves → the effect is added here → an Add-Effect issue is filed to implement it.

What we will NOT build (explicit rejects)

  • Sequencers / MIDI processingden is effects, not composition.
  • Synthesizers — arguably overlap, but v1.0–v3.0 are strictly effects. A sibling library @denaudio/synth might exist in the future; out of scope here.
  • Generic delay lines, buffers, utility signal-flow primitives for users to build their own effects — those belong in @denaudio/core or a future @denaudio/graph. The user-facing library is "effects, ready to use."
  • Anything GPL-encumbered — see LICENSE-THIRDPARTY.

This roadmap lives at ROADMAP.md in the repo; changes go through PR.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions