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.
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.
- 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
- In Praat, select exactly one Sound object (mono or stereo).
- Run script… →
Spectral_Smearing_Reverb.praat. - Choose a Preset:
- Subtle Smear, Medium Smear, Heavy Smear, Extreme Smear
- For custom mode (preset = Custom), adjust parameters as desired.
- Set Wet_dry_percent (0 = dry only, 100 = wet only).
- 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.
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)
| Preset | Bands | Stretch | Base amp | Peak freq | Description |
|---|---|---|---|---|---|
| Subtle Smear | 12 | 0.4 | 0.20 | 600 Hz | Light, gentle smearing. |
| Medium Smear | 20 | 0.6 | 0.35 | 600 Hz | Balanced, clear smearing. |
| Heavy Smear | 30 | 0.85 | 0.50 | 600 Hz | Dense, prominent smear. |
| Extreme Smear | 45 | 1.2 | 0.65 | 600 Hz | Extreme, 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:
- Base frequency ≈ 85 Hz (instead of 80 Hz)
- Stretch scaled by 0.92
- Peak frequency shifted by +50 Hz
- Width reduced by 50 Hz
- Modulation frequency centre_freq / 18
This decorrelates the left and right signals, creating a wide, immersive stereo image.
Parameters & defaults
Smearing parameters
| Parameter | Range | Default | Description |
|---|---|---|---|
| Tail_duration_s | any positive | 1.5 s | Length of silent tail added after the original sound (allows smears to ring out). |
| Frequency_bands | integer ≥1 | 20 | Number of discrete frequency bands (each gets its own delay and modulation). |
| Time_stretch | any positive | 0.6 | Multiplier for the dispersion delay. Higher = longer delays. |
| Base_amplitude | 0–1 | 0.35 | Base amplitude for the bands (further shaped by Lorentzian response). |
Frequency response
| Parameter | Range | Default | Description |
|---|---|---|---|
| Peak_frequency_Hz | any positive | 600 Hz | Centre frequency of the Lorentzian peak (where the smear is strongest). |
| Response_width_Hz | any positive | 800 Hz | Width of the Lorentzian curve (larger = broader peak). |
Mix & output
| Parameter | Range | Default | Description |
|---|---|---|---|
| Wet_dry_percent | 0–100 | 60 | 0 = dry only, 100 = wet only. |
| Fadeout_duration_s | any positive | 1.2 s | Cosine fade‑out applied at the end of the tail to avoid clicks. |
| Draw_visualization | yes/no | yes | Show waveforms, dispersion curve, Lorentzian response, and summary. |
| Play_result | yes/no | yes | Auto‑play after processing. |
Visualization (Praat picture)
When Draw_visualization = 1, the script draws:
- Original waveform (grey).
- Result waveform (purple) with wet/dry percentage.
- Dispersion curve (left panel) – delay (ms) vs. frequency (kHz). The blue line shows the theoretical
1/√flaw, with dots marking the actual frequency bands. - Lorentzian frequency response (right panel) – gain vs. frequency. The pink line shows the Lorentzian curve, with a vertical dashed line at the peak frequency. Dots mark the actual band gains.
- Parameter summary – band count, frequency range, stretch, peak frequency.
FAQ / troubleshooting
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.
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.
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(...).
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.
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.