Barber-Pole Orbit — User Guide
Feedforward modulated-delay orbit that builds a rotating field of phase-offset time taps from two nearby modulation rates.
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.
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
- Select exactly one Sound object in Praat.
- Run
Barber-Pole_Orbit.praat. - Start with Classic Barber-Pole Orbit.
- Use Dry/Wet to set how much of the orbit replaces the clean source.
- For a denser field, increase Number of turns; for a stronger time excursion, increase Modulation depth.
- Use Base rate for the main cyclic speed and Drift rate for the separation between the two modulation families.
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
↓
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:
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
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.
| Preset | Turns | Base delay | Depth | Base / Drift | Opposing phase | Stereo phase | Atten. | Turn step | Wet |
|---|---|---|---|---|---|---|---|---|---|
| Gentle Orbit | 3 | 5 ms | .08 | 3.0 / .08 Hz | 1.57 rad | .25 cyc | 1.5 | .20 rad | 60% |
| Classic Barber-Pole Orbit | 5 | 7 ms | .12 | 4.0 / .15 Hz | 1.20 rad | .50 cyc | 1.0 | .30 rad | 70% |
| Intense Spiral | 7 | 9 ms | .18 | 5.5 / .22 Hz | .90 rad | .75 cyc | .7 | .45 rad | 78% |
| Subtle Shimmer | 4 | 4 ms | .06 | 2.5 / .05 Hz | 1.80 rad | .30 cyc | 2.0 | .15 rad | 45% |
| Deep Space Rotation | 6 | 12 ms | .15 | 2.0 / .10 Hz | 1.00 rad | .66 cyc | .8 | .50 rad | 75% |
| Extreme Drift | 10 | 10 ms | .25 | 6.5 / .30 Hz | .80 rad | .90 cyc | .5 | .60 rad | 85% |
Parameters
| Control | Default | Implemented behavior |
|---|---|---|
| Number of turns | 5 | Number of weighted tap pairs. Defensively limited to 1–32. |
| Base delay | 7 ms | Converted 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 | .10 | Fraction of the base offset used as sinusoidal excursion; limited to 0–.95. |
| Base rate | 3.8 Hz | Main LFO rate. The two tap families run at Base±Drift. |
| Drift rate | .12 Hz | Rate separation between the two families; negative values are clamped to 0. |
| Opposing phase offset | 1.2 rad | Additional phase separation of the Base−Drift family. |
| Stereo phase offset | .5 cycles | Channel-to-channel phase increment. The value is wrapped modulo one cycle. |
| Turn phase step | .3 rad | Phase progression from one turn to the next; applied with opposite signs to the two tap families. |
| Turn attenuation | 1.0 | Controls the weight curve 1/(turn+attenuation). |
| Dry / Wet | 70% | Linear mix: dry×(1-wet) + wetField×wet, limited to 0–100%. |
| Safety peak | .99 | 0 disables the ceiling. Otherwise it attenuates only when the rendered peak exceeds the target; it never raises a quiet result. |
| Draw visualization | On | Creates the process figure after rendering. |
| Play result | On | Plays 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:
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
- Duration: preserved.
- Sample rate: preserved.
- Start time: preserved and reported in Info.
- Channels: mono becomes stereo; multichannel input keeps its existing count.
- Level: no unconditional normalization. Safety Peak is attenuation-only and is skipped entirely at 0% wet.
- Randomness: none. With identical source and settings, the modulation field is deterministic.
- Processing: offline Praat rendering, not real-time audio processing.