Visual Game of Life Synthesis โ€” User Guide

Cellular automata sonification: real-time visualization and audio synthesis from Conway's Game of Life patterns. Watch evolution unfold while hearing it as evolving sound textures.

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

What this does

๐ŸŽฎ Conway's Game of Life (1970)

The zero-player game: Created by mathematician John Horton Conway. A cellular automaton that evolves from initial state according to simple rules. Despite simplicity, exhibits emergence, self-organization, and complex behavior. Turing-complete: can simulate any Turing machine. This plugin brings Life to life with synchronized visual and audio representation.

This script implements real-time cellular automata sonification โ€” converting Game of Life patterns into sound while visualizing their evolution. Each generation becomes a musical "phrase" where living cells generate sine tones with frequencies determined by their grid position. The plugin combines visual simulation with audio synthesis, creating a synesthetic experience where you can watch patterns evolve while hearing their sonic representation.

Key Features:

What is cellular automata sonification? Traditional synthesis: Oscillators, samples, physical models. Cellular automata sonification: Convert state changes in computational systems directly to sound. Game of Life as musical system: Each cell = potential sound source. Birth/death = note on/off. Pattern motion = melodic/harmonic movement. Density = amplitude/texture. Synesthetic approach: Visual patterns have inherent musical qualities when mapped appropriately. Advantages: (1) Emergent complexity: Simple rules generate complex musical structures. (2) Visual-audio connection: Direct correlation between what you see and hear. (3) Generative composition: Infinite variations from initial conditions. (4) Educational: Learn cellular automata through multi-sensory experience. Use cases: Algorithmic music, generative art, educational demonstrations, data sonification, interactive installations, meditation/visualization.

Technical Implementation: (1) Grid initialization: Create Nร—N grid with pattern. (2) Visualization loop: For each generation: display grid with color coding, count active cells, show progress. (3) Sonification: Convert active cells to sine tones with Hanning envelopes. (4) Frequency mapping: Map cell position (x+y) to frequency range. (5) Amplitude scaling: Scale amplitude inversely with active cell count. (6) Evolution: Apply Conway's B3/S23 rules with toroidal wrap. (7) Audio assembly: Accumulate generations into final sound. (8) Spatial processing: Apply mono or stereo filtering. (9) Final visualization: Display spectrogram of complete sonification.

Quick start

  1. In Praat, ensure no objects are selected (creates from cellular automaton).
  2. Run scriptโ€ฆ โ†’ Visual_Game_of_Life_Synthesis.praat.
  3. Choose Preset pattern or "Random Soup" for unpredictable results.
  4. Set Grid size (resolution) and Number of generations (evolution steps).
  5. Adjust Duration (total audio time) and Visualization delay (animation speed).
  6. Configure Base frequency and Frequency range for audio mapping.
  7. Choose Play during visualization to hear each generation as it evolves.
  8. Select Spatial mode (mono or stereo frequency separation).
  9. Click OK โ€” watch evolution while hearing sonification in real-time.
  10. Final spectrogram displayed; sound named "gol_[pattern]" saved.
Quick tip: Start with Blinker or Glider for simple, predictable evolution. Use Random Soup for complex, unpredictable textures. Adjust visualization delay to control animation speed (0.1-0.3 seconds works well). Enable play during visualization for immediate feedback. For musical results: set base frequency to musical note (e.g., 220 Hz = A3), use frequency range of 1-2 octaves. Larger grid sizes (32+) allow complex patterns but need more generations to evolve. Complex patterns like Glider Gun auto-adjust grid size and generation count. Watch for interesting patterns like oscillators, spaceships, and still lifes. Each run is unique with Random Soup.
Important: REAL-TIME PROCESSING โ€” visualization and sound generation occur simultaneously. Performance varies by grid size ร— generations โ€” large configurations may run slowly. Auto-adjustment: Some presets override grid size/number of generations for proper display. Toroidal universe: Edges wrap around (top connects to bottom, left to right). Active cell limit: Only first 25 cells per generation contribute to sound (prevents overload). Amplitude scaling: Many active cells = quieter individual tones. Frequency mapping: Cells at same diagonal produce same frequency. Visualization window: Keep Praat Picture window open. Stereo mode applies frequency-based panning (low=left, high=right). Be patient for long generations โ€” each step has visualization delay.

