Ribbon Shimmer — User Guide

Exponentially spaced feed-forward shimmer taps with polarity texture, deterministic timing jitter, high-frequency sparkle and true wet/dry mixing.

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

What this does

Ribbon Shimmer creates a dense shimmer field from a feed-forward bank of delayed copies of the source. Delay times are exponentially distributed between a minimum and maximum delay, small deterministic jitter prevents a perfectly regular pattern, selected taps invert polarity, and a first-difference term adds high-frequency sparkle.

Architecture: this is a tapped-delay bank, not a recursive feedback loop. Every shimmer tap reads from the source channel. The wet signal is built separately and then crossfaded with the dry path.

The output keeps the source sample rate and channel count, appends a silent tail, and applies a cosine fade only inside that added tail. Stereo receives separate left/right tap plans; other channel counts use the same left/mono plan on each channel.

Quick start

  1. Select exactly one Sound object.
  2. Run Ribbon_Shimmer.praat.
  3. Choose a preset or Custom.
  4. Set Wet_dry_percent: 0 = dry only, 100 = shimmer taps only.
  5. Optionally enable visualization and playback, then click OK.
The output duration is source duration + tail duration. Even at 0% wet, the output therefore includes the requested silent tail.

Presets

PresetTailDelaysBase ampDelay rangeDecaySparkleFade
Subtle0.3 s500.1612–800 ms0.9650.200.8 s*
Medium0.5 s720.2415–1350 ms0.9550.251.0 s*
Heavy0.8 s900.3012–1800 ms0.9450.301.4 s*
Extreme1.2 s1000.3810–2500 ms0.9350.351.8 s*

*The effective fade is capped to the tail duration, so it cannot attenuate the source region.

Presets override the effect and fade parameters above; Wet_dry_percent, visualization and playback remain user-controlled.

Parameters

ParameterDefaultMeaning
Tail_duration_s0.5Silent extension appended before rendering the shimmer.
Number_of_delays48Number of feed-forward taps. Internally rounded and kept at least 1.
Base_amplitude0.24Starting tap coefficient; internally limited to 0…0.99.
Min_delay_s / Max_delay_s0.015 / 1.35Bounds for the exponential delay distribution. Bounds are reordered if entered backwards and kept at least two samples.
Decay_factor0.955Tap amplitude multiplier: base × decay^k; internally limited to 0…1.
Sparkle_amount0.25Amount of one-sample first-difference enhancement added to each delayed tap; internally limited to 0…2.
Wet_dry_percent60Linear dry/effect crossfade, clamped to 0…100%.
Fadeout_duration_s1.0Cosine fade length, capped to the appended tail.

Tap plan and processing

u = k / N nominal_delay[k] = minD × (maxD/minD)^u left_delay[k] = nominal_delay[k] + jitter, jitter ∈ [-3, +3] ms left_amp[k] = base × decay^k

Every third left tap is polarity-inverted. For stereo, the right plan is decorrelated: its delay bounds, base amplitude, decay and sparkle are slightly different; right jitter is ±2 ms and every fourth right tap is inverted.

The internal random seed is fixed at 20260814. Therefore the tap plan is reproducible for the same settings, and Praat's global RNG is returned to unpredictable operation afterwards.

High-frequency sparkle uses a one-sample difference of the delayed source: it emphasizes rapid changes without introducing a separate filter stage.

Channels, duration and level

At 0% wet the signal content is dry only, but the final 0.98 ceiling can still attenuate a source whose peak already exceeds 0.98.

Visualization

The display shows the dry waveform, the full shimmer output including the tail, the realized left/mono tap map, and a summary strip. The tap map uses the same deterministic jittered delays and polarities used for rendering, so it is a QC view of the actual plan rather than an idealized curve.

The waveform panels use a fixed -1…+1 amplitude range, making source/output level changes directly visible.

Output

Object name: <source>_ribbon_<Custom|Subtle|Medium|Heavy|Extreme>.

The result object remains selected and is played when Play_result is enabled.