Ribbon Shimmer — v0.2 User Guide

Lush reverb effect with exponentially‑spaced delays and high‑frequency enhancement. Delay times follow: delay[k] = min_delay × (max_delay / min_delay)^(k/N), creating dense early reflections that thin out over time. HF sparkle via differentiation adds “air”. Polarity alternation creates rich phase texture.

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

Ribbon Shimmer creates a lush, ribbon‑like reverb by generating a dense series of echoes with exponential delay spacing – delays grow exponentially from a minimum to a maximum, creating a natural‑sounding build‑up of reflections. Each echo is multiplied by a decaying amplitude (decay_factor^k) and polarity alternates every 3 echoes to create phase‑based movement. ✨ Sparkle is added via a simple high‑pass‑like FIR filter: y = x + sparkle * (x – x[n-1]), boosting the high frequencies of each echo.

Key features v0.2:
  • Exponential delay progression – creates a dense, evolving tail.
  • Polarity alternation (every 3 echoes) – adds phase‑based width.
  • HF sparkle – emphasises transients, adding “air” and shimmer.
  • Left/right decorrelation – right channel uses slightly different parameters for wide stereo image.
  • Wet/dry mix control and visualisation of the exponential delay pattern.

Quick start

  1. In Praat, select exactly one Sound object (mono or stereo).
  2. Run script…Ribbon_Shimmer.praat.
  3. Choose a Preset:
    • Subtle Ribbon, Medium Ribbon, Heavy Ribbon, Extreme Ribbon
  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, generates exponentially‑spaced echoes with HF sparkle, applies wet/dry mix and fadeout, and imports the result as originalname_ribbon_preset.
Tip: Start with Medium Ribbon (95 delays, range 15–1350 ms, decay 0.955) to hear the characteristic ribbon effect. For a more subtle texture, use Subtle (50 delays, range 12–800 ms, decay 0.965). The visualisation shows the exponential spacing.
Important: This effect is implemented entirely in Praat – no Python required. It uses the Formula command to add delayed copies of the signal. For many delays (e.g., 200) on long files, processing can be slow; the script scales the signal every 20 delays to prevent overload.

The 4 presets (+ Custom)

PresetDelaysRange (ms)DecaySparkleDescription
Subtle Ribbon5012–8000.9650.20Light, gentle shimmer.
Medium Ribbon9515–13500.9550.25Balanced, clear ribbon effect.
Heavy Ribbon14012–18000.9450.30Dense, prominent tail.
Extreme Ribbon20010–25000.9350.35Extreme, cavernous shimmer.

The exponential delay law

📐 Delay law

delay[k] = min_delay × (max_delay / min_delay)^(k / number_of_delays)

where k = 1, 2, …, number_of_delays.

  • min_delay – delay of the first echo.
  • max_delay – delay of the last echo.
  • The ratio max_delay / min_delay determines how much the delays spread out.

This produces a dense cluster of early reflections that gradually become sparser – mimicking natural room acoustics where early reflections are dense and late reflections are sparse.

📐 Amplitude law

amp[k] = base_amplitude × decay_factor^k × (±1 polarity)

Polarity flips every 3 echoes (for the left channel) to create phase‑based movement. The right channel flips every 4 echoes for decorrelation.

📐 HF sparkle

Each echo is processed with: y = x + sparkle × (x – x[n-1])

This finite‑difference filter emphasises changes between samples – i.e., high frequencies. At 44.1 kHz, this gives a gentle boost starting around 5 kHz. The sparkle_amount parameter controls the strength.

Parameters & defaults

Ribbon parameters

ParameterRangeDefaultDescription
Tail_duration_sany positive0.5 sLength of silent tail added after the original sound (allows echoes to ring out).
Number_of_delaysinteger ≥195How many discrete echoes to generate.
Base_amplitude0–10.24Amplitude of the first echo.
Min_delay_sany positive0.015 s (15 ms)Delay of the first echo.
Max_delay_sany positive1.35 sDelay of the last echo.
Decay_factor0–10.955Multiplicative decay per echo (applied after base_amplitude).
Sparkle_amount0–10.25Strength of high‑frequency boost (differentiator).

Mix & output

ParameterRangeDefaultDescription
Wet_dry_percent0–100600 = dry only, 100 = wet only.
Fadeout_duration_sany positive1.0 sCosine fade‑out applied at the end of the tail to avoid clicks.
Draw_visualizationyes/noyesShow waveforms, delay pattern, and summary in Praat picture.
Play_resultyes/noyesAuto‑play after processing.

Visualization (Praat picture)

When Draw_visualization = 1, the script draws:

Tip: The delay pattern plot clearly shows the exponential spacing: echoes start dense (left side) and become sparser as delay increases. The alternating polarity (blue/red) adds phase texture.

FAQ / troubleshooting

Processing is very slow

Each delay adds a Formula pass. For 200 delays on a long file, this can be slow. Reduce Number_of_delays for faster preview, or use the Subtle preset (50 delays).

Output is silent / no shimmer heard

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

Sparkle sounds harsh / causes clipping

The sparkle is a simple differentiator. If it causes clipping, reduce Sparkle_amount (e.g., to 0.1). The script scales the signal after each sparkle pass to prevent runaway amplification.

Right channel differences

To create a wide stereo image, the right channel uses:

  • Min delay ×1.13, max delay ×0.98
  • Base amplitude ×0.96, decay factor –0.005
  • Sparkle amount ×0.8
  • Polarity alternation every 4 echoes (instead of 3)

This ensures left and right are decorrelated without sounding obviously different.

Understanding the exponential law

With min_delay = 15 ms, max_delay = 1350 ms, and 95 delays, the ratio max/min = 90. The k‑th delay is 15 × 90^(k/95). This means delays increase slowly at first (many early reflections) and faster later (fewer late reflections) – exactly what happens in a real room.