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.
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.
- 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
- In Praat, select exactly one Sound object (mono or stereo).
- Run script… →
Ribbon_Shimmer.praat. - Choose a Preset:
- Subtle Ribbon, Medium Ribbon, Heavy Ribbon, Extreme Ribbon
- 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, generates exponentially‑spaced echoes with HF sparkle,
applies wet/dry mix and fadeout, and imports the result as
originalname_ribbon_preset.
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)
| Preset | Delays | Range (ms) | Decay | Sparkle | Description |
|---|---|---|---|---|---|
| Subtle Ribbon | 50 | 12–800 | 0.965 | 0.20 | Light, gentle shimmer. |
| Medium Ribbon | 95 | 15–1350 | 0.955 | 0.25 | Balanced, clear ribbon effect. |
| Heavy Ribbon | 140 | 12–1800 | 0.945 | 0.30 | Dense, prominent tail. |
| Extreme Ribbon | 200 | 10–2500 | 0.935 | 0.35 | Extreme, 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_delaydetermines 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
| Parameter | Range | Default | Description |
|---|---|---|---|
| Tail_duration_s | any positive | 0.5 s | Length of silent tail added after the original sound (allows echoes to ring out). |
| Number_of_delays | integer ≥1 | 95 | How many discrete echoes to generate. |
| Base_amplitude | 0–1 | 0.24 | Amplitude of the first echo. |
| Min_delay_s | any positive | 0.015 s (15 ms) | Delay of the first echo. |
| Max_delay_s | any positive | 1.35 s | Delay of the last echo. |
| Decay_factor | 0–1 | 0.955 | Multiplicative decay per echo (applied after base_amplitude). |
| Sparkle_amount | 0–1 | 0.25 | Strength of high‑frequency boost (differentiator). |
Mix & output
| Parameter | Range | Default | Description |
|---|---|---|---|
| Wet_dry_percent | 0–100 | 60 | 0 = dry only, 100 = wet only. |
| Fadeout_duration_s | any positive | 1.0 s | Cosine fade‑out applied at the end of the tail to avoid clicks. |
| Draw_visualization | yes/no | yes | Show waveforms, delay pattern, and summary in Praat picture. |
| 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.
- Exponential delay pattern – a scatter plot of echo impulses:
- X‑axis = delay time in milliseconds (exponential spacing visible).
- Y‑axis = amplitude (positive and negative for polarity).
- Positive polarity echoes are blue, negative polarity echoes are red.
- A dotted grey line shows the theoretical decay envelope (
base_amplitude × decay_factor^k).
- Parameter summary – number of delays, range, decay factor, sparkle amount.
FAQ / troubleshooting
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).
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.
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.
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.
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.