BPM Surround Panning — User Guide

BPM-locked multichannel spatialisation built around a real 2D source trajectory, one shared speaker panner, three speaker layouts, energy-preserving or creative gain fields, a derived low-frequency channel for 7.1, and practical 7.1 / 7.0 / 5.1 / quad / stereo outputs.

Author: Shai CohenAffiliation: Department of Music, Bar-Ilan University, IsraelVersion: 0.6.1 (2026)License: MIT LicenseRepo: Praat AudioTools
Contents:

What this does

BPM Surround Panning converts one mono or stereo Sound into a moving multichannel sound field. The source is first reduced to one mono spatialisation source. Each pattern generates a real Cartesian position x(t), y(t) plus a pattern amplitude. A single panner then converts that position into gains for the actual speaker coordinates.

Key change from the early version: the 15 patterns are no longer separate, hard-coded channel envelopes. They are trajectories. Speaker gains are always derived from the selected speaker map, so the trajectory and the speaker geometry cannot silently disagree.
Source Sound (mono or stereo)
→ convert to mono spatial source + reset working time to 0
→ BPM-locked or file-synchronous base rate
→ pattern trajectory x(t), y(t), amplitude
→ clamp trajectory to Path_radius
→ distance-based speaker weights from the selected layout
→ optional energy-preserving gain normalisation
→ AmplitudeTier rendering
→ optional derived LF channel
→ shared peak gain
→ selected multichannel/downmix output
→ optional 8 mono stems + visualisation
Not VBAP: this implementation does not use Vector Base Amplitude Panning. It uses smooth distance-based Gaussian speaker weights. Source_focus controls how strongly the closest speakers dominate.

Quick start

  1. In Praat, select exactly one mono or stereo Sound.
  2. Run script…BPM_SURROUND__Panning.praat.
  3. Keep Rate_mode at BPM-locked, set Tempo_bpm, and choose a Subdivision.
  4. Choose one of the 15 Pattern trajectories.
  5. Select the required Speaker_format. For conventional 7.1-style work, start with 7.1 with a derived LF channel.
  6. Use Energy-preserving spatialisation when you want movement without deliberate level pumping. Use Creative gain field when the changing total level is part of the effect.
  7. Choose the Output_format and optionally enable Keep_8_mono_stems.
  8. Set Peak_target, then enable/disable Draw_visualization and Play_result.
Playback: Praat can play the resulting Sound, but the meaning of a multichannel playback depends on the available audio device and channel routing. The Stereo downmix is a weighted stereo mix only; it is explicitly not binaural and contains no HRTF, ITD, head-shadow, or pinna filtering.

Rate model

The script has two deliberately different timing modes.

BPM-locked — default

baseRate = Tempo_bpm / 60 × subdivision factor. The available subdivisions are 1/1 (one base cycle per four-beat bar), 1/2, 1/4, 1/8, and 1/16.

File-synchronous cycles

Legacy behaviour: 1, 2, 4, 8, 16, 32, or 64 base cycles are spread across the complete file duration. The same setting therefore runs at a different Hz rate on files of different lengths.

“Primary phase cycles” are not always complete shape repetitions. The selected pattern multiplies the base rate internally. Some shapes close only after several phase cycles, and Swarm / Quantum combine incommensurate terms and have no single exact repeat period.

Tempo example

120 BPM at 1/4 → base rate = 2 Hz
120 BPM at 1/8 → base rate = 4 Hz
120 BPM at 1/16 → base rate = 8 Hz

Speaker models

The speaker map is the single source of truth for the panner. Angles use 0° = front and increase clockwise.

Speaker formatDirectional channelsCh4Geometry
7.1 with derived LF7Derived low-frequency channel; not spatialisedFL 330°, FR 30°, C 0°, SL 250°, SR 110°, BL 210°, BR 150°
8.0 full-range on 7.1 layout8BC at 180°The 7.1 directional geometry plus a full-range back-centre; spacing is intentionally irregular
True octophonic ring8SE at 135°N, NE, E, SE, S, SW, W, NW at exact 45° spacing
Derived LF channel: in 7.1 mode Ch4 is made by low-pass filtering the mono spatial source. The default cutoff is 100 Hz and is automatically limited to 90% of Nyquist. Lfe_level sets its relative level. It is excluded from directional spatial normalisation, but it receives the same final global gain so its ratio to the main channels remains stable.
Terminology: the script correctly reports this as a derived low-frequency channel, not a true authored LFE. A production LFE channel normally carries separately authored effects content rather than simply a low-pass copy of the main source.

Panning model

For each control point, the current source position is compared with every directional speaker position. A Gaussian weight is derived from squared distance:

dᵢ² = (x - xᵢ)² + (y - yᵢ)²
wᵢ = exp[-Source_focus × (dᵢ² - d²min)]

Subtracting the nearest-speaker distance before the exponential keeps the calculation numerically stable. Source_focus increases or decreases the concentration of energy around the nearest speaker(s).

Energy-preserving mode

gᵢ = amplitude × wᵢ / sqrt(Σwᵢ²)

Therefore, at each control point:
Σgᵢ² = amplitude²

The equality is exact at the AmplitudeTier control points. Between points, the tiers are independently linearly interpolated, so a very small deviation can occur between control points.

Creative gain field: bypasses this squared-gain normalisation. The spatial motion remains the same, but the total level is allowed to rise and fall with the pattern.
Path radius is a real maximum. Every trajectory is clamped after its pattern calculation so the radial distance can never exceed Path_radius (maximum accepted value 0.98).

