Digital Larry
Active member
I've been looking at FV-1 reverb code for more than ten years, and it's quite easy to not be able to see the forest for the trees. I asked Claude AI to highlight similarities and differences between the available reverb programs posted in the "Free" section of Spin's forum.
Spinsemi Reverb .SPN Files — Similarities & Differences
Analysis based on the actual source of: min_rev1.spn, rev_pl_1.spn, rev_pl_2.spn, rev_pl_3.spn, rev_rt_d_f.spn, rom_rev2.spn
Total Delay Memory (sets the size of the reverb space)
What They All Share
All six programs are FV-1 (SPN1001) assembly and share the same fundamental patterns:
The Three Plates — rev_pl_1, rev_pl_2, rev_pl_3
These are literally the same program with different delay tables. The algorithm, instruction sequence, register names, pot scaling, LFO setup, filter coefficients, and CHO modulation are identical across all three files. The only numbers that differ are the MEM declarations.
Delay memory comparison:
Note: rev_pl_3 raises the minimum krt floor to 0.40 (vs 0.30 for pl_1/pl_2). With such short delays, a 0.30 floor would cause near-instant decay.
Shared plate architecture:
rev_rt_d_f — Most Architecturally Distinct
Three things set this apart from every other program here:
1. Variable diffusion via MULX
The three input all-passes use MULX kdiff rather than a fixed coefficient constant. kdiff is driven directly from POT1 (range 0 to 0.70). At zero, the input APs are nearly bypassed — sparse, echo-y wash. At maximum, dense diffusion. No other program in this set exposes this parameter.
2. Bipolar POT2 for frequency shaping
Instead of separate HF/LF loss pots, POT2 sweeps through a centre-flat position using a bipolar offset/clip trick:
3. No LFO modulation
There are no CHO, WLDS, or SKP RUN instructions. The flutter-smoothing the plates get from sinusoidal delay modulation is absent. This can make rev_rt_d_f sound more static at longer reverb times, but saves instruction budget (stated as 95 of 128 instructions used).
Other notable differences:
rom_rev2 — Most Complex Program
This is the densest program in the set with 22 MEM blocks and two features none of the others have:
1. Paired loop all-passes
Each loop stage has two back-to-back APs (ap1 + ap1b, ap2 + ap2b, etc.) with slightly different coefficients (0.6 and 0.5). This doubles diffusion density in the feedback loop without lengthening the main delay lines.
2. Dedicated early reflection delays
ldel and rdel (each 3000 samples / ~91 ms) are written mid-loop and tapped at four offsets each for the output mix. This creates a sense of room geometry — distinct early reflections before the tail builds — which the plate programs completely lack.
Other differences vs the plates:
min_rev1 — The Outlier
This is a teaching/demo sketch, not a production reverb:
Its loop all-passes (ap1 = 3823 samples / 117 ms, ap2 = 4732 samples / 144 ms) are enormous relative to the loop delays — a proportion that gives it a distinctive, heavily all-pass-smeared character. Worth studying for understanding the architecture; not a gigging reverb.
Quick Reference Table
All delay times calculated at FV-1 default sample rate of 32768 Hz.
Spinsemi Reverb .SPN Files — Similarities & Differences
Analysis based on the actual source of: min_rev1.spn, rev_pl_1.spn, rev_pl_2.spn, rev_pl_3.spn, rev_rt_d_f.spn, rom_rev2.spn
Total Delay Memory (sets the size of the reverb space)
Code:
rev_pl_1 (plate, lush) ~995 ms — 16 MEM blocks
rev_pl_2 (plate, tight) ~634 ms — 16 MEM blocks
rev_pl_3 (plate, very tight) ~384 ms — 16 MEM blocks
rev_rt_d_f (room, flexible) ~996 ms — 14 MEM blocks
rom_rev2 (room) ~942 ms — 22 MEM blocks
min_rev1 (mini) ~799 ms — 8 MEM blocks
What They All Share
All six programs are FV-1 (SPN1001) assembly and share the same fundamental patterns:
- All-pass diffusion — every program uses cascaded all-pass filters (RDA + WRAP pairs) to build reverb density
- Recirculating delay network — sound circulates through a loop of APs and delays to create the tail
- Stereo output — L and R DAC taps are taken at different offsets into the delay lines for decorrelation (except min_rev1 which is stereo out from a mono loop)
- Wet-only output — all programs output the processed signal only; dry mix is done externally
- Same pot assignment layout — POT0 = reverb time, POT1 = LF/diffusion control, POT2 = HF control (with variations per program)
The Three Plates — rev_pl_1, rev_pl_2, rev_pl_3
These are literally the same program with different delay tables. The algorithm, instruction sequence, register names, pot scaling, LFO setup, filter coefficients, and CHO modulation are identical across all three files. The only numbers that differ are the MEM declarations.
Delay memory comparison:
Code:
rev_pl_1 rev_pl_2 rev_pl_3
(lush) (tight) (very tight)
-------------------------------------------------------------
Total RAM ~995 ms ~634 ms ~384 ms
Largest delay 4591 smp 2679 smp 1379 smp
(140 ms) (82 ms) (42 ms)
Input AP coeff 0.60 0.65 0.65
Loop AP coeff 0.60 0.60 0.65
krt range 0.30–0.90 0.30–0.90 0.40–0.93
Note: rev_pl_3 raises the minimum krt floor to 0.40 (vs 0.30 for pl_1/pl_2). With such short delays, a 0.30 floor would cause near-instant decay.
Shared plate architecture:
- 4-stage serial loop — each stage is one AP + one delay
- Per-stage shelving HP and LP filter in the feedback path (16 filter operations total)
- True stereo input — separate 4-AP diffusion chains for L and R
- Two SIN LFOs (SIN0 freq=12 amp=37, SIN1 freq=15 amp=33) modulate all four loop APs using SIN and COS phases to decorrelate
- Stereo output assembled as a weighted 4-tap mix from different offsets into each of the four delays
- POT0 shaped via sqrt (log/exp) before scaling — gives a more natural taper
rev_rt_d_f — Most Architecturally Distinct
Three things set this apart from every other program here:
1. Variable diffusion via MULX
The three input all-passes use MULX kdiff rather than a fixed coefficient constant. kdiff is driven directly from POT1 (range 0 to 0.70). At zero, the input APs are nearly bypassed — sparse, echo-y wash. At maximum, dense diffusion. No other program in this set exposes this parameter.
2. Bipolar POT2 for frequency shaping
Instead of separate HF/LF loss pots, POT2 sweeps through a centre-flat position using a bipolar offset/clip trick:
- CCW → low shelf cuts highs (darker decay)
- Centre → flat response
- CW → high shelf cuts lows (brighter decay)
3. No LFO modulation
There are no CHO, WLDS, or SKP RUN instructions. The flutter-smoothing the plates get from sinusoidal delay modulation is absent. This can make rev_rt_d_f sound more static at longer reverb times, but saves instruction budget (stated as 95 of 128 instructions used).
Other notable differences:
- Simpler loop — only 2 APs per channel (apcl1/apcl2 and apcr1/apcr2) vs 4 in the plates
- Input gain (kin) is derived inversely from krt, so perceived output level stays consistent as reverb time changes
- Loop delays are much longer (dcl = 234 ms, dcr = 224 ms) than the plate loop delays, offsetting the simpler loop structure
rom_rev2 — Most Complex Program
This is the densest program in the set with 22 MEM blocks and two features none of the others have:
1. Paired loop all-passes
Each loop stage has two back-to-back APs (ap1 + ap1b, ap2 + ap2b, etc.) with slightly different coefficients (0.6 and 0.5). This doubles diffusion density in the feedback loop without lengthening the main delay lines.
2. Dedicated early reflection delays
ldel and rdel (each 3000 samples / ~91 ms) are written mid-loop and tapped at four offsets each for the output mix. This creates a sense of room geometry — distinct early reflections before the tail builds — which the plate programs completely lack.
Other differences vs the plates:
- Only SIN0 is used for LFO modulation (not SIN0 + SIN1), but with a much larger amplitude of 160 vs 33–37 for the plates
- Only ap1 and ap3 are modulated — not all four loop stages
- POT0 is linear (no sqrt shaping) — range directly 0.20 to 0.80
- POT1 shelf coefficient spans -0.80 to +0.80 — wider than the plate range of -1 to 0
- 8 output taps per channel (4 from loop delays + 4 from ldel/rdel) vs 4 taps in the plates
min_rev1 — The Outlier
This is a teaching/demo sketch, not a production reverb:
- Only 22 of 128 instructions used
- Mono input only (sums ADCL + ADCR)
- No pot controls
- No frequency filtering
- No LFO modulation
- Two-element ring loop rather than the four-stage serial chain every other program uses
Its loop all-passes (ap1 = 3823 samples / 117 ms, ap2 = 4732 samples / 144 ms) are enormous relative to the loop delays — a proportion that gives it a distinctive, heavily all-pass-smeared character. Worth studying for understanding the architecture; not a gigging reverb.
Quick Reference Table
Code:
Program Type Total RAM Input APs Loop APs CHO mods Filters Stereo in Early refl
----------- -------- ---------- ---------- --------- --------- -------- ---------- ----------
min_rev1 mini ~799 ms 4 (mono) 2 0 0 no no
rev_pl_1 plate ~995 ms 8 (L+R) 4 8 16 yes no
rev_pl_2 plate ~634 ms 8 (L+R) 4 8 16 yes no
rev_pl_3 plate ~384 ms 8 (L+R) 4 8 16 yes no
rev_rt_d_f room ~996 ms 8 (L+R) 4 0 6 yes no
rom_rev2 room ~942 ms 8 (L+R) 8 (paired) 4 16 yes yes
All delay times calculated at FV-1 default sample rate of 32768 Hz.
Last edited: