CA Convolution Reverb — Cellular Automaton IR Generator

Convolution reverb whose impulse response is grown from an Elementary Cellular Automaton (Wolfram rule 0-255). Live cells become signed impulses shaped by exponential decay; the rule chooses the room: chaotic rules give noise-like reverberation, structured rules give self-similar metallic resonators.

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

What this does

This script implements a convolution reverb whose impulse response is grown from an Elementary Cellular Automaton (Wolfram rule 0-255). Live cells become signed impulses shaped by exponential decay; the rule chooses the room: chaotic rules give noise-like (Schroeder-idealised) reverberation, structured rules give self-similar metallic resonators that no physical room could produce. The result is a new Sound object — the dry sound convolved with the CA-grown IR.

What is a Cellular Automaton? A cellular automaton is a grid of cells that evolve over discrete time steps according to a local rule. Each cell's next state depends on itself and its neighbours. Wolfram's elementary CA uses a 1D grid with a 3-cell neighbourhood (left, self, right) and 256 possible rules (0–255). Chaotic rules (e.g., 30, 45) produce unpredictable, noise-like patterns; structured rules (e.g., 90, 110) produce self-similar, fractal patterns. This script maps the CA's live cells to impulses in an impulse response, then convolves with your sound.

Key Features:

v0.3 fix — no more muffled sound: Dead cells now map to silence (not -1), so the CA background is no longer a full-amplitude DC field. Live cells map to ±1 through a fixed seeded per-column sign vector — runs of live cells whiten (no LF buildup), and the background stops thumping. Row-to-row correlation survives, so the decorr-OFF comb feature is untouched.

Quick start

  1. In Praat, select exactly one Sound object.
  2. Run script…CA_Reverb_IR.praat.
  3. Choose a preset from the dropdown (Chaotic Room, Sierpinski Plate, Complex Bloom, Granular Traffic, Cathedral Chaos, or Custom).
  4. If Custom, set Rule (0–255), CA_width, Seed_mode, Ir_duration, Decay_time, Frame_decorrelation.
  5. Set Wet_dry_percent (0–100%).
  6. Optionally enable Keep_IR_and_CA to inspect the IR and CA matrix.
  7. Click OK — script grows the CA, builds the IR, convolves with your sound.
  8. Result originalname_CAreverb_presetname appears in the Objects window.
Quick tip: Start with Chaotic Room (rule 30) for a natural-sounding, Schroeder-like reverb. Sierpinski Plate (rule 90) produces a metallic, comb-filtered resonance — turn Frame_decorrelation OFF to hear the samplerate/width comb. Cathedral Chaos (rule 45, width=1024, IR=4s) creates a vast, chaotic hall. Enable Keep_IR_and_CA to see the CA matrix that generated your reverb's impulse response.
Important: This script is pure Praat — no Python dependencies. The CA evolution uses Matrix operations and is fast (width 256, 1000 generations takes seconds). The convolution uses Praat's native Convolve command. Frame_decorrelation ON kills the samplerate/width comb (room-like); OFF preserves it (metallic resonator). The IR is shaped with exponential decay and a final fade-out to prevent clicks.

5 Presets

PresetRuleWidthSeedIR (s)Decay (s)DecorrCharacter
Chaotic Room30256random1.20.35ONNatural, noise-like, Schroeder-idealised reverb
Sierpinski Plate90512centre2.00.6OFFMetallic comb, self-similar fractal resonator
Complex Bloom110256centre2.50.9ONSwelling, complex, organic reverb
Granular Traffic184128random0.80.2ONGrainy, short, rhythmic texture
Cathedral Chaos451024random4.01.4ONVast, chaotic, cavernous hall

CA Theory — From Rule to Impulse Response

Elementary Cellular Automaton

A 1D binary grid (width W) evolves over discrete generations (t = 1..N).

Each cell's next state depends on its left neighbour, itself, and its right neighbour (3-bit neighbourhood).

Rule 0–255 maps each of the 8 possible neighbourhood patterns to a new state (0 or 1).

Example neighbourhood patterns and their rule bit positions:

  • 111 → bit 7
  • 110 → bit 6
  • 101 → bit 5
  • 100 → bit 4
  • 011 → bit 3
  • 010 → bit 2
  • 001 → bit 1
  • 000 → bit 0
CA → IR mapping (v0.3):
  • Dead cells (0)silence (no impulse)
  • Live cells (1)±1 (sign from fixed seeded per-column vector)
  • Decorrelation (ON): each generation's row is circularly rotated by a seeded random offset — kills the samplerate/width comb.
  • Decorrelation (OFF): rows are read in natural order — preserves the comb at sampleRate/width Hz.
  • Exponential decay: amplitude × exp(-t / decay_time)
  • End fade: cosine fade-out over 30 ms or 10% of IR duration
Why v0.3 sounds different: In v0.2, dead cells mapped to -1, creating a full-amplitude DC background — the IR was dominated by low-frequency rumble. v0.3 maps dead cells to silence and live cells to ±1 through a fixed sign vector. Runs of live cells whiten (no LF buildup), and the row-to-row correlation that gives the comb feature survives. The result is a much cleaner, more musical impulse response.

Controls

CA & IR parameters (Custom mode)

ParameterRangeDescription
Rule0–255Wolfram elementary CA rule. Chaotic (30, 45) = noise-like; structured (90, 110) = self-similar.
CA_width16–2048Number of cells per row. Wider = longer IR (width × generations). Also sets the comb frequency when decorrelation OFF.
Seed_modesingle centre / random rowCentre = deterministic (single live cell at the centre). Random = density 0.5, uses Random_seed.
Random_seedintegerSeed for random row initialisation and decorrelation rotations.
Ir_duration0.25–10 sTotal impulse response length (clipped to CA width × generations).
Decay_time0.1–5.0 sExponential decay time constant. Shorter = faster decay.
Frame_decorrelationON / OFFON = seeded circular rotation per generation (room-like). OFF = preserve samplerate/width comb (metallic).
Frame_decorrelation explained: With decorrelation OFF, the IR has a strong comb filter at sampleRate / width Hz. For width=512 at 44.1 kHz, the comb is at 86 Hz — a metallic, ringing character. With decorrelation ON, each generation is randomly shifted, breaking the comb and producing a smoother, room-like reverb. Both modes are musically useful — OFF for Sierpinski-like metallic textures, ON for natural reverb.

Applications

Natural-sounding reverb (Chaotic Room)

Use case: Add a realistic-sounding reverb to any sound.

Settings: Chaotic Room preset (rule 30, decorrelation ON). The chaotic CA produces a dense, noise-like impulse response that mimics Schroeder's idealised reverb.

Metallic / resonator effects (Sierpinski Plate)

Use case: Create metallic, ringing, self-similar resonances.

Settings: Sierpinski Plate preset (rule 90, decorrelation OFF). The self-similar CA pattern produces a comb-filtered impulse response with a metallic character.

Experimental / generative reverb

Use case: Explore the full range of CA rules — each rule produces a unique impulse response.

Settings: Custom mode, experiment with different rules (0–255). Rule 110 (Complex Bloom) produces swelling, organic textures; rule 184 (Granular Traffic) produces short, grainy responses.

Cathedral / vast spaces (Cathedral Chaos)

Use case: Create a huge, chaotic hall reverb.

Settings: Cathedral Chaos preset (rule 45, width=1024, IR=4s). The large width and long IR produce a vast, immersive space.

Workflow: Voice → Chaotic Room reverb

Source: Spoken word or vocal recording.
Settings: Chaotic Room preset, Wet_dry_percent = 40%.
Result: A natural, room-like reverb that doesn't colour the voice — the chaotic CA provides a dense, Schroeder-style impulse response.

Workflow: Piano → Sierpinski Plate resonator

Source: Piano recording.
Settings: Sierpinski Plate preset (rule 90, decorrelation OFF), Wet_dry_percent = 60%.
Result: The piano takes on a metallic, ringing character — like playing inside a fractal metal plate. The comb at 86 Hz adds a resonant low-mid emphasis.

Workflow: Drum loop → Granular Traffic

Source: Drum loop.
Settings: Granular Traffic preset (rule 184, width=128, IR=0.8s), Wet_dry_percent = 50%.
Result: A short, grainy reverb that adds texture without washing out the transients — the rule 184 CA produces a rhythmic, traffic-like pattern.

Troubleshooting:
IR is silent or very quiet: Check that the CA has live cells. Centre seed + rule 0 (all cells die) produces silence. Use rule 30 or 90 for live patterns.
Comb filter too strong: Turn Frame_decorrelation ON to break the samplerate/width comb. Or choose a different width to shift the comb frequency.
Muffled / thumping sound: You may be using an older version. v0.3 fixes this: dead cells map to silence, not -1. Update the script.
IR has click at end: The script applies a 30 ms fade-out. If clicks persist, increase the fade duration by editing the script.
CA evolution is slow: Reduce CA_width or Ir_duration (fewer generations). The Matrix Formula operation is fast for widths ≤ 1024.

Visualisation

When Draw_visualization is enabled, the script generates:
  • Title strip — preset, rule, width, generations, decay time, decorrelation status
  • CA matrix image — 2D visualisation of the cellular automaton (generation × cell)
  • IR waveform — the impulse response (blue curve)
  • IR spectrum — frequency content (0–10 kHz), showing the comb or noise-like structure
  • Wet output waveform — the reverberated sound
  • Summary strip — rule, width, generations, seed, decorrelation, wet/dry, output details
The CA matrix image is the key visual: you can see the rule's pattern — chaotic (rule 30) vs. self-similar (rule 90) — and understand how the impulse response is shaped.