Visual Game of Life Synthesis — User Guide

Conway B3/S23 cellular evolution mapped to generation-sized additive-synthesis events. Diagonal cell position controls frequency, optional X position controls constant-power stereo pan, and exact state history supports recurrence analysis and process visualization.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 1.1.1 (2026) License: MIT License Repo: Praat AudioTools
Contents:

What this does

The script generates audio directly from a Conway Game of Life simulation. It first computes and stores the complete sequence of cellular states, then sonifies every stored generation.

Process:
preset / Random Soup → B3/S23 evolution → exact state history → diagonal frequency aggregation → Hann generation kernel → mono or X-based constant-power stereo → concatenation → one final target peak normalization

No input Sound is required.

Each generation occupies an equal segment of the requested audio Duration. Every live cell contributes to the sonification; there is no 25-cell voice limit in v1.1.1.

Quick start

  1. Choose one of the eight initial patterns.
  2. Set Grid size, Number of generations, and total Duration.
  3. Set Base frequency and Frequency range.
  4. Choose Mono or Stereo constant-power X pan.
  5. Use Edit details for sample rate, Random Soup probability/seed, boundary mode, animation, and Output peak.
  6. Run the script. The complete Life evolution is calculated first, then all generations are synthesized and concatenated.

Life evolution

Rule

The cellular automaton uses Conway's standard B3/S23 rule with an eight-cell Moore neighborhood:

dead + exactly 3 live neighbors → birth
live + 2 or 3 live neighbors → survival
all other cases → dead

For every transition, the script records exact counts of births, deaths, and survivors.

Boundary behavior

The default is Fixed dead: neighbors outside the finite grid are treated as dead and do not wrap back into the opposite edge.

If Wrap edges is enabled in Details, the grid becomes toroidal: left connects to right and top connects to bottom.

The boundary choice can materially change moving or long-lived patterns. Fixed-dead is the default in v1.1.1; toroidal wrapping is optional.

Pattern presets

PresetInitialization / automatic adjustment
Random SoupEach cell is independently alive with the Details-page probability, default .35. A positive Random seed makes this initial state reproducible.
GliderCentered 3×3 glider; Grid size is raised to at least 8.
BlinkerCentered three-cell period-2 oscillator; Grid size at least 7.
PulsarCentered 13×13 pulsar; Grid size at least 17.
Glider Gun (Gosper)Centered 9×36 gun phase; Grid size at least 52 and Number of generations at least 40.
R-pentominoCentered five-cell seed; Grid size at least 9.
AcornCentered seven-cell seed; Grid size at least 11.
Lightweight SpaceshipCanonical nine-cell LWSS in a 5×4 box; Grid size at least 10.

Preset size adjustments happen before runtime safety checks, so the limits are evaluated using the actual grid and generation count that will be processed.

Cell-to-sound mapping

Diagonal position → frequency

Frequency depends on i + j, so cells on the same grid diagonal share exactly the same oscillator frequency.

d = i + j - 1
diagonal count = 2 × GridSize - 1

f(d) = BaseFrequency
+ [(d - 1) / (diagonalCount - 1)] × FrequencyRange

The lowest diagonal maps to Base frequency; the opposite corner maps to Base frequency + Frequency range.

Population-dependent cell amplitude

If a generation contains N live cells, every live cell begins with:

cell amplitude = 0.4 / sqrt(N)

This reduces per-cell gain as population increases without independently normalizing each generation.

Diagonal aggregation

Cells that share a diagonal also share frequency and local oscillator phase. Before synthesis, their gains are therefore added into one diagonal coefficient.

In Mono mode:

diagonal gain = sum of cell amplitudes for all live cells on that diagonal

This is mathematically equivalent to adding those coherent equal-frequency sinusoids separately, while requiring far fewer Formula terms.

Stereo constant-power X pan

Stereo mode does not split the spectrum with filters. Instead, each live cell's horizontal grid coordinate controls its left/right gains before cells are aggregated by diagonal.

p = (i - 1) / (GridSize - 1)

gainL = cos(πp / 2)
gainR = sin(πp / 2)

gainL² + gainR² = 1

The leftmost grid column is fully left, the rightmost column fully right, and the center uses equal-power gains of approximately .707 per channel.

Because several cells on one diagonal can have different X positions, left and right diagonal coefficients are accumulated separately.

Generation timing and synthesis kernel

Total Duration is divided equally:

generation duration = Duration / NumberOfGenerations

Each generation is synthesized as its own Sound of exactly this duration.

Local Hann window

Every generation uses the same raised-cosine / Hann-shaped kernel:

w(t) = [1 - cos(2πt / Tgen)] / 2

The window is zero at both generation boundaries and reaches 1 at the midpoint. All active diagonal sinusoids inside that generation are multiplied by this common window.

Local oscillator phase

Each generation Sound is generated on its own local time axis beginning at zero:

sin(2π f x)

Oscillator phase therefore restarts at each generation. The Hann kernel also reaches zero at each boundary, so successive generations join without a hard amplitude discontinuity.

Exact recurrence analysis

The script stores the exact binary board for every requested generation. Beginning with generation 2, each board is compared cell-by-cell against up to the six immediately preceding generations.

The first matching lag becomes that generation's recurrence period:

tested periods = 1 ... min(6, generation - 1)

The final status reported by the script is:

This is a state comparison, not a population heuristic. Two generations with the same number of live cells are not considered equal unless every cell state matches.

Controls

Main page

ControlDefaultMeaning
PresetRandom SoupInitial Life state.
Grid size24Square cellular grid; must be at least 2 and may be increased by a preset.
Number of generations25Number of stored boards and audio generation segments; may be increased by Glider Gun.
Duration5.0 sTotal final Sound duration.
Base frequency200 HzFrequency assigned to the minimum diagonal.
Frequency range600 HzAdded span from lowest to highest diagonal.
Spatial modeMonoMono or X-position constant-power stereo.
Edit detailsoffOpens technical, random, boundary, and animation settings.
Draw visualizationonDraws the final process/QC display.
Play resultonPlays the completed normalized Sound.

Details page

ControlDefaultMeaning
Sample rate44100 HzDirect synthesis and output rate; script minimum is 2000 Hz.
Output peak.90Final target peak normalization; valid >0…1.
Random Soup live probability.35Independent initial live-cell probability, used only by Random Soup.
Random seed00 = unpredictable Random Soup; positive = reproducible Random Soup initialization.
Wrap edgesoffOff = fixed-dead boundary; on = toroidal boundary.
Animate evolutionoffDisplays stored generations after synthesis.
Animation delay.08 sPause between animation frames when not auditioning them.
Audition each animated generationoffPlays the corresponding already-rendered segment from the final Sound during animation.

Safety and runtime guards

Generation/state-history limits

Version 1.1.1 adds explicit limits before the state-history array is allocated:

maximum generations = 1000
maximum stored states = 1,000,000 cells

stored states = NumberOfGenerations × GridSize²

If either limit is exceeded, the script stops and asks for fewer generations and/or a smaller grid.

Per-generation audio resolution

Every generation must contain at least eight audio samples:

(Duration / Generations) × SampleRate ≥ 8

Nyquist safety

The highest mapped frequency is:

BaseFrequency + FrequencyRange

It must remain below 95% of Nyquist. Unsafe settings stop rather than compressing the frequency mapping.

Output and normalization

PropertyBehavior
InputNo input Sound required.
ChannelsMono or stereo according to Spatial mode.
DurationRequested Duration, assembled from equal generation segments.
Sample rateDetails-page Sample rate.
Generation levelNo per-generation peak normalization.
Stereo levelNo independent left/right normalization.
Final normalizationOne common Scale peak: OutputPeak after all generations are concatenated and, in stereo mode, after the channels are combined.
Object namegol_<preset name>.

The final level operation is target peak normalization, not an attenuate-only ceiling. A non-silent result may be raised or lowered to reach Output peak.

Because normalization occurs only once at the end, generation-to-generation level relationships and stereo balance are preserved up to one shared global gain factor.

Animation and audition

Animation does not re-run the cellular automaton. It reads the already-computed exact state history.

Each animation frame displays:

If Audition each animated generation is enabled, the script extracts the corresponding rectangular segment from the already-finished output Sound and plays it. It does not synthesize or normalize a separate preview version.

If audition is off, Animation delay controls only the visual pause between frames. It does not change audio Duration or generation timing.

Final visualization and QC

The process visualization is separate from the optional frame-by-frame animation.

A — Cellular transition

The left board uses the generation with the largest birth+death turnover as a representative transition. Green cells are births, blue cells are survivors, and red X marks are deaths.

The right plot shows population as a continuous line with birth and death stems across all generations.

B — Life-to-sound score

Every generation occupies its actual time interval. Each occupied diagonal appears at its mapped frequency:

C — Audio mapping

The left mini-panel draws the actual Hann generation kernel. The right mini-panel draws either the X→constant-power L/R gain laws or, in Mono mode, the constant unity gain reference.

D — Measured output

The final normalized waveform is drawn directly from the generated Sound. Stereo mode displays separate left and right measured waveforms.

QC strip

The bottom strip reports grid/boundary, average and maximum population, total births/deaths, pitch range, final recurrence/extinction status, and measured final peak/RMS.