8-Channel Delay

Per-channel and cross-channel delays for octophonic layouts: tempo sync, feedback matrices, filters, modulation, and ping–pong/ring patterns. Designed for creative spatial echoes and ambience design.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.1 (2025) Praat
Contents:

What this does

Applies delay lines to each of the eight channels of an input Sound, with optional cross-feeding between channels to create motion (ping–pong, ring chases, diffusion). Each delay has independent time, feedback, filter, level, and modulation. A global feedback matrix enables complex energy circulation while ensuring stability.

Use for spatial echoes, surrounds “throw,” ring chases, and immersive ambience.

Quick start

  1. Select an 8-channel Sound in Praat.
  2. Run script…8-Channel Delay.praat.
  3. Pick a routing pattern (Ping-Pong, Ring, Cross, Matrix).
  4. Set time (ms or synced), feedback, and mix (dry/wet).
  5. Optionally enable filters and modulation.
  6. Click OK — a processed 8-channel Sound is created.

Routing & Patterns

PatternDescription
StraightEach channel delays itself only.
Ping–Pong (Pairs)Pairs (0↔1, 2↔3, 4↔5, 6↔7) exchange echoes.
Ring0→1→2→…→7→0 circular chase; set per-step gain.
CrossFronts feed rears and vice versa (0→5,1→4,2→7,3→6 etc.).
MatrixUser-specified 8×8 feedback matrix for custom diffusion.

Parameters

ParameterTypeDefaultDescription
time_modeoptionmsms | samples | sync
bpmreal120Used when time_mode=sync
note_valueoption1/41/1, 1/2, 1/4, 1/8, 1/16, dotted, triplet
time_msreal350Base delay for channels (overridable per channel)
feedbackreal0.350..0.99 global feedback (used if no matrix)
mix_dry_wetreal0.50=dry, 1=wet
stereo_widthreal1.0For pair/ring patterns, scales crossfeed asymmetry
normalizebooleanyesPeak normalize output to norm_target
norm_targetreal0.99Peak amplitude target
reportbooleannoPrint effective times and matrix eigenvalues

Per-Channel Controls

ParameterTypeDescription
time_ms_chCSVDelay per channel (8 values)
level_db_chCSVTap output level trims
fb_chCSVPer-channel feedback (if matrix unused)
pan_spread_chCSVOptional spread to neighboring channels at tap
offset_ms_chCSVAdditional offset for groove (swing)

Feedback Matrix

Use an 8×8 matrix M to feed delayed energy between channels: y = x + M * z, where z is the vector of delayed samples from each line. Diagonal = per-channel feedback; off-diagonals = crossfeeds.

ParameterTypeDefaultDescription
use_matrixbooleannoEnable matrix feedback
M_csvtext""Rows separated by |, values by commas
matrix_normoptionspectralspectral | row | none
spectral_limitreal0.98Clamp spectral radius ρ(M) ≤ limit for stability
Tip: Circulant ring: first row 0,a,0,0,0,0,0,a creates clockwise/counterclockwise ping–pong.

Filters & Modulation

ParameterTypeDefaultDescription
hp_hzreal20High-pass inside feedback path
lp_hzreal12000Low-pass for damping
damp_db_per_sreal0.0Additional decay per second inside loop
mod_rate_hzreal0.0Delay-time LFO rate (0 disables)
mod_depth_msreal0.0Peak LFO depth (ms)
mod_waveoptionsinesine | triangle | random-hold
interpoptioncubicInterpolation for fractional delays

Presets

🏟️ Stadium throw

time=420 ms, pairs ping–pong, feedback=0.42, lp=9 kHz, mix=0.35

🌀 Ring chase

pattern=Ring, step gain 0.35, time_ch=180,220,260,300,340,380,420,460 ms

🎲 Diffuse matrix

use_matrix=yes; M=circulant with 0.28 on ±1, 0.1 on ±2; spectral_limit=0.95; lp=8 kHz

🌊 Chorus echo

mod_rate=0.3 Hz, mod_depth=7 ms, time=360 ms, feedback=0.25, mix=0.4

Workflow & Tips

Math

Delay with Feedback

Per channel i: y_i[n] = x_i[n] + g_i · y_i[n - D_i]. With crossfeed: y[n] = x[n] + M · y[n - D], where D stacks channel delays.
Stability requires spectral radius ρ(M_eff) < 1, where M_eff includes per-channel feedback and filter gains.

Tempo Sync

Quarter note at BPM: T₁/₄ = 60,000 / BPM (ms). Dotted = ×1.5, Triplet = ×2/3. Other values scale accordingly.

Fractional Delay

For non-integer D: y[n] ≈ Σ_k h[k] · x[n - ⌊D⌋ - k], with interpolation kernel h (linear/cubic/sinc).

Performance