8 — Odd Forward, Even Reversed

Process an octophonic (8‑channel) sound such that odd‑indexed channels play forward while even‑indexed channels are time‑reversed — with options for indexing scheme, crossfades, alignment policy, and channel remapping.

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

What this does

Takes an 8‑channel Sound and reverses either the even or odd subset while leaving the other subset forward. Useful for antiphonal textures, palindromic call‑and‑response, and spatial retrogrades. Options ensure consistent indexing (0‑based vs 1‑based), gapless crossfades at the boundaries, and preserved start/end alignment.

Quick start

  1. Select an 8‑channel Sound in Praat.
  2. Run script…8 - Odd forward Even reversed.praat.
  3. Set Index base (0 or 1) and choose Reverse subset = Even (default) or Odd.
  4. Adjust Crossfade at boundaries (ms) if you hear clicks.
  5. Pick an Alignment policy (End‑locked recommended). Press OK.

Channel policy

Index baseOdd channelsEven channelsExample
0‑based (0..7)1,3,5,70,2,4,6“Even” includes channel 0
1‑based (1..8)1,3,5,72,4,6,8Matches typical speaker labels
If your audio interface/DAW labels start at 1, choose Index base = 1 to keep “odd/even” intuitive.

Parameters (Praat-style)

LabelTypeDefaultDescription
Index baseoption10 | 1 — how odd/even are computed
Reverse subsetoptionEvenEven | Odd
Preserve alignmentoptionEnd‑lockedStart‑locked | End‑locked — which anchor remains fixed after reversing
Crossfade at boundaries (ms)real10Fade‑in/out at clip edges of reversed channels to avoid clicks
Trim leading/trailing silencebooleannoRemove silence before/after processing
Channel map (CSV)text""Optional remap (e.g., 0,1,2,3,4,5,6,7 or 1..8 for 1‑based UIs)
NormalizebooleanyesPeak normalize output to target
Target peakreal0.99Normalization target
ReportbooleannoPrint applied subset, index base, and alignment

Per‑channel options

LabelTypeDescription
Exclude channels (CSV)textChannels that should bypass processing
Per‑channel offset (ms)CSVDelay/advance after reversal to create flams
Per‑channel gain (dB)CSVLevel trims post‑process

Presets

🎭 Antiphonal mirror

Index base=1; Reverse subset=Even; Crossfade=15 ms; End‑locked; Normalize=yes

🪞 Palindrome pairs

Reverse subset=Even; Channel map=0,1,3,2,4,5,7,6; Crossfade=12 ms

⏱️ Flam spread

Per‑channel offset=0,8,0,8,0,8,0,8 ms; Crossfade=8 ms

Workflow & Checks

  1. Confirm indexing: Compare with your DAW/driver. If channels are labeled 1–8, set Index base=1.
  2. Pick anchor: End‑locked keeps all channels ending together (good for synced cues). Start‑locked preserves the onset alignment.
  3. De‑click: Increase Crossfade if you hear clicks at the reversal boundaries.
  4. Gain staging: Enable Normalize, especially if per‑channel offsets create overlaps that increase peaks.
  5. Downmix sanity: If folding to stereo later, audition mono compatibility (reversals can change phase relations).

Edge cases

Math

Time reversal

Given channel i with samples x_i[0..N−1], the reversed signal is x_i^R[n] = x_i[N−1−n].
With end‑lock, the reversed channel is time‑shifted so that its last sample aligns with the original end.

Crossfade at boundaries

Apply fade‑in/out windows w(t) at the first/last T_f ms of each reversed channel: y = w_in·y + (1−w_in)·ε near start, and similarly at end; Hann windows avoid clicks.