Game of Life Theory

Conway's Rules (B3/S23)

โš™๏ธ The Simple Rules of Complexity

Environment: Infinite 2D grid of cells, each either alive (1) or dead (0).

Neighborhood: Each cell has 8 neighbors (Moore neighborhood).

Rules per generation:

  1. Birth: Dead cell with exactly 3 live neighbors becomes alive
  2. Survival: Live cell with 2 or 3 live neighbors stays alive
  3. Death: Live cell with fewer than 2 (underpopulation) or more than 3 (overpopulation) neighbors dies

Notation: B3/S23 = Born with 3 neighbors, Survives with 2 or 3 neighbors.

Mathematical formulation: Let cell[i,j] โˆˆ {0,1} at generation t Let neighbors(i,j) = โˆ‘โˆ‘ cell[i+di, j+dj] for di,dj โˆˆ {-1,0,1}, (di,dj)โ‰ (0,0) Evolution to generation t+1: cell_next[i,j] = 1 if (cell[i,j]=0 AND neighbors(i,j)=3) # Birth 1 if (cell[i,j]=1 AND neighbors(i,j)โˆˆ{2,3}) # Survival 0 otherwise # Death Toroidal implementation (wraparound edges): If i+di < 1: use grid_size If i+di > grid_size: use 1 Same for j+dj Neighbor counting pseudocode: neighbors = 0 FOR di = -1 TO 1 FOR dj = -1 TO 1 IF NOT (di=0 AND dj=0) ni = i + di nj = j + dj IF ni < 1: ni = grid_size IF ni > grid_size: ni = 1 IF nj < 1: nj = grid_size IF nj > grid_size: nj = 1 neighbors = neighbors + cell[ni, nj] ENDIF ENDFOR ENDFOR

Pattern Classification

๐Ÿ” Categories of Life Forms

Still Lifes: Patterns that don't change

  • Block: 2ร—2 square
  • Beehive: hexagonal shape
  • Loaf: diamond with indent

Oscillators: Repeat after period P

  • Blinker: period 2 (3 cells in line)
  • Toad: period 2
  • Pulsar: period 3 (complex)
  • Pentadecathlon: period 15

Spaceships: Translate across grid

  • Glider: smallest, period 4, moves diagonally
  • Light/Medium/Heavyweight spaceship (LWSS/MWSS/HWSS)

Guns: Produce spaceships periodically

  • Gosper Glider Gun: most famous, period 30

Methuselahs: Long-lived small patterns

  • R-pentomino: 5 cells, evolves for 1103 generations
  • Acorn: 7 cells, evolves for 5206 generations

Computational Significance

๐Ÿงฎ Turing Completeness

Theory proved: Game of Life is Turing complete (can simulate any Turing machine).

Implications: Can perform any computation given enough space and time.

Practical constructions:

  • Logic gates: AND, OR, NOT from glider streams
  • Memory: Using blocks and eaters
  • Counters: Period-multiplying circuits
  • Universal computer: Has been constructed in Life

For sonification: Patterns represent computational processes โ€” sound reflects computation unfolding.

Visualization System

Four-part visualization during evolution: 1. TITLE AREA (top): "Game of Life: [Pattern Name]" "Generation X/Y | Active: N cells" Font size 14/11, centered 2. GRID VISUALIZATION (main area): Viewport: (0.8, 7.2, 1.2, 5.5) Axes: (0, grid_size, 0, grid_size) Background: light gray (0.95, 0.95, 0.95) Live cells: colored by position Grid lines: gray (0.75, 0.75, 0.75) Border: black, thickness 2 3. CELL COLORING: For cell at (i,j): hue = (i + j) / (2 ร— grid_size) r = 0.1 + 0.4 ร— hue g = 0.4 - 0.2 ร— hue b = 0.7 - 0.4 ร— hue Creates rainbow gradient across diagonals Helps visualize spatial relationships 4. PROGRESS BAR (bottom): Viewport: (0.8, 7.2, 5.7, 6.0) Axes: (0, 1, 0, 1) Progress = generation / total_generations Bar color: (0.3, 0.6, 0.4) - green 5. FINAL SPECTROGRAM: After evolution complete Shows frequency-time evolution of entire sonification Frequency range: base_freq to base_freq + rangeร—1.3 Time range: 0 to total_duration

