Spectral Echo Cascade — User Guide

A recursive Fibonacci-timed echo processor. Each cascade level adds time-varying feedback at a Fibonacci-derived delay, with progressively changing delay times, exponential level weighting, an optional fixed-millisecond timing mode, and an appended silence tail for the recursive echoes.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.4.1 (2026) License: MIT License Repo: GitHub

What this does

Spectral Echo Cascade converts the selected Sound to a mono processing copy, appends a silent tail, and applies a sequence of recursive feedback-delay passes. The delay of each pass follows a Fibonacci-derived progression, while the feedback gain is modulated over time by the Echo Shimmer controls.

selected Sound → mono processing copy → append silence tail → Level 1 recursive delay → Level 2 recursive delay → ... → Level N recursive delay → target peak scaling

The processor works in the time domain. Echo Shimmer is a cosine modulation of the feedback gain across the output timeline.

Each cascade level processes the result of the previous level, so the transformations accumulate. Within a level, delayed samples feed recursively into later output samples.

Quick start

  1. Select exactly one Sound object.
  2. Run Spectral_Echo_Cascade.praat.
  3. Choose Default, Gentle Echoes, Dense Cluster, Long Tails, or Custom.
  4. Set the number of cascade levels, decay rate and delay base.
  5. Leave Use_fixed_ms off for duration-relative delays, or enable it to anchor Level 1 to an absolute millisecond value.
  6. Adjust Shimmer center/depth and the silence-tail duration.
  7. Run. The result is named <source>_fibonacci_echo.

Recursive feedback structure

At one cascade level, let D be the delay in samples and let g[n] be the time-varying feedback coefficient. The Formula behaves as:

for n < D: y[n] = x[n] for n ≥ D: y[n] = x[n] + y[n-D] × g[n]

The delayed term uses a sample that has already been processed earlier in the same left-to-right Formula pass. A single level therefore produces a recursive sequence of repeats at multiples of its delay rather than adding only one isolated delayed copy.

After a level is complete, the next level runs on that already-processed Sound. The full processor is therefore a cascade of recursive, time-varying feedback delays.

Fibonacci delay progression

The values used by the current cascade are:

1, 2, 3, 5, 8, 13, 21, 34, …

The repeated initial 1 of the conventional Fibonacci listing is not used as a separate second level. Each successive cascade level therefore receives the next value in the progression above.

Duration-relative mode — default

With Use_fixed_ms = off:

delaySamples(level) = round( originalSourceSamples / (Delay_base + Fibonacci(level)) ) delaySeconds(level) ≈ originalSourceDuration / (Delay_base + Fibonacci(level))

The calculation uses the original source length before the silence tail is appended. Changing Tail_duration_s therefore changes how long echoes are allowed to continue, but does not change their delay times.

Because the denominator grows through the cascade, later levels normally use shorter delays.

Fixed-millisecond mode

With Use_fixed_ms = on, Level 1 is anchored to Fixed_base_ms. Later levels preserve the same Fibonacci/base timing ratios:

delay(level) = Fixed_base_ms × (Delay_base + 1) / (Delay_base + Fibonacci(level))

At Level 1, Fibonacci=1, so the ratio is exactly 1 and the requested fixed base time is used.

Duration-relative mode scales with the source file. Fixed-ms mode keeps the delay pattern anchored to absolute time.

Echo Shimmer

The feedback gain at cascade level L is modulated across the complete source-plus-tail output:

shimmer[n] = Shimmer_center + Shimmer_depth × cos( L × 2π × n / totalOutputSamples )

Level 1 completes approximately one cosine cycle across the output, Level 2 completes two, Level 3 three, and so on. The modulation therefore becomes faster at higher cascade levels.

ParameterRole
Shimmer_centerBaseline around which the feedback gain moves.
Shimmer_depthAmount of temporal feedback-gain variation.

If Shimmer_depth exceeds Shimmer_center, the modulation can pass below zero during part of its cycle, reversing the polarity of the recursive echo contribution during those regions.

Decay & feedback safety

Before shimmer modulation, each level receives an exponential weighting:

levelDecay = Decay_rate ^ level

With the built-in presets, Decay_rate is below 1, so later cascade levels receive progressively smaller base feedback coefficients.

Effective recursive coefficient

g[n] = levelDecay × feedbackSafety × shimmer[n]

For custom settings, the script estimates the maximum possible feedback magnitude from:

maxFeedback = levelDecay × (Shimmer_center + Shimmer_depth)

If that value reaches or exceeds 0.98, an internal safety multiplier reduces the level so the maximum coefficient is capped at approximately 0.98.

This stability scaling is internal. It does not change the values shown in the form; when it is activated, the Info window reports the applied scaling for that cascade level.

Silence tail & output duration

Before the cascade begins, the script creates a mono silence Sound of Tail_duration_s and concatenates it after the source. Recursive echoes can therefore continue into this region after the original material ends.

outputDuration ≈ sourceDuration + Tail_duration_s

The feedback process is bounded by this fixed output duration. Echo energy that would continue beyond the end of the appended tail is not rendered.

Presets

PresetLevelsDecayDelay baseShimmer centerShimmer depthTail
Default60.7550.500.502.0 s
Gentle Echoes40.8570.450.353.0 s
Dense Cluster80.7040.550.651.5 s
Long Tails70.9090.500.404.0 s

Named presets overwrite the values shown in this table. They do not change Use_fixed_ms, Fixed_base_ms, Scale_peak, Draw_visualization, or Play_result.

Parameters & effective limits

ParameterDefaultExact role
PresetDefaultDefault, Gentle Echoes, Dense Cluster, Long Tails, or Custom.
Cascade_levels6Number of recursive delay passes; internally limited to a maximum of 40.
Decay_rate0.75Positive exponential base used as Decay_rate^level.
Delay_base5Positive denominator offset in both delay-timing modes.
Use_fixed_msOffChoose absolute fixed-base timing instead of source-duration-relative timing.
Fixed_base_ms800 msLevel-1 delay when fixed-ms mode is active.
Shimmer_center0.5Positive baseline for the time-varying feedback multiplier.
Shimmer_depth0.5Positive cosine-modulation depth.
Scale_peak0.88Final target Sinc70 peak; must be ≤1.
Tail_duration_s2.0 sLength of appended silence available for recursive echo decay.
Draw_visualizationOnDraw source/output waveforms, delay structure, decay curve and summary.
Play_resultOnPlay the finished result.

Channel handling

The DSP itself is mono. A multichannel input is converted to mono before the tail and echo cascade are created. A mono input is copied directly to the private processing Sound.

The original Sound object remains unchanged. The generated _fibonacci_echo result is mono, so the input's original stereo or multichannel image is not preserved in the processed output.

Final peak scaling

After all cascade levels have been processed, the script measures the output with Praat's Sinc70 absolute extremum. For a non-silent result it applies:

Scale peak: Scale_peak

This is target peak normalization. With the default Scale_peak = 0.88, a non-zero result can be amplified or attenuated to reach that target.

Digital silence is left untouched. The script rejects Scale_peak values above 1.

Visualization

The v0.4.1 Picture view contains four main views plus a summary band:

  1. Original waveform — the selected source Sound.
  2. Echo waveform — the mono processed result, including its tail.
  3. Fibonacci delay structure — one bar per cascade level, bar height = actual delay in milliseconds, label = Fibonacci value used at that level.
  4. Decay curveDecay_rate^level for every cascade level.
  5. Summary band — level count, decay rate, final Fibonacci value and tail duration.

Waveform scale

Source and Echo use the same amplitude scale, derived from the larger Sinc70 peak with 5% headroom. Their displayed heights are therefore directly comparable.

Tail marker

A dotted vertical line at the original source duration marks where the appended silence tail begins.

Delay bars

The bar height is the actual calculated delay in milliseconds. The number above each bar is the Fibonacci value used by that level. Bar color varies with the stored level-decay value.

The visualization summarizes delay timing and exponential level decay. The time-varying shimmer LFO itself is not drawn as a separate curve.

Output behavior