Multi-channel Random Paulstretch Slices — User Guide

Hybrid generative spatialization: combines random slice extraction with extreme Paulstretch time-expansion, placing each ambient-stretched fragment on separate channel for ethereal multi-channel soundscapes.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.1 (2025) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

This script implements multi-channel random Paulstretch slicing — a hybrid technique combining random temporal extraction with extreme time-stretching and spatial distribution. Process: (1) Extract random slices from source (0.1-0.5s typical, variable start positions), (2) Paulstretch each slice independently (4x-50x+ expansion with phase randomization), (3) Center-position stretched slices at original temporal locations, (4) Spatial distribution: CH1 = original unchanged, CH2-CH(N+1) = one Paulstretched slice per channel in silence-padded tracks. Result: Multi-channel ambient decomposition where brief source fragments become ethereal drones, each on isolated channel. Combines generative slicing (unpredictability) + Paulstretch (smooth ambience) + multi-channel (spatial separation) for installation, immersive audio, generative composition.

Key Features:

Why combine slicing + Paulstretch + multi-channel? Each technique serves different purpose: (1) Random slicing: Generative temporal decomposition (unpredictable fragment selection). (2) Paulstretch: Extreme time-expansion with smooth, ambient character (brief → sustained). (3) Multi-channel: Spatial separation (each slice independently placeable). Combined effect: Single source → constellation of ambient drones, each derived from brief moment, spatially distributed. Similar to: granular clouds (but sustained grains), spectral decomposition (but temporal), ambient pad generation (but multi-channel). Historical precedent: Drone music (La Monte Young, Éliane Radigue), ambient electronica (Brian Eno), spatial music (Stockhausen, acousmatic). This script: algorithmic/generative approach to creating ambient spatial textures from any source.

Technical Implementation: (1) Setup: Convert stereo→mono if needed (right channel for slicing), Calculate padding: max_duration × stretch_factor (accommodate longest stretch), Pad CH1 (original) to padded_duration. (2) Slice & Paulstretch loop: For each segment (1 to N): Generate random slice: duration (min/max), start position, Extract slice from source (typically 0.1-0.5s), Apply Paulstretch to slice: FFT-based, phase randomization per frame, overlap-add synthesis, stretch_factor expansion (4x+ typical), Get stretched duration (e.g., 0.3s × 8x = 2.4s), Calculate center positioning: original_center, stretched_start = center - stretched_duration/2, Create silent channel (padded_duration), Copy Paulstretched samples to position. (3) Multi-channel combination: Combine CH1 (original) + CH2-N (stretched slices), Normalize peak across all channels to 0.99. (4) Output: Multi-channel sound (1+N channels), Each slice = independent ambient drone from brief source moment. Key insight: Short source slices (0.1-0.5s) + high stretch (8-20x) = sustained ambient textures (0.8-10s) from fleeting moments. Multi-channel = spatial distribution for installation/immersive contexts.

Quick start

  1. In Praat, select exactly one Sound object (mono or stereo).
  2. Run script… → script file.
  3. Set slice parameters: number_of_segments (4 default), min_duration (0.1s), max_duration (0.5s).
  4. Set Paulstretch parameters: stretch_factor (4.0 = 4x longer), window_size (0.25s), overlap_percent (50%).
  5. Click OK — script displays progress per slice (extraction + Paulstretch), generates multi-channel ambient result, auto-plays.
Quick tip: Start with 4 segments, 0.1-0.5s slices, stretch_factor 8.0 for balanced ambient effect. Increase stretch (8.0 → 16.0) for very long, sustained drones. Increase segments (4 → 8) for denser spatial texture. Adjust slice duration range: shorter (0.05-0.2s) = more fragmented sources, longer (0.3-1.0s) = more sustained sources (but less ambient after stretching). Increase window_size (0.25 → 0.5) for smoother Paulstretch. Processing time: LONG (30 sec - 5 min) — each slice requires full Paulstretch computation. Info window shows: slice extraction details, Paulstretch progress per slice (0-100%), final positioning. Output named "originalname_LEFT_plus_NPSlices_MULTICH". 5-channel output = 1 original + 4 stretched slices.
Important: VERY LONG PROCESSING — Paulstretch per slice + multiple slices = cumulative processing time. 4 slices × 1 minute each = 4+ minutes total. Consider shorter source material (<30s) for experimentation. Praat may appear frozen (normal) — monitor Info window for progress. Very high stretch_factor (>20x) on long slices creates extremely long output → large memory usage. Very many segments (>8) creates dense, potentially muddy ambient texture + very long processing. Typical slice durations (0.1-0.5s) intentionally SHORT — Paulstretch works best transforming brief moments into sustained drones. Longer slices (>1s) + high stretch may exceed available memory. Multi-channel output (1+N channels) — Praat plays as stereo downmix, export to WAV for full multi-channel use. Each stretched slice independent → no phase coherence between channels (intentional for spatial separation).

