@maruaudio/dsp/reverbs/borrowed-hall-fdn is an eight-line algorithmic hall over caller-owned ("borrowed") storage: two prepared stereo rings, each partitioned into four disjoint lines. It is an original design following standard FDN theory, not a measured hall. Each line reads at its delay, passes a one-pole damping filter and a per-line loss 10^(−3 × delayFrames / (rate × decay)), and the eight are mixed by a normalized Sylvester (Hadamard) butterfly. Diffusion blends the direct and mixed feedback. Inputs enter at ±0.25 per line; the outputs are ±0.25 sums of the eight reads.
Parameters
configureBorrowedHallFdn(state, size, decaySeconds, dampingHz, diffusion) uses clampFiniteWithFallback (@maru/math-range):
| Argument | Range | Fallback and init |
|---|---|---|
size | 1 to 3 × the 31, 37, 41, 43, 47, 53, 61, 71 ms delays | 1.5 |
decaySeconds | 0.5 to 15 s nominal T60 | 3 |
dampingHz | 500 to 16,000 Hz, at most 0.45 × rate | 8000 |
diffusion | 0.25 to 1 | 1 |
Lifecycle
initBorrowedHallFdn(rate) (8 to 192 kHz, fallback 48 kHz) plus two prepared initFractionalFeedbackDelayNode rings outside the callback → configureBorrowedHallFdn → borrowedHallFdnTick(state, leftRing, rightRing, left, right), reading outLeft and outRight → resetBorrowedHallFdn and clearing both rings. The DSP node keeps its own shared position across the eight lines, not the rings' write cursors. Ticks allocate nothing.
When to use it
A long stereo hall tail in a chain that owns its delay rings and dry/wet.
Limits
- Wet only. A ring quarter shorter than
ceil(0.213 × rate) + 1frames is refused: both outputs are 0 and nothing is written. Do not share the rings. - Decay is a nominal broadband target; damping and lower diffusion shorten the measured decay. Scaled delays are not guaranteed mutually prime.
- Size changes need the caller's dry, clear and fade transition; the other controls keep the tail. Input is clamped to ±16 (non-finite → 0).