Harmonic Decay Reverb — User Guide

Power-law recursive echo field with tail fitting, stochastic decay, stereo decorrelation, true reflections-only wet mixing, and an explicit echo-map visualization.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.6.1 (2026) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

Harmonic Decay Reverb creates a reverb-like field from a bank of recursive delays. The nominal delay sequence follows a power law:

delay[k] = Base_delay × k^(1 / Harmonic_spread)

Higher Harmonic_spread compresses the delay pattern; lower values spread later echoes farther apart. If the raw pattern would exceed the available tail, the entire curve is rescaled so the last echo fits at 95% of the tail. Gains decrease by Decay_factor^k and are multiplied by Gaussian random variation.

Quick start

  1. Select exactly one Sound.
  2. Run Harmonic_Decay_Reverb.praat.
  3. Choose a preset or Custom.
  4. Use Harmonic_spread for the temporal spacing curve and Decay_factor for the iteration-dependent gain envelope.
  5. Set Wet_dry_percent; 100% returns the reflection component without the embedded dry signal.
  6. Run the script. The result is named original_harmonic_Preset.

Presets

PresetTailEchoesBase delaySpreadDecayAmp mean ± SDFade
Subtle Harmonic1.0 s300.04 s1.40.940.18 ± 0.050.8 s
Medium Harmonic1.5 s480.05 s1.20.920.25 ± 0.081.0 s
Heavy Harmonic2.0 s700.06 s1.00.900.32 ± 0.101.4 s
Extreme Harmonic3.0 s1000.08 s0.80.880.38 ± 0.121.8 s

Parameters

ParameterDefaultBehavior
Tail_duration_s1.5Silent tail appended before the recursive delay processing.
Number_of_echoes48Number of recursive delay stages.
Base_delay_s0.05Base of the nominal power-law delay sequence.
Harmonic_spread1.2Spacing control; internal exponent is 1/spread.
Decay_factor0.92Per-index exponential amplitude factor.
Amplitude_mean / stddev0.25 / 0.08Gaussian multiplier for each echo stage. Final stage gains are clamped to 0.01–0.99.
Fadeout_duration_s1.0Cosine fade confined to the appended tail.
Wet_dry_percent60Clamped to 0–100; 0 = dry-only, 100 = reflections-only.

Delay and channel engine

Nominal delays are calculated before processing. If the final raw delay would exceed 0.95 × Tail_duration_s, every delay is scaled by the same factor so the full pattern fits the tail. Very small delays are kept at a minimum of two samples.

Each stage is applied as self + amp × self(x-delay). Because self reads the already modified signal, these are recursive delayed additions, not a simple bank of independent feed-forward taps.

Channels

There is no exposed random seed, so the echo amplitudes—and in stereo, the right-channel delay perturbations—change from run to run.

Wet/Dry and level

output = dry × (1 - wet) + (recursiveBuffer - dry) × wet

The last part of the appended tail receives a cosine fade. Peak handling is a safety ceiling only: stereo channels are checked independently before recombination; the shared 3+ channel object is checked as a whole. Quiet results are not boosted.

Output and visualization

The visualization shows the original waveform, the complete result including its tail, and the precomputed nominal echo map (delay versus random gain) together with the mean exponential decay envelope. For stereo output, the plotted echo map corresponds to the left/nominal sequence; the right channel has its own small perturbations.