Barber-Pole Orbit — User Guide

Feedforward modulated-delay orbit that builds a rotating field of phase-offset time taps from two nearby modulation rates.

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

What this does

Barber-Pole Orbit creates cyclical comb/vibrato motion and spatial rotation by mixing many phase-offset, time-varying taps of the input. Two nearby modulation rates — Base_rate + Drift_rate and Base_rate - Drift_rate — move against one another. Each turn adds another pair of taps with a new phase position, so the result can range from a gentle moving shimmer to a dense rotating delay field.

Core idea: the effect does not generate a new pitched oscillator bank. The perceived barber-pole character comes from a field of continuously moving time offsets whose phases are distributed across turns and channels.

Because the moving taps are derived directly from the source, the character depends strongly on the input. Sustained or spectrally stable material makes the orbital modulation easy to hear; complex material turns the same mechanism into animated combing, flanging, stereo motion, and texture.

Quick start

  1. Select exactly one Sound object in Praat.
  2. Run Barber-Pole_Orbit.praat.
  3. Start with Classic Barber-Pole Orbit.
  4. Use Dry/Wet to set how much of the orbit replaces the clean source.
  5. For a denser field, increase Number of turns; for a stronger time excursion, increase Modulation depth.
  6. Use Base rate for the main cyclic speed and Drift rate for the separation between the two modulation families.
Exact bypass: at Dry_wet_percent = 0, modulation and safety attenuation are skipped. A mono input is still intentionally duplicated to stereo before the bypass copy is made.

Processing pipeline

INPUT SOUND

Channel layout preparation
• mono → duplicated stereo
• 2+ channels → copied unchanged

Clean dry reference

For every turn: add two interpolated moving taps
• rate = Base + Drift
• rate = Base − Drift
• phase shifted by turn and channel

Normalize the complete wet tap field by total tap weight

Dry/Wet mix

Optional attenuation-only Safety Peak

OUTPUT SOUND

The processing is feedforward: every moving tap reads from the untouched dry reference. Earlier turns are never fed back into later turns, so the effect does not build a recursive delay loop.

Orbit mechanism

Two nearby modulation rates

For each turn, the current implementation forms two time-varying source reads. In sample units, their offsets are:

Tap A:
dA(x) = base × [1 + depth × sin(2π(Base+Drift)·localTime + turn·phaseStep + channelPhase)]

Tap B:
dB(x) = base × [1 + depth × sin(2π(Base−Drift)·localTime + opposingPhase − turn·phaseStep + channelPhase)]

Source reads used by the script:
dry(x + dA/samplingRate) and dry(x + dB/samplingRate)

localTime = x - soundStart. This is important: the LFO phase is tied to time within the Sound, so moving the Praat object's absolute time domain does not change the rendered modulation pattern.

Fractional time reads

The taps are evaluated with Praat's Sound_name(time) lookup, so the moving positions are not rounded to integer sample indices. The modulation therefore follows continuously varying fractional positions.

Turn phase progression

Turn t advances one family by +t × Turn_phase_step_rad and the other by −t × Turn_phase_step_rad. The two families are additionally separated by Opposing phase offset. This distributes the taps around the modulation cycle instead of stacking every copy at the same phase.

Normalized layer weights

weight(t) = 1 / (t + Turn_attenuation)
wetNorm = 1 / (2 × Σ weight(t))
wet = wetNorm × Σ weight(t) × [TapA(t) + TapB(t)]

Later turns are progressively lighter, and the final wet field is normalized by the sum of all pair weights. Increasing the number of turns therefore mainly changes density and phase complexity, rather than simply making the wet signal louder.

Presets

The preset is applied before the defensive parameter limits. Safety Peak, Draw visualization, and Play result remain user-controlled.

PresetTurnsBase delayDepthBase / DriftOpposing phaseStereo phaseAtten.Turn stepWet
Gentle Orbit35 ms.083.0 / .08 Hz1.57 rad.25 cyc1.5.20 rad60%
Classic Barber-Pole Orbit57 ms.124.0 / .15 Hz1.20 rad.50 cyc1.0.30 rad70%
Intense Spiral79 ms.185.5 / .22 Hz.90 rad.75 cyc.7.45 rad78%
Subtle Shimmer44 ms.062.5 / .05 Hz1.80 rad.30 cyc2.0.15 rad45%
Deep Space Rotation612 ms.152.0 / .10 Hz1.00 rad.66 cyc.8.50 rad75%
Extreme Drift1010 ms.256.5 / .30 Hz.80 rad.90 cyc.5.60 rad85%

Parameters

ControlDefaultImplemented behavior
Number of turns5Number of weighted tap pairs. Defensively limited to 1–32.
Base delay7 msConverted to an integer base-sample offset, minimum 1 sample and clamped to fit the Sound. The actual delay after rounding is reported in Info and the figure.
Modulation depth.10Fraction of the base offset used as sinusoidal excursion; limited to 0–.95.
Base rate3.8 HzMain LFO rate. The two tap families run at Base±Drift.
Drift rate.12 HzRate separation between the two families; negative values are clamped to 0.
Opposing phase offset1.2 radAdditional phase separation of the Base−Drift family.
Stereo phase offset.5 cyclesChannel-to-channel phase increment. The value is wrapped modulo one cycle.
Turn phase step.3 radPhase progression from one turn to the next; applied with opposite signs to the two tap families.
Turn attenuation1.0Controls the weight curve 1/(turn+attenuation).
Dry / Wet70%Linear mix: dry×(1-wet) + wetField×wet, limited to 0–100%.
Safety peak.990 disables the ceiling. Otherwise it attenuates only when the rendered peak exceeds the target; it never raises a quiet result.
Draw visualizationOnCreates the process figure after rendering.
Play resultOnPlays the finished Sound.

Channels, spatial phase, and mix

Mono input

A mono source is intentionally converted to stereo before processing. Channel 1 uses phase 0; channel 2 receives the selected stereo phase offset.

Stereo and multichannel input

Inputs with two or more channels keep their original channel count. Channel row receives:

channelPhase = (row − 1) × stereo_phase_offset_cycles × 2π

Thus the same orbit is distributed progressively across all existing channels rather than collapsing the source to mono or forcing every input to two channels.

Dry/Wet

The dry reference remains clean throughout the tap construction. The normalized wet field is mixed with it only once, at the end. At 100% the output is the normalized moving-tap field; at 0% it is an exact dry copy of the prepared channel layout.

Visualization

The v0.5 figure is process-oriented and uses measured input/output waveforms plus the actual control laws used for the render.

Input

Waveform of the selected source Sound.

Output

Waveform of the rendered result after dry/wet mixing and any required safety attenuation.

Delay modulation

Displays up to the first four turns. Solid blue trajectories show the Base+Drift family; dotted violet trajectories show Base−Drift. The panel shows normalized sinusoidal modulation trajectories, not literal delay in milliseconds.

Turn weights

Bar plot of 1/(turn + Turn_attenuation) for every rendered turn.

Summary

Reports the preset, turn count, actual rounded base delay, modulation depth, Base/Drift rates, stereo phase, Dry/Wet amount, duration, and output channel count.

Output behavior

Practical reading of the controls: Base delay and depth determine the size of the time excursion; Base/Drift determine motion rates; turn count, turn phase step, and attenuation determine layer density; stereo phase distributes that motion across channels; Dry/Wet determines how strongly the moving field replaces the clean signal.