Hybrid Processing Theory

Three-Stage Architecture

Processing Pipeline Overview

STAGE 1: Random Slice Extraction Input: Full audio (10 seconds) ↓ Slice 1: [0.15s from position 2.3s] Slice 2: [0.38s from position 5.1s] Slice 3: [0.22s from position 7.8s] Slice 4: [0.41s from position 1.5s] STAGE 2: Paulstretch (per slice, 8x) Slice 1: 0.15s → 1.2s (ambient drone) Slice 2: 0.38s → 3.0s (sustained texture) Slice 3: 0.22s → 1.8s (ethereal pad) Slice 4: 0.41s → 3.3s (smooth drone) STAGE 3: Multi-channel Distribution CH1: [━━━━━━━━━━ Original ━━━━━━━━━━] CH2: [ ╍╍╍╍╍╍╍╍╍╍╍ ] CH3: [ ╍╍╍╍╍╍╍╍╍╍╍╍╍╍ ] CH4: [ ╍╍╍╍╍╍╍╍╍ ] CH5: [ ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍ ] Result: 5-channel ambient decomposition

Why This Combination?

Advantages of hybrid approach:

Vs single-technique alternatives:

Short Slices + Extreme Stretch = Sustained Drones

Duration Transformation

Typical transformation: Source slice: 0.2 seconds (brief moment) Stretch factor: 10x Output: 0.2 × 10 = 2.0 seconds (sustained pad) Source slice: 0.5 seconds (short phrase) Stretch factor: 16x Output: 0.5 × 16 = 8.0 seconds (long drone) Why short sources? - Brief moments → less internal variation - Less variation → smoother Paulstretch - Smoother stretch → more ambient character - Result: Pure tones/drones from fleeting instants Compare to long sources: Source: 2.0s (complex phrase) Stretched 8x: 16s (still shows internal evolution) Less "frozen" feeling, more evolving

Perceptual Effect

Short source (0.1-0.5s):

Long source (1.0-3.0s):

🎵 Musical Metaphor

Imagine photographing sound:

  • Short exposure (0.1s slice): Captures single instant, frozen, sharp
  • Paulstretch = time magnification: Enlarges instant to visible/audible duration
  • Result: Microscopic view of brief moment, "sound under magnifying glass"

Like macro photography revealing details invisible to naked eye, this reveals spectral character of fleeting moments.

Center Positioning Strategy

Temporal Alignment

Why center stretched slices?

SOURCE SLICE: Position: 5.0s Duration: 0.3s Center: 5.0 + 0.3/2 = 5.15s STRETCHED (8x): Duration: 0.3 × 8 = 2.4s POSITIONING OPTIONS: Option A: Align start (5.0s) Stretched: [5.0s ────────── 7.4s] Original: [5.0s ─ 5.3s] Problem: Stretched extends far into future Option B: Align center (5.15s) Stretched: [3.95s ────5.15s──── 6.35s] Original: [5.0s ─ 5.15s ─ 5.3s] Benefit: Symmetrical expansion around moment Perceptual: "Zooming in" on instant Option B (center) creates sense of temporal magnification Original context preserved spatially

Paulstretch Details (Per Slice)

Frame-by-Frame Processing

For each slice (independently):

INPUT: Short slice (0.3s example) STEP 1: Divide into overlapping frames Window size: 0.25s (default) Overlap: 50% (default) Frames: ~6 frames for 0.3s input STEP 2: Process each frame Extract frame → FFT → Randomize phases → IFFT STEP 3: Overlap-add with extended hop hop_in = window × (1-overlap) / stretch_factor hop_out = window × (1-overlap) Ratio = stretch_factor OUTPUT: Stretched slice (0.3s × 8 = 2.4s) Each slice independently Paulstretched No correlation between slice phases Result: Independent ambient drones per channel

