Unified Chorus Generator — User Guide

A multi-tap delay chorus with Dual Tap, Tri Tap, and Orbit modes. The selected Sound is mixed with two or three independently modulated delayed copies to create thickening, ensemble motion, and phase-drifting textures.

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

What this does

Unified Chorus Generator creates an ensemble layer from multiple modulated delay taps. Every wet tap reads the original Sound at a short delay whose length oscillates sinusoidally. The taps use different LFO rates and phase offsets, so their timing and pitch motion do not coincide exactly.

The processor offers three structures:

The wet taps are averaged before they are multiplied by Wet Mix. This averaged wet layer is then added to the original Sound multiplied by Dry Mix.

Signal model

Dry branch

dry contribution = Dry_Mix × source

Wet branch

Each wet voice is a delayed read from the untouched original Sound. Dual and Orbit average two taps; Tri Tap averages three:

Dual / Orbit: wet layer = (tap1 + tap2) / 2 Tri Tap: wet layer = (tap1 + tap2 + tap3) / 3 output = Dry_Mix × source + Wet_Mix × wet layer

Dry Mix and Wet Mix are independent gains. They are not constrained to sum to 1, so settings such as 0.7 / 0.5 add both contributions at those gains rather than performing a normalized crossfade.

Final peak scaling

After the chorus formula is complete, the script always calls Scale peak with the requested target value.

Scale Peak is target normalization. Unlike an attenuation-only safety ceiling, it can raise a result whose peak is below the target as well as reduce a result whose peak is above it.

Three chorus modes

1. Dual Tap

Two modulated delay taps are averaged:

tap 1 LFO = sin(2π × Rate_1 × t) tap 2 LFO = sin(2π × Rate_2 × t + 2.0)

The two voices use separate rates and a fixed 2.0-radian phase displacement on the second tap.

2. Tri Tap

Three taps are averaged:

tap 1 LFO = sin(2π × Rate_1 × t) tap 2 LFO = sin(2π × Rate_2 × t + 2.1) tap 3 LFO = sin(2π × Rate_3 × t + 4.2)

The three rate/phase combinations generate a denser moving delay field than Dual Tap.

3. Orbit

Orbit uses two taps derived from one central rate plus a symmetric frequency drift:

tap 1 LFO = sin(2π × Rate_1 × t + 2π × Phase_drift × t) = sin(2π × (Rate_1 + Phase_drift) × t) tap 2 LFO = sin(2π × Rate_1 × t − 2π × Phase_drift × t + 3.14) ≈ sin(2π × (Rate_1 − Phase_drift) × t + π)

The two LFOs therefore run at approximately Rate 1 + Drift and Rate 1 − Drift, with the second tap nearly opposite in phase. The Space Orbit preset sets Rate 1 to 3.0 Hz and Drift to 0.15 Hz, giving effective rates of approximately 3.15 Hz and 2.85 Hz.

Preset interaction: Subtle Chorus, Classic Chorus, Rich Ensemble, and Deep Shimmer change the delay/depth/rate values but leave the selected Chorus Mode unchanged. Space Orbit is the exception: it explicitly switches the processor to Orbit mode.

Delay modulation

Base delay

The requested Base Delay in milliseconds is first converted to a whole number of samples:

base_samples = round(Base_delay_ms × sample_rate / 1000)

Modulated delay

For each tap:

delay_samples(t) = round( base_samples × [1 + Modulation_depth × LFO(t)] )

Modulation Depth is a fraction of the base delay. For example, a depth of 0.15 produces a nominal delay range of approximately 85% to 115% of the quantized base delay.

Integer-sample reading

The delayed source index is explicitly rounded to the nearest sample. v2.2 therefore uses integer-sample delay modulation, not fractional-delay interpolation.

tap(t) = source[ clamp( current_sample − delay_samples(t), 1, number_of_samples ) ]

The explicit clamp holds the read index at the first or last valid sample whenever the requested index would lie outside the Sound.

