Spectral Smearing Reverb — v0.2 User Guide

Frequency‑dependent delays simulating acoustic dispersion. Lower frequencies get longer delays (bass “hangs”), higher frequencies shorter. Uses an inverse‑square‑root dispersion model with a Lorentzian frequency response (peak around 600 Hz) and cosine modulation for textural richness.

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

What this does

Spectral Smearing Reverb creates a reverb where the delay time depends on frequency. Low frequencies are delayed more, high frequencies less – mimicking the dispersive behaviour of acoustic materials (e.g., sound travelling through a plate or a room with frequency‑dependent propagation speed). The effect is built from a bank of frequency bands (default 20), each with its own delay, amplitude (shaped by a Lorentzian curve peaking around 600 Hz), and a slow cosine modulation for evolving texture.

Key features v0.2:
  • Inverse‑sqrt dispersion: delay(f) ∝ 1/√f (bass hangs longer).
  • Lorentzian frequency response: gain peaks at a user‑controlled centre frequency (default 600 Hz).
  • Per‑band cosine modulation (0.3 + 0.7·cos(2π·f_mod·t)) for evolving, non‑static texture.
  • Stereo decorrelation: right channel uses slightly different parameters (base frequency, stretch, peak).
  • Wet/dry mix control and visualisation of dispersion curve and Lorentzian response.

Quick start

  1. In Praat, select exactly one Sound object (mono or stereo).
  2. Run script…Spectral_Smearing_Reverb.praat.
  3. Choose a Preset:
    • Subtle Smear, Medium Smear, Heavy Smear, Extreme Smear
  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 adds a silent tail, processes each frequency band with its own delay and modulation, applies wet/dry mix and fadeout, and imports the result as originalname_smear_preset.
Tip: Start with Medium Smear (20 bands, stretch 0.6) to hear the characteristic frequency‑dependent smear. For a more pronounced effect, try Heavy or Extreme. The visualisation shows both the dispersion curve and the Lorentzian gain shape.
Important: This reverb is implemented entirely in Praat – no Python required. It uses the Formula command to add delayed, modulated copies of the signal. For many bands (e.g., 45) on long files, processing can be slow; the script scales the signal every 10 bands to prevent overload.

The 4 presets (+ Custom)

PresetBandsStretchBase ampPeak freqDescription
Subtle Smear120.40.20600 HzLight, gentle smearing.
Medium Smear200.60.35600 HzBalanced, clear smearing.
Heavy Smear300.850.50600 HzDense, prominent smear.
Extreme Smear451.20.65600 HzExtreme, cavernous smear.

Each preset also sets response_width_Hz = 800 and fadeout_duration_s appropriately.

The physics model

📐 Dispersion (delay vs. frequency)

delay(f) = time_stretch × 1 / √(f / f_base)

where f_base = 80 Hz (the lowest band).

  • Lower frequencies → longer delay (bass “hangs”).
  • Higher frequencies → shorter delay.
  • This approximates the dispersive behaviour of plates and certain acoustic materials.

📐 Lorentzian frequency response (gain)

gain(f) = 1 / [1 + ((f – f_peak) / width)²]

This bell‑shaped curve peaks at f_peak (default 600 Hz) and rolls off symmetrically. The gain determines how much each band contributes to the overall smear.

📐 Cosine modulation (time‑varying texture)

mod(t) = 0.3 + 0.7·cos(2π·f_mod·t)

where f_mod = centre_freq / 15. This creates a slow, evolving amplitude ripple that prevents the reverb from sounding static.

The right channel uses slightly different parameters:

This decorrelates the left and right signals, creating a wide, immersive stereo image.

Parameters & defaults

Smearing parameters

ParameterRangeDefaultDescription
Tail_duration_sany positive1.5 sLength of silent tail added after the original sound (allows smears to ring out).
Frequency_bandsinteger ≥120Number of discrete frequency bands (each gets its own delay and modulation).
Time_stretchany positive0.6Multiplier for the dispersion delay. Higher = longer delays.
Base_amplitude0–10.35Base amplitude for the bands (further shaped by Lorentzian response).

Frequency response

ParameterRangeDefaultDescription
Peak_frequency_Hzany positive600 HzCentre frequency of the Lorentzian peak (where the smear is strongest).
Response_width_Hzany positive800 HzWidth of the Lorentzian curve (larger = broader peak).

Mix & output

ParameterRangeDefaultDescription
Wet_dry_percent0–100600 = dry only, 100 = wet only.
Fadeout_duration_sany positive1.2 sCosine fade‑out applied at the end of the tail to avoid clicks.
Draw_visualizationyes/noyesShow waveforms, dispersion curve, Lorentzian response, and summary.
Play_resultyes/noyesAuto‑play after processing.

Visualization (Praat picture)

When Draw_visualization = 1, the script draws:

Tip: The two plots give a complete picture of the smearing engine. The dispersion curve shows how delays increase as frequency decreases. The Lorentzian response shows which frequencies are emphasised (near 600 Hz). Together, they explain the character of the reverb.

FAQ / troubleshooting

Output is silent / no smear heard

Check that Wet_dry_percent is not 0. Also verify that Frequency_bands is ≥5 and Base_amplitude is not too low. The script prints the first few band frequencies and delays in the Info window – if they seem reasonable, the effect should be audible.

Processing is slow

Each band adds a Formula pass. For 45 bands on a long file, this can be slow. Reduce Frequency_bands for faster preview. The script scales the signal every 10 bands to prevent overload, but this doesn't speed it up.

Modulation sounds too obvious / “wobbly”

The cosine modulation is applied per band with a frequency proportional to the band’s centre frequency. If it sounds too pronounced, reduce the modulation depth by editing the script: change 0.3 + 0.7*cos(...) to 0.5 + 0.5*cos(...) or even 0.8 + 0.2*cos(...).

Understanding the dispersion formula

The inverse‑sqrt law delay ∝ 1/√f is chosen because it produces a strong bass‑hang effect without being extreme. At 80 Hz, delay = time_stretch × 1.0; at 640 Hz, delay = time_stretch × 0.35; at 2560 Hz, delay = time_stretch × 0.18. This means bass frequencies decay much more slowly than highs, creating a warm, evolving tail.

Stereo decorrelation

The right channel uses slightly different base frequencies and stretch factors to ensure the left and right smears are not identical. This creates a wider, more immersive image. If you need a narrower image, you can reduce the differences in the script.