Sonification Method

๐ŸŽต From Cells to Sound

Mapping philosophy: Each living cell = potential sound source. Birth = note on, death = note off. Pattern evolution = musical development.

Three-level mapping:

  1. Spatial โ†’ Frequency: Cell position determines pitch
  2. Density โ†’ Amplitude: Cell count determines volume
  3. Temporal โ†’ Envelope: Generation timing determines rhythm

Frequency Mapping Algorithm

POSITION TO FREQUENCY: For cell at position (i,j) in grid_size ร— grid_size: 1. Calculate normalized position: pos_norm = (i + j - 2) / (2 ร— grid_size - 2) Where: i,j โˆˆ [1, grid_size] Minimum: i=j=1 โ†’ pos_norm = 0 Maximum: i=j=grid_size โ†’ pos_norm = 1 Diagonal lines have same frequency: (1,1) = frequency_min (2,1) = (1,2) = same frequency (grid_size, grid_size) = frequency_max 2. Map to frequency range: freq = base_frequency_Hz + pos_norm ร— frequency_range_Hz 3. Example: grid_size=16, base=200 Hz, range=600 Hz Cell at (1,1): freq = 200 + 0 ร— 600 = 200 Hz Cell at (8,8): pos_norm = (8+8-2)/(30) = 14/30 โ‰ˆ 0.467 freq = 200 + 0.467ร—600 = 480 Hz Cell at (16,16): pos_norm = (16+16-2)/(30) = 30/30 = 1 freq = 200 + 1ร—600 = 800 Hz MUSICAL INTERPRETATION: Base frequency = tonic/root note Frequency range = pitch range (typically 1-2 octaves) Diagonal cells = same pitch class (harmonically related) Vertical/horizontal movement = pitch change

Amplitude & Envelope Design

AMPLITUDE SCALING: 1. Per-cell base amplitude: base_amp = 0.4 (maximum for single cell) 2. Density-based scaling: For generation with active_count living cells: amp_scale = 1 / โˆšmax(1, active_count) Rationale: Many cells โ†’ each quieter to prevent clipping 3. Final cell amplitude: cell_amp = base_amp ร— amp_scale 4. Example: active_count = 9 amp_scale = 1 / โˆš9 = 1/3 โ‰ˆ 0.333 cell_amp = 0.4 ร— 0.333 โ‰ˆ 0.133 ENVELOPE DESIGN (per generation): 1. Generation timing: step_duration = total_duration / number_of_generations step_start = (generation-1) ร— step_duration step_end = generation ร— step_duration 2. Hanning window envelope: envelope(t) = [1 - cos(2ฯ€ ร— (t - step_start) / step_duration)] / 2 Where t โˆˆ [step_start, step_end] Properties: - Smooth fade in/out (no clicks) - Integrates to step_duration/2 - Zero at boundaries, maximum at center 3. Complete cell signal formula: signal(t) = cell_amp ร— sin(2ฯ€ ร— freq ร— t) ร— envelope(t)

Audio Generation Process

STEP-BY-STEP GENERATION: Initialize: output_sound = CreateSound(duration, samplerate, "0") For generation = 1 to number_of_generations: 1. Count active cells in current generation 2. Build formula string for this generation: formula$ = "0" cell_count = 0 FOR each cell (i,j) in grid: IF cell[i,j] = 1 AND cell_count < 25: # Calculate parameters freq = base_freq + ((i+j-2)/(2*grid_size-2)) ร— freq_range amp = 0.4 / sqrt(max(1, active_count)) t_start = (generation-1) ร— step_duration t_end = generation ร— step_duration # Create cell formula cell_formula$ = " + if x >= " + t_start + " and x < " + t_end + " then " + amp + " * sin(twoPi * " + freq + " * x) * (1 - cos(twoPi * (x - " + t_start + ") / " + step_duration + ")) / 2 else 0 fi" formula$ = formula$ + cell_formula$ cell_count = cell_count + 1 ENDIF ENDFOR 3. Apply to output sound: output_sound.Formula = "self + (" + formula$ + ")" 4. Optional: Play this generation IF play_during_visualization AND active_count > 0: Create temporary sound with formula$ Scale peak to 0.7 Play Remove temporary sound Rationale for 25-cell limit: Prevents formula becoming too large for Praat 25 cells ร— 8 presets = 200 max simultaneous tones Usually sufficient for musical density