Quality Considerations

Optimal Paulstretch parameters for short slices:

If window_size > slice_duration:

Multi-Channel Spatial Distribution

Channel Content

Example: 4 segments, 8x stretch CH1 (Original): Full original audio, unchanged Duration: 10s (+ padding for stretched slices) Function: Reference, context, anchor CH2 (Slice 1 stretched): Brief moment from original Positioned at original temporal center Duration: ~2s stretched drone Rest: Silence CH3 (Slice 2 stretched): Different moment Different positioning Different duration (random slice length) Independent ambient texture CH4-5: Similar pattern Result: Constellation of drones Each from different temporal source point Spatially distributed for diffusion

Spatial Mixing Strategies

In DAW or multi-speaker system:

Complete Algorithm

INITIALIZE: Determine input (mono/stereo) Extract/duplicate source for slicing Calculate padding: max_duration × stretch_factor Pad CH1 to accommodate longest stretch FOR each segment (1 to N): STAGE A: Random Extraction duration = random(min_duration, max_duration) start = random(0, total_duration - duration) Extract slice [start, start+duration] STAGE B: Paulstretch Slice Divide slice into frames (window_size, overlap) FOR each frame: Extract → FFT → Randomize phases → IFFT → Window Overlap-add with extended hop (stretch_factor) Result: Stretched slice STAGE C: Position in Channel original_center = start + duration/2 stretched_start = center - stretched_duration/2 Create silent channel (padded_duration) Copy stretched slice to position Store as chan_ids[i] END FOR COMBINE: CH1 (original) + chan_ids[1..N] Create multi-channel Sound Normalize peak to 0.99 OUTPUT: Multi-channel ambient constellation

Comparison to Related Techniques

TechniqueSlicingStretchingChannelsCharacter
Traditional PaulstretchNoEntire fileMono/StereoSingle continuous drone
Granular SynthesisMany tinyVariableMono/StereoCloud textures, mixed
Multi-ch Duration StretchRandomPSOLAMulti (1+N)Time-varied fragments
This ScriptRandom shortPaulstretchMulti (1+N)Ambient drone constellation
Spectral FreezingNoInfiniteMono/StereoStatic sustained chord

Parameters

Parameter Table

ParameterTypeDefaultDescription
number_of_segmentspositive4Number of slices to extract/stretch
min_durationreal0.1Minimum slice duration (seconds)
max_durationreal0.5Maximum slice duration (seconds)
stretch_factorpositive4.0Paulstretch expansion multiplier
window_sizepositive0.25Paulstretch frame size (seconds)
overlap_percentpositive50Paulstretch frame overlap (0-90%)

Parameter Details

number_of_segments

Range: 1-10 (practical 2-6)

Default: 4

Effect:

Processing time: Linear scaling — 4 segments × 1 min each = 4 min total

min_duration & max_duration

Range: 0.05-2.0 seconds (practical 0.1-1.0)

Defaults: 0.1s (min), 0.5s (max)

Recommendations:

Sweet spot: 0.1-0.5s — captures moments without too much internal variation

stretch_factor

Range: 2.0-100.0+ (practical 4.0-20.0)

Default: 4.0 (4× expansion)

Effect:

Combined with short slices: 0.2s × 10x = 2s drone from fleeting instant

window_size

Range: 0.1-1.0 seconds

Default: 0.25 seconds

Effect: See Paulstretch documentation. Larger = smoother, smaller = more textured. For short slices, window often larger than slice (script handles padding).

overlap_percent

Range: 25-75%

Default: 50%

Effect: Higher = smoother Paulstretch, lower = faster processing. 50% optimal for quality/speed balance.

Recommended Combinations

🌊 Gentle Ambient (Default)

Settings: 4 segments, 0.1-0.5s slices, 4x stretch

Character: Moderate ambient texture, clear spatial separation

Processing time: ~2-4 minutes

✨ Dense Drone Cloud

Settings: 8 segments, 0.05-0.2s slices, 12x stretch

Character: Many short moments → long overlapping drones

Processing time: ~8-15 minutes (LONG)