Fractal Feedback — User Guide

Multi-scale recursive delay processing over nested 2/4/8/... temporal regions, with random region delays and feedback that decreases with layer depth.

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

Fractal Feedback applies delayed recursive additions at several nested temporal resolutions. Layer 1 divides the sound into 2 regions, layer 2 into 4, layer 3 into 8, and so on. Every region receives its own random delay while the feedback coefficient decreases with layer depth.

The result is a self-similar hierarchy of coarse-to-fine delay activity over the original source duration. This is not the same processor as Fractal Feedback Reverb: Fractal Feedback does not append a reverb tail and does not use the chaos-factor / memory-depth delay cycle.

Quick start

  1. Select exactly one Sound.
  2. Run Fractal_Feedback.praat.
  3. Choose a built-in preset or Custom.
  4. Set the number of depth layers, delay range, feedback base and Wet/Dry mix.
  5. Click OK. The processed Sound appears as <source>_fractal_<preset>.

Presets

The built-in presets override Depth_layers, Delay_min_ms, Delay_max_ms, and Feedback_base. Wet/Dry, Scale_peak and output switches remain as shown in the form.

PresetLayersDelay rangeFeedback base
CustomForm valueForm valuesForm value
Subtle Fractal215–80 ms0.40
Medium Fractal320–150 ms0.50
Deep Fractal425–200 ms0.55
Extreme Fractal530–300 ms0.60

Parameters

ControlDefaultBehavior
Depth_layers3Requested number of dyadic layers. Internally limited by sample count and capped at 12.
Delay_min_ms / Delay_max_ms20 / 150 msConverted to at least one sample; Custom bounds are internally ordered if entered in reverse.
Feedback_base0.5Base coefficient. Custom values above 0.99 are capped to 0.99; actual layer coefficient is Feedback_base / layer.
Wet_dry_percent60%Clamped internally to 0–100%.
Scale_peak0.95Target peak applied to every non-silent result.
Draw_visualization / Play_resultyes / yesDraw the structural summary and/or play the output.

Multi-scale structure

For effective depth D, layer L contains 2^L equal-duration regions. The final region at each layer absorbs any integer-division remainder samples.

Layer 1: 2 regions Layer 2: 4 regions Layer 3: 8 regions ... Total processed regions = Σ(2^L), L=1..D

One random delay is generated for every region before processing begins. The same region delay is then used across all channels, so multichannel sources keep channel alignment while each channel reads its own delayed samples.

Processing

Processing starts from a private zero-based copy of the source. At each layer, each region is processed with:

feedback(L) = effectiveFeedbackBase / L if col > delay: self + feedback(L) × self[col-delay] × sin(π × positionWithinRegion) else: self

The sine factor approaches zero at region boundaries, reducing abrupt boundary changes. The delayed term is read from the working wet signal, so successive formula passes accumulate recursively rather than adding a single dry tap.

After all layers, Wet/Dry is applied against the untouched private source copy. The result is then peak-normalized to Scale_peak.

Scale_peak is normalization: it is applied whenever the result is non-silent, even when the current peak is already below the requested value.

Visualization

Important: the layer diagram shows the segmentation hierarchy, not the actual random delay assigned to each region. The random delay values are used by the DSP but are not encoded as lengths or positions in this drawing.

Output behavior