Spatial Audio Processing

TWO SPATIAL MODES: 1. MONO: Single channel output All frequencies mixed together Simple, direct 2. STEREO (POSITION-BASED): Creates frequency-based stereo separation Process: a. Create left channel: Copy original โ†’ left_sound Apply low-pass filter: 0 to (base_freq + 0.5ร—freq_range) Keeps lower half of frequency range b. Create right channel: Copy original โ†’ right_sound Apply band-pass filter: base_freq to (base_freq + 1.5ร—freq_range) Keeps upper half of frequency range c. Combine to stereo: left_sound + right_sound โ†’ stereoSound Result: Lower frequencies in left ear, higher in right Filter specifications: Filter type: Hann band Smoothing: 100 Hz transition Creates natural stereo image without abrupt cuts Musical effect: Creates spatial width Helps distinguish dense textures Mimics natural hearing (low frequencies more omnidirectional) Alternative approach (not implemented): Could use actual cell x-position for panning Left-right in grid maps to stereo pan position Current implementation uses frequency separation instead

Complete Sonification Pipeline

OVERVIEW: SETUP: Parse parameters Initialize grid with chosen pattern Auto-adjust grid/generations for certain presets Create output sound buffer MAIN LOOP (per generation): โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 1. VISUALIZATION โ”‚ โ”‚ โ€ข Display grid with color-coded cells โ”‚ โ”‚ โ€ข Show generation counter โ”‚ โ”‚ โ€ข Show active cell count โ”‚ โ”‚ โ€ข Update progress bar โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 2. SONIFICATION โ”‚ โ”‚ โ€ข Convert active cells to frequency values โ”‚ โ”‚ โ€ข Calculate amplitudes (density-scaled) โ”‚ โ”‚ โ€ข Build audio formula for generation โ”‚ โ”‚ โ€ข Add to accumulating output sound โ”‚ โ”‚ โ€ข Optionally play generation immediately โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ 3. EVOLUTION โ”‚ โ”‚ โ€ข Apply B3/S23 rules to all cells โ”‚ โ”‚ โ€ข Toroidal edge wrapping โ”‚ โ”‚ โ€ข Update cell states for next generation โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ Sleep for visualization_delay seconds โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ POST-PROCESSING: โ€ข Apply 20ms fade in/out to entire sound โ€ข Apply spatial processing (mono/stereo) โ€ข Normalize peak to 0.9 โ€ข Display final spectrogram OUTPUT: โ€ข Sound object: "gol_[pattern_name]" โ€ข Visual record in Praat Picture window โ€ข Info window with generation summary

Pattern Library

๐Ÿ“š Classic Game of Life Patterns

Eight carefully selected patterns representing different categories of Life behavior. Each creates distinct sonic character.

Simple Patterns

PatternCellsBehaviorSonic CharacterAuto-adjusted
Random Soup~35% of gridChaotic evolution, eventual stabilizationDense, noisy, unpredictableNo
Glider5 cellsMoves diagonally, period 4Simple repeating motif, moving pitchNo
Blinker3 cellsOscillator, period 2Alternating two-note patternNo

Complex Oscillators

PatternCellsBehaviorSonic CharacterAuto-adjusted
Pulsar48 cellsPeriod 3 oscillator, symmetricalThree-phase rhythm, harmonic clustersGrid โ‰ฅ17
R-pentomino5 cellsMethuselah, 1103 generationsEvolving texture, gradual complexityNo
Acorn7 cellsMethuselah, 5206 generationsSlow development, sparse to denseNo

Moving Patterns

PatternCellsBehaviorSonic CharacterAuto-adjusted
Lightweight Spaceship (LWSS)8 cellsMoves right, period 4Pitch glide, rhythmic engineNo
Glider Gun (Gosper)36 initialProduces gliders every 30 gensComplex rhythm, glider motifsGrid โ‰ฅ38, Gens โ‰ฅ40

Pattern Details & Setup

