Ligeti Micropolyphonic Choir Machine — User Guide
Algorithmic texture generation inspired by György Ligeti's micropolyphony: creates complex choral textures through formal arcs, Gaussian distributions, and stereo asymmetry.
What this does
This script implements Ligeti-inspired micropolyphonic texture generation — creating complex choral clouds from a single sound source through algorithmic voice proliferation. The machine generates 2–60 independent voices, each with carefully controlled variations in timing, pitch, duration, panning, and amplitude. Inspired by György Ligeti's compositions like "Lux Aeterna" and "Atmosphères," this tool transforms monophonic or stereo material into dense, evolving textures through formal structural arcs, Gaussian distribution controls, and intentional stereo asymmetry.
Key Features:
- 6 Behavioral Presets — From static spectral fog to fracturing masses
- Formal Structural Arcs — Pitch evolution across voice indices
- Gaussian Distribution Control — Bell-curve density for natural clustering
- Stereo Asymmetry — Spatial tension through differential processing
- Bimodal Layering — Separate high/low strata with distinct behaviors
- Voice Management — Automatic gain staging, normalization, fade control
Technical Implementation: (1) Source selection: Single Sound object (mono or stereo) as source material. (2) Behavior selection: Choose preset or custom parameters defining structural logic. (3) Voice generation loop: For each voice (1 to n_voices): Calculate parameters based on structural logic (pitch, pan, timing), Apply pitch shift via resampling, Apply time stretch with duration variation, Apply fade envelope, Apply gain scaling, Apply panning (mono→stereo conversion), Apply time offset with distribution logic, Mix into output buffer. (4) Distribution logic: Flat (uniform) vs Gaussian (bell-curve) clustering. (5) Structural arcs: Parameters evolve systematically across voice indices. (6) Output normalization: Automatic gain management prevents clipping. The process creates a cumulative texture where individual voices blend into a cohesive mass.
Quick start
- In Praat, select exactly one Sound object (mono or stereo).
- Run script… →
ligeti_micropolyphonic_choir.praat. - Choose Preset: Start with "Breathing Field" for classic Ligeti texture.
- Adjust Number_of_voices (40-60 for dense clouds).
- Set Time_offset_range_s (0.5-1.2s for temporal spread).
- Configure Max_pitch_cents (8-35 cents for microtonal variation).
- Enable Stereo_spread for spatial distribution.
- Set Attack_fade_ms (15-50ms for smooth voice entries).
- Click OK — texture generated, result named "Ligeti_[structure]".
Micropolyphonic Theory
Ligeti's Micropolyphony Principles
🎵 Core Aesthetic Principles
Texture over Melody: Individual voices subordinate to collective mass
Micro-Variation: Small differences create complex interference patterns
Systematic Evolution: Parameters change according to formal plans
Spatial Thinking: Stereo placement as compositional parameter
Emergent Complexity: Simple rules → rich perceptual results
Formal Arcs (Structural Evolution)
Voice-index-dependent parameter evolution:
Gaussian vs Uniform Distributions
Distribution shapes for natural clustering:
Stereo Asymmetry Principles
Spatial Tension Design
Differential processing across channels:
Bimodal Stratification
High/Low Layer Separation
Creating distinct textural strata:
Complete Processing Pipeline
Behavioral Presets
Preset 1: Static Spectral Fog (Gaussian Mass)
🌫️ Dense, Motionless Texture
Structure: Uniform
Distribution: Gaussian (bell curve)
Character: Dense core with wispy edges, minimal motion
Inspiration: Ligeti's "static clouds" in Apparitions
Parameters: n_voices=60, pitch_max=8, time_range=0.5, dur_var=0.02
Use: Background pads, ambient beds, spectral masses
Preset 2: Fracturing Mass (Gradual Detuning Arc)
⚡ Evolution from Purity to Chaos
Structure: Arc_fracture (formal evolution)
Distribution: Flat (uniform)
Character: Systematic pitch expansion across voices
Inspiration: Textural development in Atmosphères
Parameters: n_voices=60, pitch_max=35, time_range=1.0, dur_var=0.08
Use: Dramatic transformations, structural development
Preset 3: Stereo Torsion (Left=Pure, Right=Detuned)
🎧 Spatial Tension Field
Structure: Asymmetry (pan-dependent pitch)
Distribution: Flat (uniform)
Character: Left channel stable, right channel chaotic
Inspiration: Spatialized textures in Requiem
Parameters: n_voices=50, pitch_max=25, time_range=0.6, dur_var=0.05
Use: Immersive composition, spatial effects, headphone music
Preset 4: Bimodal Web (High/Low Split)
🕸️ Interwoven Textural Layers
Structure: Bimodal (even/odd differentiation)
Distribution: Flat (uniform)
Character: Two distinct strata woven together
Inspiration: Contrapuntal thinking in micropolyphony
Parameters: n_voices=40, pitch_max=20, time_range=0.8, dur_var=0.1
Use: Complex textures, foreground/background interplay
Preset 5: Breathing Field (Uniform Cloud)
🌌 Classic Ligeti Texture
Structure: Uniform (traditional micropolyphony)
Distribution: Flat (uniform)
Character: Evenly distributed, organic motion
Inspiration: Lux Aeterna, choral micropolyphony
Parameters: n_voices=40, pitch_max=12, time_range=1.2, dur_var=0.08
Use: Choral transformations, ethereal textures, classic micropolyphony
Preset 6: Custom
🔧 Full Parameter Control
Structure: User-defined combination
Distribution: User choice (flat or Gaussian)
Character: Determined by custom parameters
Parameters: Full manual control
Use: Experimental designs, specific textural goals
Parameters
Preset Selection
| Parameter | Type | Default | Description |
|---|---|---|---|
| Preset | option | Breathing Field | Behavioral preset (1-6) |
Custom Parameters (when Preset = Custom)
| Parameter | Type | Default | Range | Description |
|---|---|---|---|---|
| Number_of_voices | positive | 60 | 2-100 | Total independent voices in texture |
| Time_offset_range_s | positive | 0.8 | 0.1-5.0 | Maximum time offset between voices |
| Duration_var_ratio | positive | 0.05 | 0.0-0.3 | Duration variation (± this ratio) |
| Max_pitch_cents | positive | 15.0 | 0.1-50.0 | Maximum pitch deviation in cents |
| Stereo_spread | boolean | 1 (yes) | yes/no | Enable stereo panning distribution |
| Attack_fade_ms | positive | 30 | 0-100 | Fade-in/out time per voice |
| Voice_gain | positive | 1.0 | 0.1-2.0 | Individual voice amplitude |
| Normalize_output | boolean | 1 (yes) | yes/no | Normalize final output to 0.99 peak |
Internal Behavior Parameters (Set by Presets)
| Parameter | Type | Description |
|---|---|---|
| structure$ | string | Structural logic (uniform, arc_fracture, asymmetry, bimodal) |
| dist_shape$ | string | Distribution shape (flat, gaussian) |
| n_voices | integer | Actual voice count after preset logic |
| time_range | real | Actual time offset range |
| pitch_max | real | Actual maximum pitch deviation |
| dur_var | real | Actual duration variation |
| gain | real | Actual voice gain |
| fade | real | Actual fade time in ms |
Applications
Choral Transformation
Use case: Transforming solo vocal recordings into choral ensembles
Technique: "Breathing Field" preset with 40-60 voices
Example: Solo soprano → Lux Aeterna-style choral cloud
Orchestral Texture Generation
Use case: Creating string pads, brass clouds from single samples
Technique: "Static Spectral Fog" with Gaussian distribution
Example: Single violin sustains → dense string cluster
Spatial Composition
Use case: Immersive, spatially distributed textures
Technique: "Stereo Torsion" with asymmetry enabled
Workflow:
- Create left-right tension fields
- Use headphone mixing for detailed spatial effects
- Combine with reverberation for room-filling textures
- Automate parameters for spatial motion
Algorithmic Composition
Use case: Generative music with evolving textures
Technique: "Fracturing Mass" for formal development
Advantages:
- Systematic transformation over time
- Reproducible structural arcs
- Parameter-controlled evolution
- Integration with other algorithmic processes
Example: Psychoacoustic studies of texture perception
Sound Design for Media
Use case: Creating atmospheric beds, tension textures
Technique: "Bimodal Web" for complex, layered sounds
Example: Sci-fi ambiance, dream sequences, transitional textures
Application: Film/TV scoring, game audio, installation sound
Teaching Micropolyphonic Principles
Use case: Demonstrating Ligeti's techniques aurally
Technique: Students adjust parameters, hear textural changes
Learning outcomes:
- Understand voice density/texture relationships
- Hear effect of distribution shapes
- Connect formal arcs to perceptual results
- Explore spatialization in texture design
Practical Workflow Examples
🎬 Film Score Textures (Suspense/Drama)
Goal: Evolving tension cloud for dramatic scenes
Settings:
- Preset: Fracturing Mass
- Source: Low string sustain
- Number_of_voices: 50
- Max_pitch_cents: 25
- Time_offset_range_s: 1.2
- Stereo_spread: Yes
Result: Slowly fracturing string cluster with systematic detuning
🎵 Choral Ambiance (New Music)
Goal: Lux Aeterna-style vocal cloud
Settings:
- Preset: Breathing Field
- Source: Soprano vowel ("ah")
- Number_of_voices: 40
- Max_pitch_cents: 12
- Time_offset_range_s: 0.8
- Attack_fade_ms: 40
Result: Traditional micropolyphonic choral texture
🔬 Psychoacoustic Research (Texture Perception)
Goal: Controlled stimuli for perception studies
Settings:
- Preset: Custom
- Structure: Uniform
- Distribution: Gaussian
- Number_of_voices: 30 (controlled variable)
- Max_pitch_cents: 15 (fixed)
- Documentation: Full parameter record
Result: Reproducible textural stimuli for experimental research
Advanced Techniques
- Sustained tones: Best results with minimal transients
- Harmonic richness: Complex spectra create richer interference
- Dynamic consistency: Avoid large amplitude variations
- Duration: 2-10 seconds ideal for voice proliferation
- Pre-processing: Consider noise reduction, equalization
Optimal sources: choir vowels, string sustains, organ chords, synth pads
- Reverberation: Adds space, blends voices further
- EQ: Shape spectral character of the mass
- Compression: Control dynamic range of dense textures
- Automation: Apply parameter changes over time
- Layering: Combine multiple texture generations
Troubleshooting Common Issues
Cause: Source material has transients, voices aligning periodically
Solution: Use more sustained source, increase time_offset_range, enable Gaussian distribution
Cause: Too much pitch variation, insufficient voices
Solution: Reduce Max_pitch_cents (try 5-15), increase voice count, add fade time
Cause: Random pan distribution clustering, asymmetry preset effects
Solution: Check stereo_spread setting, listen in mono for balance, adjust panning logic
Cause: High voice count, long source duration
Solution: Reduce n_voices, shorten source material, use faster computer
Technical Deep Dive
Mathematical Foundations
Gaussian Distribution Approximation
Central Limit Theorem application:
Pitch Ratio Calculation
Cents to frequency ratio conversion:
Gain Staging Mathematics
Voice Summation and Loudness
Managing cumulative amplitude:
Panning Laws
Constant-Power Panning
Stereo amplitude calculation: