8‑Channel Speed Deviations
Introduce subtle (or extreme) per‑channel playback‑rate variations to an octo (8‑channel) sound. Model independent tape/wow/flutter behavior, ensemble detune, or spatial chorus—while keeping the system phase‑aware and time‑aligned.
What this does
The script varies the instantaneous playback speed of each of the eight channels around unity (1.0×). By default it uses high‑quality resampling with fractional‑delay interpolation. You can drive the speed by constants, LFOs, random walks, or imported envelopes—either independently per channel or linked in groups (e.g., front pair, rear pair).
- 8 channels in / 8 channels out; channel order is preserved.
- Tempo‑&‑pitch coupled varispeed (classic). Optional pitch‑preserving mode via phase‑vocoder time‑stretch (slower).
- Duration policy: free‑running (length changes) or end‑locked (warps while keeping end time).
Quick start
- In Praat, select an 8‑channel Sound (octophonic bed).
- Run script… →
8-channel speed deviations.praat. - Choose mode (Constant, LFO, RandomWalk, Envelope).
- Set depth (±% or cents) and rate_hz if applicable.
- Select coupling (Linked pairs / Quads / Independent) and duration_policy.
- Enable normalize if desired. Click OK.
Concepts
Varispeed vs. Time‑Stretch
Time‑stretch aims to change duration with minimal pitch shift (phase‑vocoder).
For musical chorus‑like spread, varispeed is usually preferred. For film beds that must stay in tune, use pitch‑preserving mode.
Deviation Units
- Percent (±%): speed factor r = 1 + d%/100.
- Cents (±c): r = 2^{c/1200} (pitch‑related).
- PPM for ultra‑small drifts (1e‑6 scale).
Deviation Modes
🎛️ Constant
Fixed per‑channel factor (e.g., small spreads like ±5 cents).
🌊 LFO
Sinusoidal or triangle modulation around 1.0×: r_i(t) = 1 + d_i · sin(2π f_i t + φ_i).
🎲 Random Walk
Low‑rate wander with step size and bound; optionally filtered (1/f) for tape‑like drift.
📈 Envelope
Use user‑defined breakpoint functions (time, factor) per channel or copied across a group.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| unit | option | percent | percent | cents | ppm |
| mode | option | LFO | Constant | LFO | RandomWalk | Envelope |
| depth | real | 0.5 | Peak deviation in chosen units (global default) |
| rate_hz | real | 0.6 | LFO/Flutter rate (per‑channel overridable) |
| wave | option | sine | sine | triangle | random‑hold |
| rand_step | real | 0.02 | Random‑walk step (units/sec) |
| rand_bound | real | 1.0 | Max absolute deviation (units) |
| pv_time_stretch | boolean | no | Pitch‑preserving mode (phase‑vocoder) |
| duration_policy | option | end_locked | free_run | end_locked |
| interp | option | cubic | linear | cubic | sinc (if available) |
| normalize | boolean | yes | Peak‑normalize to norm_target |
| norm_target | real | 0.99 | Peak target |
| seed | integer | 0 | 0 = auto; otherwise reproducible deviations |
| report | boolean | no | Print per‑channel factors over time and headroom |
Per‑Channel Controls
| Parameter | Type | Default | Description |
|---|---|---|---|
| depth_ch | CSV | "" | Override depth per channel (8 values) |
| rate_ch | CSV | "" | Override LFO rate per channel |
| phase_ch_deg | CSV | "" | Initial phase per channel |
| envelopes | Text/CSV | "" | For Envelope mode: list of (t,r) pairs per channel |
Blank CSVs inherit the global setting. Use “copy L→R” helpers to mirror values within pairs.
Coupling & Groups
Define how channels relate. For an octo bed (L, R, C, LFE, Ls, Rs, Lrs, Rrs) you might:
- Pairs: (L,R), (Ls,Rs), (Lrs,Rrs) linked with opposite phases (±φ).
- Quads: Front quad linked; rears offset by 90°.
- Independent: All eight wander uniquely (seeded).
| Parameter | Type | Default | Description |
|---|---|---|---|
| coupling | option | pairs | pairs | quads | independent | custom |
| pair_phase_deg | real | 180 | Phase offset within each pair |
| custom_matrix | text | "" | 8×8 coupling matrix (0..1) for correlation between channels |
Presets
🎻 Ensemble detune (musical)
unit=cents, mode=Constant, depth_ch= -7,-3,0,+3,+7,-5,+2,-2; pv_time_stretch=no; normalize=yes
📼 Tape wow/flutter (film bed)
unit=percent, mode=LFO, rate=0.6, depth=0.2, wave=sine; coupling=pairs with 180°; pv_time_stretch=yes (to preserve pitch)
🌬️ Spatial chorus wide
unit=cents, mode=LFO, rate_ch=0.2,0.21,0.23,0.19,0.31,0.29,0.27,0.25; depth=6; coupling=independent
🧭 Slow drift (installation)
mode=RandomWalk, rand_step=0.002, rand_bound=0.6 (percent), seed=1234; end_locked; normalize=0.99
Workflow & QA
- Channel order: Verify your octo order. Mis‑ordered beds will image incorrectly downstream.
- Set duration policy: For sync‑critical work, use end_locked. For creative drift, free_run.
- Gain staging: Enable normalize and leave 1–2 dB headroom when combining with other beds.
- Mono/downmix check: If downmixing to stereo later, prefer pair/quad coupling to reduce comb filtering.
- Render notes: Export with the original sample rate to minimize resampling cascades.
Edge Cases & Safeguards
- Large deviations: >±5% can create noticeable pitch/tempo artifacts; consider pv_time_stretch.
- Clicks at edits: For Envelope mode, use smooth breakpoints; the script applies cosine crossfades at segment boundaries.
- Phase issues: Independent channels may comb‑filter on collapse; use pairs with phase offsets.
- Very short clips: LFO periods longer than clip length effectively act as constant offsets; adjust rate.
Math
Speed Factor & Pitch Relation
Instantaneous time map: τ_i(t) = ∫_0^t r_i(u) du. Output y_i(t) = x_i(τ_i(t)).
End‑Locked Warping
Random Walk
Optionally low‑pass filter r_i for tape‑like drift.
Phase‑Vocoder Stretch (pitch‑preserving)
Performance Notes
- Resampling quality: Cubic is fast/clean; sinc is best but slower.
- Block size: Longer blocks reduce overhead but make rate changes less granular; the script uses adaptive step ≤ 10 ms.
- Phase‑vocoder: Expect ~3–10× CPU vs varispeed; increase hop overlap (≥4) for smoother transients.