R-PENTOMINO (Methuselah): Pattern: Sonic interpretation: โ–ชโ–ช Two close pitches (birth) โ–ชโ–ชโ–ช Developing cluster Evolution: Creates gliders, blocks, beehives Sonic: Starts sparse, becomes complex texture ACORN (Methuselah): Pattern: Sonic: โ–ช โ–ช Widely spaced pitches โ–ช Central tone emerges โ–ช โ–ช โ–ช Expanding harmony Famous for long, interesting evolution GLIDER GUN (Gosper): Left block: Constant drone (stable) Gun mechanism: Rhythmic engine sound Glider output: Periodic melodic elements Right block: Secondary drone Complete system: Self-sustaining ecosystem AUTO-ADJUSTMENT LOGIC: IF preset = "Pulsar" AND grid_size < 17: grid_size = 17 # Needs space for pattern IF preset = "Glider Gun": grid_size = max(38, grid_size) # Large grid needed number_of_generations = max(40, number_of_generations) # See gliders Other patterns use user settings

Parameter Reference

ParameterTypeDefaultRangeDescription
PresetoptionRandom Soup1-8Initial pattern configuration
Grid_sizeinteger164-100Width/height of cellular universe
Number_of_generationsinteger251-1000Evolution steps to simulate
Duration_spositive5.00.1-60Total audio duration in seconds
Visualization_delaypositive0.150.01-1.0Delay between generations (animation speed)
Sample_rate_Hzinteger441008000-192000Audio sample rate
Base_frequency_Hzpositive20020-2000Lowest frequency for sonification
Frequency_range_Hzpositive60050-2000Pitch range from base frequency
Play_during_visualizationboolean10/1Hear each generation as it evolves
Play_final_resultboolean10/1Play complete sonification after visualization
Spatial_modeoption11-2Mono or stereo frequency separation

Applications

Algorithmic Music Composition

Use case: Generate musical structures from computational processes

Techniques:

Educational Demonstrations

Use case: Teach cellular automata, emergence, complexity

Techniques:

Generative Art & Installations

Use case: Create evolving audiovisual installations

Techniques:

Data Sonification

Use case: Convert other 2D data into Game of Life for sonification

Techniques:

Practical Workflow Examples

๐ŸŽต Minimalist Composition

Goal: Create sparse, meditative piece from simple Life patterns

Settings:

  • Pattern: Glider (simple, predictable)
  • Grid: 8ร—8 (small, intimate)
  • Generations: 64 (power of 2 for musical structure)
  • Duration: 32 seconds (0.5s per generation)
  • Base frequency: 110 Hz (A2, fundamental)
  • Range: 880 Hz (4 octaves, A2 to A6)
  • Play during: Yes (hear evolution)
  • Spatial: Stereo

Result: Slowly moving pitch patterns with clear glider motion

Post-process: Add reverb, layer multiple runs at different speeds

๐Ÿซ Classroom Demonstration

Goal: Show emergence and complex systems

Settings:

  • Pattern: Random Soup (unpredictable)
  • Grid: 24ร—24 (visible complexity)
  • Generations: 100 (show full evolution)
  • Duration: 30 seconds (fast enough to hold attention)
  • Visual delay: 0.3s (time to observe)
  • Play during: Yes (immediate feedback)
  • Base frequency: 220 Hz (A3, clear pitch)

Educational points:

  1. Watch ordered structures emerge from randomness
  2. Listen to density changes (more cells = denser sound)
  3. Identify oscillators and still lifes by their sonic signatures
  4. Discuss how simple rules create complex behavior

๐ŸŽจ Generative Sound Design

Goal: Create evolving textures for film/game backgrounds

Settings:

  • Pattern: Acorn (long, interesting evolution)
  • Grid: 32ร—32 (space for development)
  • Generations: 200 (extended evolution)
  • Duration: 60 seconds (slow evolution)
  • Base frequency: 82 Hz (E2, low and atmospheric)
  • Range: 400 Hz (approx. 2.5 octaves)
  • Spatial: Stereo (creates width)
  • Play during: No (process silently)

Result: Evolving atmospheric pad sound

Post-process: Add delay, reverb, subtle modulation

Use: Background for sci-fi, horror, or abstract scenes

Advanced Techniques

Musical parameter mapping strategies:
  • Scale quantization: Map frequencies to nearest notes in chosen scale
  • Dynamic range compression: Apply compression to even out density changes
  • Multi-voice extraction: Extract different pattern elements to separate tracks
  • Tempo synchronization: Set generation duration to match musical tempo
  • Pattern layering: Run multiple Life simulations simultaneously with different parameters
