@audio/reverb-fdn
v1.1.3
Published
FDN reverb — 8 mutually-prime delays, O(N) Householder feedback, per-line damping (Jot topology)
Readme
@audio/reverb-fdn

FDN reverb — 8 mutually-prime delays, O(N) Householder feedback, per-line damping (Jot topology)
npm install @audio/reverb-fdnimport fdn from '@audio/reverb-fdn'Feedback delay network: 8 mutually-prime delay lines coupled through a Householder feedback matrix (I − 2/N·11ᵀ, applied in O(N) rather than a full N×N multiply), one-pole damping per line, and Jot's per-line decay gains g_k = 10^(−3·len_k / (T60·fs)) so every line decays at the same rate — a uniform, colorless T60 regardless of which delay you're listening to (Jot & Chaigne, 1991). Output taps use orthogonal ±1 sign patterns per channel for stereo decorrelation from a mono or stereo input. Strictly stereo, not N-channel: only data[0]/data[1] are read and written.
fdn(data, { t60: 1.5, damping: 0.3, mix: 0.3, fs: 44100 })
fdn([left, right], { decay: 0.9, mix: 0.4 }) // stereo, decay-derived T60| Param | Default | |
|---|---|---|
| t60 | derived from decay | seconds — decay time to −60 dB; overrides decay when set |
| decay | 0.6 | 0..1 convenience knob → t60 = 0.3 + 5·decay² (ignored if t60 is set) |
| damping | 0.3 | 0..1 — one-pole high-frequency loss per delay line |
| mix | 0.3 | 0..1 — wet/dry blend |
| fs | 44100 | sample rate; delay lengths scale to it |
Mutates data in place and returns it. Fresh line state is allocated per call — no state carries across calls, reprocess the whole buffer each time. Measured T60 (Schroeder backward-integrated energy decay curve) lands within ~30% of the configured value — see the family test suite.
Use when: a colorless, uniform-decay tail is the goal — algorithmic reverb without per-mode coloration.
Not for: plate/spring character (use dattorro/spring) or the cheapest possible CPU budget (use schroeder).
Part of the @audio/reverb family.
MIT © audiojs
