Stereo Fibonacci Convolution — User Guide

Builds left/right impulse patterns from Fibonacci sequences, adds random timing jitter, and uses the resulting IR for stereo or multichannel convolution.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.5.1 (2026) License: MIT License Repo: Praat AudioTools
Contents:

What this does

Stereo Fibonacci Convolution generates two related impulse responses. The left and right sides start from different Fibonacci seeds, use different scale divisors, and receive independent Gaussian timing jitter. The two patterns are combined into a stereo IR and convolved with the selected Sound.

Spatial idea: left and right share the same recursive Fibonacci law but diverge through their seeds, time scaling, and random jitter. The result is a structured stereo echo field rather than a periodic delay.

What is convolution?

Convolution applies an impulse response to a source. Each IR tap produces a delayed copy of the source, so a Fibonacci-spaced IR turns the source into a family of repetitions whose timing follows the Fibonacci-derived pattern. Here the IR is synthesized separately for the two stereo sides.

Fibonacci timing

For each side, the sequence begins with two user-defined seeds and continues by addition:

F[n+2] = F[n+1] + F[n]
nominalTap[n] = (F[n] / scale_divisor) × IR_duration
realizedTap[n] = nominalTap[n] + randomGauss(0, jitter_s)

A tap is added only when its realized time lies strictly inside the IR. Consequently Number_of_impulses is a maximum number of attempts, not a guarantee that all requested taps will survive. Custom input is capped internally at 256 impulses.

Randomness: there is no seed control. Re-running the same settings can place the jittered taps differently.

Presets

PresetIRNLeft seeds / scale / jitterRight seeds / scale / jitter
Subtle Fibonacci1.2 s81,1 / 120 / 5 ms1,2 / 140 / 8 ms
Medium Fibonacci1.5 s121,1 / 100 / 10 ms2,3 / 120 / 20 ms
Heavy Fibonacci2.0 s161,2 / 85 / 18 ms3,5 / 100 / 35 ms
Extreme Fibonacci3.0 s202,3 / 70 / 30 ms5,8 / 85 / 50 ms
CustomUses the form values.
Preset scope: presets override IR duration, impulse count, both Fibonacci seed pairs, both scale divisors, both jitter amounts, Pulse_width, and Pulse_period. They do not override Pulse_amplitude, wet/dry, or output switches.

Parameters

ParameterMeaning in this implementation
IR_duration_sImpulse-response domain. Internally kept at least four samples long.
Number_of_impulsesMaximum sequence terms attempted per side; Custom is capped at 256.
Left/Right_fib_start_1, _2Initial values of each Fibonacci recurrence.
Left/Right_scale_divisorConverts Fibonacci numbers to nominal positions within the IR.
Left/Right_jitter_sGaussian timing standard deviation added independently to each attempted tap.
Pulse_amplitudeLegacy name. Passed to Praat PointProcess: To Sound (pulse train) as its adaptation factor; it is not a direct final IR amplitude control. Each non-silent L/R IR is subsequently normalized to peak 0.9.
Pulse_widthLegacy name. Passed as the pulse-train adaptation-time argument, not a literal impulse width.
Pulse_periodLegacy name. Rounded and used as the pulse-train interpolation depth (minimum 1), not an acoustic period.
Wet_dry_percentLinear dry/wet blend, clamped to 0–100%.

Output & channel behavior

Visualization

The Dry and Result waveforms are autoscaled independently. The IR Taps panel plots the nominal Fibonacci times before random jitter. It is therefore a structural reference diagram, not a literal plot of the realized PointProcess used in that run. The Info window reports how many jittered points were actually accepted on each side.