Creative pattern design:
  • Custom initial patterns: Modify script to load custom cell configurations
  • Asymmetric grids: Use rectangular instead of square grids
  • Multiple patterns: Initialize with several patterns at different positions
  • Interactive editing: Pause evolution, edit cells, continue
  • Rule variations: Experiment with different B/S rules (B36/S23, etc.)

Troubleshooting Common Issues

Problem: Visualization too slow
Causes: Large grid ร— many generations, short visualization delay
Solutions: Reduce grid size, reduce generations, increase visualization delay
Problem: Sound too sparse/quiet
Causes: Few active cells, small amplitude scaling
Solutions: Use denser pattern, increase base amplitude, reduce frequency range
Problem: Sound too dense/noisy
Causes: Many active cells, too many generations, large frequency range
Solutions: Use sparser pattern, reduce generations, narrow frequency range
Problem: Pattern dies out quickly
Causes: Small grid, isolated pattern, edge effects
Solutions: Increase grid size, use toroidal mode (default), choose robust pattern
Problem: Audio glitches/clicks
Causes: Abrupt envelope changes, too many simultaneous tones
Solutions: Ensure Hanning envelope applied, limit active cells (already limited to 25)
Problem: Praat becomes unresponsive
Causes: Very large grid ร— generations, complex patterns
Solutions: Use smaller configurations, be patient, check Praat memory settings

Performance Optimization

FOR INTERACTIVE USE: โ€ข Grid size: 16-32 (balance detail and speed) โ€ข Generations: 25-100 (enough to see evolution) โ€ข Visualization delay: 0.1-0.3s (responsive but visible) โ€ข Duration: 5-30 seconds (typical attention span) โ€ข Active cell limit: 25 (prevents audio overload) FOR RENDERING (BACKGROUND): โ€ข Grid size: 32-64 (more detail) โ€ข Generations: 100-500 (longer evolution) โ€ข Visualization delay: 0.01s (minimum for progress) โ€ข Play during: No (silent processing) โ€ข Duration: match artistic needs COMPUTATION BREAKDOWN: Per generation: โ€ข Cell updates: grid_sizeยฒ ร— 8 neighbor checks โ€ข Visualization: grid_sizeยฒ cell draws โ€ข Audio: up to 25 sine tone calculations โ€ข Progress updates: constant Example (grid=32, generations=100): โ€ข Cell updates: 32ยฒ ร— 8 ร— 100 = 819,200 operations โ€ข Visualization: 32ยฒ ร— 100 = 102,400 cell draws โ€ข Audio: 25 ร— 100 = 2,500 tone calculations MEMORY USAGE: โ€ข Cell arrays: 2 ร— grid_sizeยฒ integers โ€ข Output sound: duration ร— sample_rate samples โ€ข Temporary sounds: per generation if playing during Example (grid=32, duration=10s, 44.1kHz): โ€ข Cell arrays: 2 ร— 1024 ร— 4 bytes โ‰ˆ 8KB โ€ข Output sound: 10 ร— 44100 ร— 4 bytes โ‰ˆ 1.76MB

Technical Implementation Details

Cell Data Structures

TWO-ARRAY SYSTEM: 1. Current generation array: cell[i,j] โˆˆ {0,1} for i,j โˆˆ [1, grid_size] Represents current state 2. Previous generation array: oldCell[i,j] โˆˆ {0,1} Used for neighbor counting during evolution Prevents interference from newly updated cells Memory allocation: Dynamic based on grid_size Example: grid_size=32 โ†’ 1024 cells per array Each cell: 1 integer (0 or 1) Evolution algorithm: FOR generation = 1 to number_of_generations: # Copy current to old FOR i = 1 to grid_size FOR j = 1 to grid_size oldCell[i,j] = cell[i,j] ENDFOR ENDFOR # Apply rules using old state FOR i = 1 to grid_size FOR j = 1 to grid_size neighbors = count_neighbors(oldCell, i, j) # Apply B3/S23 rules to cell[i,j] ENDFOR ENDFOR Advantage: Clear separation between generations Disadvantage: Doubles memory (acceptable for typical sizes)