The control rate follows the fastest internal component of the chosen pattern: 32 points per fastest cycle are requested, with a 200 Hz minimum, an 8000 Hz ceiling, and a 400,000-point maximum. When either cap is reached, the Info window reports it explicitly.

15 patterns

Each pattern returns a source position and an overall amplitude. The table distinguishes the pattern's primary phase rate from its visible geometric behaviour.

#PatternPrimary phaseTrajectory character
1Circle1× baseClockwise circular orbit at Path_radius.
2Figure-8Gerono lemniscate; vertical excursion is scaled to keep the path inside the radius.
3SpiralContinuous centre→out→centre radial motion with amplitude following radius.
4BounceReflected x/y ramps; the 0.75 axis ratio makes the complete shape close after four primary phase cycles.
5SwarmQuasi-random deterministic wander from several non-matching sinusoidal terms; no single exact repeat period.
6TornadoRotating vortex with a radius that breathes in and out.
7WaveStrong side-to-side motion with a smaller 2× vertical wave.
8Plasma3:2 Lissajous-type field with a faster amplitude term.
9NeuralSix discrete spatial nodes per phase cycle with soft-gated amplitude transitions.
10QuantumSlow centre drift plus fast 5.3× / 7.1× jitter terms; no single exact repeat period.
11DNAFigure-like double-frequency path with an independent phase-related amplitude strand.
12GalaxyRotation with a slower radius drift; complete modulation closes after three primary phase cycles.
13LightningSoft-gated strikes that jump between deterministic angular positions with exponential decay.
14HeartbeatContinuous double-pulse amplitude envelope with slow circular position motion; spatial position closes after four phase cycles.
15Breathing0.5×Radius expands/contracts while the steering angle advances more slowly; full steering cycle spans three primary phase cycles.

Parameters

ParameterDefaultDescription
Rate_modeBPM-lockedChoose real tempo sync or the legacy file-synchronous cycle count.
Tempo_bpm120Tempo for BPM mode. Valid range: 1–999 BPM.
Subdivision1/41/1, 1/2, 1/4, 1/8, or 1/16. The 1/1 option means one base cycle per four-beat bar.
File_cycles8 cyclesUsed only in file-synchronous mode: 1, 2, 4, 8, 16, 32, or 64 cycles over the complete file.
PatternCircleOne of the 15 source trajectories listed above.
Speaker_format7.1 + derived LF7.1 with derived LF, 8.0 full-range on the irregular 7.1 geometry, or a true 45° octophonic ring.
SpatialisationEnergy-preservingNormalise squared directional gains to the pattern amplitude, or leave the raw gain field for intentional pumping.
Source_focus1.6Controls the concentration of distance-based speaker weights. Higher values favour the nearest speakers more strongly.
Path_radius0.85Maximum source distance from the listener. Values above 0.98 are clamped.
Lfe_cutoff_Hz100 HzLow-pass cutoff for the derived LF channel in 7.1 mode; capped below Nyquist.
Lfe_level0.4Relative level of the derived LF channel, clamped to 0–1.
Output_format7.1 / 8-channel8-channel main output, 7.0, 5.1 downmix, 4.0 quad, or stereo downmix. The exact meaning of the 8-channel option follows the selected speaker model.
Keep_8_mono_stemsOffKeep the eight processed source channels in addition to the main result.
Peak_target0.95Final peak target. Invalid values fall back to 0.95.
Draw_visualizationOnDraw the trajectory, gains, speaker distribution, output waveform, and summary.
Play_resultOnPlay the main result after processing.

Outputs

Output choiceChannelsBehaviour
8-channel main output8With 7.1 speaker mode: FL, FR, C, derived LF, SL, SR, BL, BR. With either full-range speaker model: all eight channels are directional.
7.0 full-range7In 7.1 mode, the derived LF channel is dropped. In a full-range 8-channel speaker mode, Ch4 is also dropped, so use this choice only when that is intended.
5.1 downmix6BL/BR are folded into SL/SR. In 7.1 mode Ch4 supplies the derived LF channel. In full-range modes a fresh low-frequency channel is derived from the source and directional Ch4 is folded equally into SL/SR.
4.0 quad4C is split into the front pair; SL/SR are folded into the rear pair; full-range Ch4 is also folded into the rear pair.
Stereo downmix2Weighted sum of front, centre, side, and rear channels. Full-range Ch4 is sent equally to both sides. This is not a binaural render.
Naming: the main result uses names such as [source]_surr_[Pattern], [source]_51_[Pattern], [source]_quad_[Pattern], or [source]_stereo_[Pattern]. Optional stems are renamed [source]_stem1_... through [source]_stem8_... using the active speaker labels.
Peak handling: after directional rendering, one shared gain is applied to all eight working channels so the spatial relationships are preserved and the derived LF ratio stays stable. The selected main output is then scaled to Peak_target.

Visualisation

The drawing is a process visualisation rather than a generic explanation layer. It is generated from the same trajectory and speaker-gain procedures used by the audio renderer.

Speaker map + motion

Shows the speaker coordinates, the actual source path, and the darker energy-centroid path computed from squared speaker gains. In 7.1 mode the derived LF channel is shown separately and is explicitly marked as non-spatialised.

Gain envelopes

Recomputes the true directional gain curves over one primary pattern cycle; it does not estimate gain by dividing processed audio by the source.

Polar mean gain

Displays the mean gain associated with each directional speaker, normalised to the loudest speaker for visual comparison.

Output waveform

Displays channels 1 and 2 of the final output as a structural reference, while stating how many channels the result actually contains.

Summary band: reports the pattern, source, rate mode, primary phase rate, speaker format, number of directional channels, spatialisation mode, focus, radius, output format, stem status, and final peak.