Time reference

The LFO formulas use Praat's absolute Sound time x. Consequently, two otherwise identical Sounds placed at different start times can begin the LFO at different phases.

Presets

Preset Base delay Depth Rates Other behavior
Custom 10 ms default 0.15 default 2.5 / 4.2 / 6.3 Hz default Uses the selected mode and all manual settings.
Subtle Chorus 8 ms 0.08 2.0 / 3.5 / 5.0 Hz Selected mode is preserved.
Classic Chorus 12 ms 0.15 2.5 / 4.2 / 6.3 Hz Selected mode is preserved.
Rich Ensemble 15 ms 0.20 1.5 / 3.8 / 5.5 Hz Selected mode is preserved.
Deep Shimmer 20 ms 0.25 0.8 / 2.4 / 4.0 Hz Selected mode is preserved.
Space Orbit 10 ms 0.20 Rate 1 = 3.0 Hz Forces Orbit mode; Phase Drift = 0.15 Hz.
Presets do not replace Dry Mix, Wet Mix, Scale Peak, visualization, or playback settings.

Parameters

The numeric fields in v2.2 are declared as Praat positive fields. They therefore require values greater than zero. The script does not impose the fixed upper ranges that appeared in the older documentation.

ParameterDefaultMeaning
Chorus ModeTri TapDual Tap, Tri Tap, or Orbit structure.
PresetCustomLoads one of five named parameter sets or keeps the manual values.
Dry Mix0.7Gain applied to the direct source branch.
Wet Mix0.5Gain applied to the averaged delay-tap layer.
Base delay ms10.0Center delay before sample quantization.
Modulation depth0.15Relative delay excursion as a fraction of the base delay.
Rate 12.5 HzTap 1 rate; also the central rate used by Orbit.
Rate 24.2 HzSecond tap rate in Dual/Tri modes.
Rate 36.3 HzThird tap rate in Tri mode.
Phase drift Hz0.2Symmetric frequency offset around Rate 1 in Orbit mode.
Scale peak0.95Final target peak normalization value.
Draw visualizationyesCreates the AudioTools Picture figure.
Play resultyesPlays the processed Sound.
Because there are no internal upper clamps on delay, depth, rates, drift, or mix gains, very large manual values can move well beyond the normal chorus region. The documentation above describes the implemented mapping rather than inventing fixed limits that the script does not enforce.

Channels & output

PropertyBehavior
Channel countPreserved.
Per-channel processingThe same chorus structure, rates, phase offsets, delay law, and gains are applied to every channel. Each delayed tap reads the corresponding channel of the original Sound.
Cross-channel mixingNone.
Stereo motionNo separate left/right LFO routing is created; an existing stereo image is processed with the same time-varying chorus law on both channels.
Sample ratePreserved.
Duration / sample countPreserved.
Start timePreserved, although it influences LFO starting phase because the formulas use absolute time.
RandomnessNone. All tap trajectories are deterministic.
Final levelAlways scaled to the requested target peak after processing.
v2.2 has no exact dry bypass control: Dry Mix and Wet Mix are positive fields, and final Scale Peak normalization is always executed.

Visualization

When Draw visualization is enabled, v2.2 draws:

Input

The original waveform.

Output

The normalized processed waveform.

LFO trajectories

The actual normalized sine laws used by the selected mode over the first up to 2 seconds. Dual shows 2 curves, Tri shows 3, and Orbit shows its two frequency-drift curves.

Transformation law

A routing diagram showing the direct branch, the averaged wet taps, the independent Dry/Wet gains, summation, and output.

The LFO panel uses 400 points for drawing. It shows the normalized control functions from −1 to +1, not the resulting delay in milliseconds or the audio waveform of individual taps.

Summary strip

The summary reports mode, preset, base delay, modulation depth, the active rates or Orbit drift, Dry/Wet gains, target peak, and Sound duration.