Harmonic Decay Reverb — v0.2 User Guide
Creates echoes at harmonically‑related delay times using power‑law spacing.
Delay times follow delay[k] = base × k^(1/spread), creating dense early reflections
that spread out over time – similar to natural room mode decay. Amplitude decays exponentially
with random variation for organic texture.
What this does
Harmonic Decay Reverb is a reverb that generates echoes with a harmonic relationship.
Unlike conventional reverb (convolution, feedback delay networks), this engine creates a series of discrete
echoes whose delay times follow a power law: delay[k] = base_delay × k^(1/spread).
This produces a dense cluster of early reflections that gradually spread apart – mimicking the
mode distribution of a physical room, where low‑frequency modes are sparse and high‑frequency modes dense.
- Proper stereo processing with slight decorrelation between channels
- Wet/dry mix control (0–100 %)
- Visualisation of echo impulses (delay vs. amplitude) with exponential decay envelope
- Four presets: Subtle, Medium, Heavy, Extreme
- Gaussian amplitude variation for organic texture
- Cosine fadeout to avoid clicks
Quick start
- In Praat, select exactly one Sound object (mono or stereo).
- Run script… →
Harmonic_Decay_Reverb.praat. - Choose a Preset:
- Subtle Harmonic, Medium Harmonic, Heavy Harmonic, Extreme Harmonic
- For custom mode (preset = Custom), adjust parameters as desired.
- Set Wet_dry_percent (0 = dry only, 100 = wet only).
- Click OK. The script concatenates a silent tail, adds harmonically spaced echoes, applies wet/dry mix and fadeout, and imports the result as
originalname_harmonic_preset.
Formula command to add delayed copies of the signal. For stereo input,
left and right channels are processed separately with slightly different random amplitudes and delays
to create a wide, decorrelated stereo image.
The 4 presets (+ Custom)
| Preset | Echoes | Base (ms) | Spread | Decay | Description |
|---|---|---|---|---|---|
| Subtle Harmonic | 30 | 40 | 1.4 | 0.94 | Light, gentle harmonic wash. |
| Medium Harmonic | 48 | 50 | 1.2 | 0.92 | Balanced, clear harmonic decay. |
| Heavy Harmonic | 70 | 60 | 1.0 | 0.90 | Dense, prominent reverb tail. |
| Extreme Harmonic | 100 | 80 | 0.8 | 0.88 | Cavernous, extreme spread. |
Each preset also sets amplitude_mean, amplitude_stddev, and fadeout_duration_s appropriately.
The harmonic decay formula
📐 Delay law
delay[k] = base_delay × k^(1 / harmonic_spread)
where k = 1, 2, …, number_of_echoes.
- base_delay – delay of the first echo (k=1).
- harmonic_spread – exponent denominator. Lower values = more compressed spacing (echoes pile up faster). Higher values = stretched spacing (echoes remain sparse).
Physical meaning: In a room, modal frequencies are approximately harmonic, but their density increases with frequency. This law mimics that behaviour in the time domain: early echoes are dense (closely spaced), later echoes become sparser.
📐 Amplitude law
amp[k] = (decay_factor^k) × randomGauss(amplitude_mean, amplitude_stddev)
with clipping to ensure positive amplitudes.
- decay_factor – exponential decay per echo (0.88–0.94 typical).
- amplitude_mean/stddev – Gaussian variation gives each echo a slightly different amplitude, creating a more organic, non‑periodic texture.
For stereo processing, the right channel gets slightly different random amplitudes and delays (multiplied by 0.98–1.02) to decorrelate the channels and create a wide stereo image.
Parameters & defaults
Reverb parameters
| Parameter | Range | Default | Description |
|---|---|---|---|
| Tail_duration_s | any positive | 1.5 s | Length of silent tail added after the original sound (allows echoes to ring out). |
| Number_of_echoes | integer ≥1 | 48 | How many discrete echoes to generate. |
| Base_delay_s | any positive | 0.05 s (50 ms) | Delay of the first echo. |
Harmonic spacing
| Parameter | Range | Default | Description |
|---|---|---|---|
| Harmonic_spread | any positive | 1.2 | Controls echo spacing. Lower = more compressed (denser early, sparse late). Higher = more linear spacing. |
Amplitude
| Parameter | Range | Default | Description |
|---|---|---|---|
| Decay_factor | 0–1 | 0.92 | Multiplicative decay per echo (e.g., 0.9 = -0.92 dB per echo). |
| Amplitude_mean | 0–1 | 0.25 | Mean amplitude of the first echo (after decay factor). |
| Amplitude_stddev | 0–1 | 0.08 | Standard deviation of Gaussian amplitude variation (adds organic randomness). |
Fadeout
| Parameter | Range | Default | Description |
|---|---|---|---|
| Fadeout_duration_s | any positive | 1.0 s | Cosine fade‑out applied at the end of the tail to avoid clicks. |
Mix
| Parameter | Range | Default | Description |
|---|---|---|---|
| Wet_dry_percent | 0–100 | 60 | 0 = dry only, 100 = wet only. |
Visualization (Praat picture)
When Draw_visualization = 1, the script draws:
- Original waveform (grey).
- Result waveform (purple) with wet/dry percentage shown.
- Harmonic delay pattern – a scatter plot of echo impulses:
- X‑axis = delay time in milliseconds.
- Y‑axis = amplitude.
- Each echo is a coloured circle (colour gradient from purple to blue).
- A dotted grey line shows the theoretical exponential decay envelope (without randomness).
- Parameter summary – echoes, base delay, spread, decay factor.
1: 50 ms (amp=0.213)
2: 78 ms (amp=0.184)
3: 102 ms (amp=0.156)
4: 123 ms (amp=0.129)
5: 142 ms (amp=0.108)
6: 159 ms (amp=0.091)
7: 176 ms (amp=0.073)
8: 191 ms (amp=0.062)
9: 205 ms (amp=0.051)
10: 218 ms (amp=0.043)
FAQ / troubleshooting
Check that Wet_dry_percent is not 0. Also verify that Number_of_echoes is large enough (≥10) and Amplitude_mean is not too low. The script prints the first 10 echo delays/amplitudes in the Info window – if amplitudes are near zero, increase amplitude_mean or decay_factor.
The script applies a final Scale peak: 0.95 to the output. If you still hear clipping, reduce the input level before processing, or lower Amplitude_mean and Wet_dry_percent.
For stereo input, the right channel uses slightly different random amplitudes and delays (delay × randomUniform(0.98,1.02)). If you want even wider separation, you could increase this randomisation range in the script (search for randomUniform(0.98, 1.02)).
The reverb is implemented as a series of Formula commands – one per echo. For 100 echoes on a long file, this can be slow. The script prints progress; be patient. For faster preview, use the Subtle preset (30 echoes).
The delay law delay = base × k^(1/spread) means:
- If spread = 1.0, delays increase linearly with k (50, 100, 150, …).
- If spread > 1.0, delays increase slower (sublinear) – early echoes are denser, later echoes spread out less.
- If spread < 1.0, delays increase faster (superlinear) – echoes become very sparse quickly.
Natural room modes tend to have spread ≈ 1.0–1.5.