Toroidal Edge Handling

WRAPAROUND IMPLEMENTATION: Neighbor counting with toroidal topology: function count_neighbors(grid, i, j): neighbors = 0 FOR di = -1 to 1 FOR dj = -1 to 1 IF NOT (di=0 AND dj=0) ni = i + di nj = j + dj # Wrap around edges IF ni < 1: ni = grid_size ELSIF ni > grid_size: ni = 1 IF nj < 1: nj = grid_size ELSIF nj > grid_size: nj = 1 neighbors = neighbors + grid[ni, nj] ENDIF ENDFOR ENDFOR RETURN neighbors Alternative approaches considered: 1. Fixed boundaries: Cells at edges have fewer neighbors 2. Reflective boundaries: Mirror image at edges 3. Toroidal (implemented): Continuous universe Why toroidal: โ€ข More natural for continuous evolution โ€ข No edge effects (patterns can cross boundaries) โ€ข Consistent neighbor count for all cells โ€ข Common in Life implementations Musical implication: โ€ข Patterns can reappear from opposite side โ€ข Creates longer evolutionary cycles โ€ข More sustained sonic development

Formula String Construction

DYNAMIC FORMULA BUILDING: Challenge: Praat's Formula command needs complete expression Solution: Build string incrementally Process: 1. Start with "0" (silence) 2. For each active cell (up to 25): Build cell component: " + if x >= [start] and x < [end] " " then [amp] * sin(twoPi * [freq] * x) " " * (1 - cos(twoPi * (x - [start]) / [duration])) / 2 " " else 0 fi" 3. Result example: "0 + if x >= 0.0 and x < 0.2 then 0.1 * sin(twoPi * 300 * x) * (1 - cos(twoPi * (x - 0.0) / 0.2)) / 2 else 0 fi" " + if x >= 0.0 and x < 0.2 then 0.08 * sin(twoPi * 450 * x) * (1 - cos(twoPi * (x - 0.0) / 0.2)) / 2 else 0 fi" ... 4. Apply to sound: sound.Formula = "self + (" + formula$ + ")" Performance considerations: โ€ข String concatenation can be slow for many cells โ€ข Limited to 25 cells for practical reasons โ€ข Formula evaluation per sample is efficient in Praat Alternative approach: Could use sample-by-sample loop in Praat Current approach leverages Praat's optimized formula evaluation

Visual-Audio Synchronization

REAL-TIME COORDINATION: Three concurrent processes per generation: 1. VISUAL UPDATE: โ€ข Clear Picture window โ€ข Draw grid with current cell states โ€ข Update title with generation info โ€ข Draw progress bar โ€ข Display to screen 2. AUDIO GENERATION: โ€ข Count active cells โ€ข Calculate frequencies/amplitudes โ€ข Build formula string โ€ข Add to accumulating sound โ€ข Optionally play generation sound 3. CELL EVOLUTION: โ€ข Copy current to old array โ€ข Apply B3/S23 rules to all cells โ€ข Prepare next generation Timing control: โ€ข Generation processing time varies with active cells โ€ข Fixed visualization_delay ensures consistent pacing โ€ข sleep(visualization_delay) at end of each generation โ€ข Total time โ‰ˆ generations ร— (processing_time + delay) Synchronization guarantee: โ€ข Audio always matches displayed generation โ€ข Evolution occurs after audio generation โ€ข No race conditions (sequential processing) User experience: โ€ข Watch pattern evolve โ€ข Hear corresponding sound โ€ข See progress bar advance โ€ข Final spectrogram shows complete evolution

Historical & Theoretical Context

John Horton Conway (1937-2020)

๐Ÿงฎ The Mathematician Behind Life

Background: British mathematician active in finite groups, knot theory, game theory, and coding theory. Professor at Princeton University.

Game of Life creation: Developed in 1970 while at Cambridge University. Inspired by John von Neumann's earlier work on self-replicating automata.

Design criteria: Conway wanted rules that were: (1) simple, (2) unpredictable, (3) allowed growth, (4) allowed death, (5) nontrivial patterns possible.

Cultural impact: One of first examples of "emergence" in popular culture. Early computer game (predates Pong). Inspired generations of programmers and mathematicians.

Cellular Automata Theory

