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.

Author: Shai Cohen Affiliation: Department of Music, Bar‑Ilan University, Israel Version: 0.2 (2025) – Stereo, wet/dry mix, visualisation License: MIT License Repo: GitHub
Contents:

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.

Key features v0.2:
  • 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

  1. In Praat, select exactly one Sound object (mono or stereo).
  2. Run script…Harmonic_Decay_Reverb.praat.
  3. Choose a Preset:
    • Subtle Harmonic, Medium Harmonic, Heavy Harmonic, Extreme Harmonic
  4. For custom mode (preset = Custom), adjust parameters as desired.
  5. Set Wet_dry_percent (0 = dry only, 100 = wet only).
  6. 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.
Tip: Start with Medium Harmonic (48 echoes, spread 1.2) to hear the characteristic “harmonic spread” effect. For a more subtle texture, use Subtle (30 echoes, spread 1.4). For extreme cavernous reverb, try Extreme (100 echoes, spread 0.8).
Important: This reverb is implemented entirely in Praat – no Python required. It uses the 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)

PresetEchoesBase (ms)SpreadDecayDescription
Subtle Harmonic30401.40.94Light, gentle harmonic wash.
Medium Harmonic48501.20.92Balanced, clear harmonic decay.
Heavy Harmonic70601.00.90Dense, prominent reverb tail.
Extreme Harmonic100800.80.88Cavernous, 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

ParameterRangeDefaultDescription
Tail_duration_sany positive1.5 sLength of silent tail added after the original sound (allows echoes to ring out).
Number_of_echoesinteger ≥148How many discrete echoes to generate.
Base_delay_sany positive0.05 s (50 ms)Delay of the first echo.

Harmonic spacing

ParameterRangeDefaultDescription
Harmonic_spreadany positive1.2Controls echo spacing. Lower = more compressed (denser early, sparse late). Higher = more linear spacing.

Amplitude

ParameterRangeDefaultDescription
Decay_factor0–10.92Multiplicative decay per echo (e.g., 0.9 = -0.92 dB per echo).
Amplitude_mean0–10.25Mean amplitude of the first echo (after decay factor).
Amplitude_stddev0–10.08Standard deviation of Gaussian amplitude variation (adds organic randomness).

Fadeout

ParameterRangeDefaultDescription
Fadeout_duration_sany positive1.0 sCosine fade‑out applied at the end of the tail to avoid clicks.

Mix

ParameterRangeDefaultDescription
Wet_dry_percent0–100600 = dry only, 100 = wet only.

Visualization (Praat picture)

When Draw_visualization = 1, the script draws:

Tip: The delay pattern plot gives an immediate visual of the reverb’s structure. Notice how echoes become sparser as delay increases (especially with spread < 1). The vertical scatter around the decay envelope shows the effect of amplitude randomness.
Example echo table (first 10 of 48):
 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

Output is silent / no reverb heard

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.

Clipping / distortion

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.

Stereo image sounds mono / narrow

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)).

Computational complexity

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).

Understanding harmonic_spread

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.