๐Ÿ”ฌ Mathematical Foundations

Definition: Discrete model studied in computability theory, mathematics, physics, complexity science, theoretical biology...

Components:

  • Grid: Regular lattice of cells
  • States: Finite set (for Life: {0,1})
  • Neighborhood: Cells that influence each cell (Life: Moore neighborhood of 8)
  • Rule: Function from neighborhood states to new state

Wolfram's Classes (1984):

  1. Class 1: Evolve to homogeneous state (still lifes)
  2. Class 2: Evolve to simple separated periodic structures (oscillators)
  3. Class 3: Evolve to chaotic aperiodic patterns (chaotic soups)
  4. Class 4: Evolve to complex localized structures including propagating structures (Life: gliders, guns)

Life is Class 4: Capable of universal computation, most interesting behavior.

Sonification & Audification

๐Ÿ‘‚ Hearing Data

Definition: Use of non-speech audio to convey information or perceptualize data.

Related concepts:

  • Audification: Direct playback of data as sound (e.g., seismic data)
  • Parameter mapping sonification: Map data dimensions to sound parameters (Life: positionโ†’frequency, densityโ†’amplitude)
  • Model-based sonification: Data drives sound model (Life: cellular automata as sound generator)
  • Auditory display: Using sound for data representation

Life sonification approaches:

  1. Direct mapping (this plugin): Cellsโ†’tones, simple and intuitive
  2. Statistical sonification: Map population statistics to sound parameters
  3. Pattern-based: Recognize patterns, assign musical motifs
  4. Interactive: User explores space, hears corresponding patterns

Benefits for Life: Makes abstract patterns concrete, reveals temporal structures, engages multiple senses.

Related Work & Extensions

OTHER CELLULAR AUTOMATA SONIFICATION PROJECTS: 1. CELLULAR AUTOMATA MUSIC (1980s-): โ€ข Yoichiro Kawaguchi: "Growth Model" series โ€ข Peter Beyls: CA music composition systems โ€ข Eduardo Miranda: "Cellular Automata Music" (2001) 2. GAME OF LIFE SPECIFIC: โ€ข "Life Music" projects (various) โ€ข MIDI implementations (map cells to notes) โ€ข Real-time visual+audio installations 3. EXTENSIONS OF THIS IMPLEMENTATION: Possible enhancements: โ€ข Different rulesets (Seeds, HighLife, etc.) โ€ข 3D cellular automata (3D visualization+sound) โ€ข Continuous cell states (grayscaleโ†’amplitude) โ€ข Interactive pattern editing during evolution โ€ข Networked multiplayer Life with sound โ€ข Genetic algorithm evolution of interesting sounds 4. PRAAT-SPECIFIC EXTENSIONS: Could integrate with: โ€ข Praat's synthesis capabilities (formants, filters) โ€ข Praat's analysis (extract features from evolution) โ€ข Praat's scripting for batch generation โ€ข Praat's object-oriented programming for modular design PHILOSOPHICAL DIMENSION: Life sonification raises questions about: โ€ข Nature of computation and its perception โ€ข Relationship between simple rules and complex experience โ€ข Cross-modal perception (seeing vs. hearing patterns) โ€ข Aesthetics of algorithmic processes

Further Reading & Resources

Primary sources:

  • Gardner, M. (1970). "Mathematical Games: The fantastic combinations of John Conway's new solitaire game 'Life'." Scientific American, 223(4), 120-123.
  • Berlekamp, E. R., Conway, J. H., & Guy, R. K. (1982). Winning Ways for Your Mathematical Plays, Volume 2. Academic Press.
  • Wolfram, S. (2002). A New Kind of Science. Wolfram Media. (Chapter 3: Cellular automata)

Sonification literature:

  • Hermann, T., Hunt, A., & Neuhoff, J. G. (Eds.). (2011). The Sonification Handbook. Logos Publishing.
  • Miranda, E. R. (2001). "Evolving cellular automata music: From sound synthesis to composition." Proceedings of the 2001 Workshop on Artificial Life Models for Musical Applications.

Online resources:

  • ConwayLife.com: Extensive pattern library and community
  • Online Life simulators: Golly, LifeViewer, etc.
  • Life Lexicon: Dictionary of Life patterns and terminology
  • Sonification.de: Research and resources on sonification