Kotoński-Inspired State-Event Generator — User Guide

A finite-state event controller for synthetic electroacoustic textures, informed by documented structural ideas in Włodzimierz Kotoński's Study on One Cymbal Stroke (1959), Microstructures (1963), and AELA (1970). The historical references guide three presets; the four-state controller itself is an AudioTools design.

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

Scope

This script is not a reconstruction of Kotoński's compositional method and does not recreate the original source recordings, studio procedures, or a specific realization of AELA. It combines historically informed preset constraints with an engine-specific finite-state controller.

Historical analogy: selected documented procedures determine the special behavior of the Etude-, Microstructures-, and AELA-inspired presets.

Engine invention: the four states, state-hold mechanism, transition graph, event panning, and mixed synthetic source classes belong to this AudioTools implementation.

The result is best understood as a finite-state event field: state memory controls ranges for event duration, onset interval, register, amplitude, and material tendency; transitions change that state after a user-defined number of events.

Quick start

  1. Run Kotonski_FSM_Event_Generator.praat. No input Sound is required.
  2. Choose one of the five ready-made fields or Custom Finite-State Field.
  3. Set Duration, Sample rate, Number of events, Global amplitude, transition controller, state hold, and Spatial mode.
  4. Open Edit state / sound details to change frequency range, IOI multiplier, attack/release, noise bandwidth, seed, and material preference for each state.
  5. Run the script. Event/state data are realized first, then globally time-scaled so the latest event end lands exactly on the requested Duration.
  6. The generated Sound remains in Praat. If enabled, a realization-score page is drawn after rendering.
Non-Custom presets override their documented main and advanced values after the form is submitted. Sample rate, Spatial mode, Random seed, Peak protection, Draw visualization, and Play result are not preset-specific unless explicitly stated.

Four engine states

The states are compositional classes invented for this engine. Each state defines ranges rather than one fixed event.

StateDuration before final scalingIOI before density multiplier/scalingRegister tendencyAmplitude range
1 — Sparse points18–70 ms180–550 msHigh: center .78, spread .18 in normalized log-frequency space.38–.72
2 — Sustained bands120–350 ms90–240 msLow: center .26, spread .23.42–.80
3 — Micro-fragments12–50 ms25–95 msUpper-mid/high: center .68, spread .28.30–.64
4 — Dense field80–240 ms30–110 msWide: center .46, spread .45.36–.76

For general presets, an event's normalized register position is drawn randomly inside the state's range, clipped to 0–1, then mapped logarithmically into the current effective frequency range.

For the Etude-inspired serial grid, state ranges still provide the local duration/amplitude boundaries, but positions inside those ranges are selected by deterministic rotating parameter indices rather than by random draws.

State memory and transition controllers

The current state is retained for State hold events. Only after that many events has been generated is a transition decision made. The four available controllers are:

Cycle

1 → 2 → 3 → 4 → 1 → ...

Palindrome

1 → 2 → 3 → 4 → 3 → 2 → 1 → ...

Adjacent aleatoric

At each transition decision: 30% remain in the current state, 35% move toward the lower neighbor, and 35% toward the upper neighbor. At the boundaries, the attempted outward move is reflected inward.

Directed aleatoric graph

Fromto S1to S2to S3to S4
S1.20.50.20.10
S2.20.20.45.15
S3.15.25.20.40
S4.45.15.20.20
Cycle and Palindrome are deterministic state controllers. Adjacent aleatoric and Directed aleatoric graph are stochastic finite-state processes. With a positive Random seed, the complete stochastic realization is reproducible.

Audio materials

Each event receives one of three rendered source classes. A state material code of Mixed chooses between them stochastically: 44% tone, 34% noise band, 22% metallic transient.

1. Tone

A sine event at the realized center frequency, with a random starting phase and the event envelope.

2. Noise band

A local-duration Gaussian-noise Sound is filtered with Praat's Hann pass-band filter. The nominal bandwidth receives a random factor of .65–1.35. The filtered fragment is RMS-normalized locally before event scaling and is then mixed at half the event's nominal amplitude.

The passband is bounded to 20 Hz at the bottom and 0.45 × Fs at the top. A small smoothing width is derived from the actual passband width.

3. Metallic transient

Three inharmonic decaying sinusoids are combined at frequency ratios:

f1 = event center frequency
f2 = 1.47 × f1
f3 = 2.13 × f1

The event center is limited so the 2.13× component remains within safe sampling headroom. The upper components use relative amplitudes .45 and .28, and the complete metallic source receives an exponential decay before the common event envelope.

Safe event envelope

Attack and release are cosine-shaped. For short events, each side is independently limited to at most 45% of the realized event duration, preventing the user-specified attack/release values from overrunning a very short event.

Timing, overlap, and density

Event duration and IOI are independent. The next onset advances by the current event's IOI, not by its duration. Events can therefore overlap naturally when duration exceeds IOI.

Exact-duration normalization

After all events have been realized, the script measures the latest raw event end and applies one common time scale:

timeScale = requested Duration / latest raw event end

Every onset, event duration, and IOI is multiplied by this same factor. Relative temporal proportions and overlap relationships are preserved, while the latest event ends exactly at the requested Duration.

What IOI Density multiplier really does

The advanced IOI density multiplier multiplies raw IOIs before final time normalization. Values below 1 make raw onsets closer together; values above 1 spread them farther apart.

Because Number of events and requested Duration are both fixed and the complete realization is subsequently time-normalized, the final event count per second is always Num_events / Duration. The IOI multiplier therefore mainly changes the relationship between event durations and onset spacing — especially overlap load — rather than changing the final number of events per second.

Overlap compensation

After time normalization:

overlapLoad = sum(realized event durations) / Duration
densityGain = 1 / sqrt(max(1, overlapLoad))

The gain is applied to every event together with Global amplitude and the event's own amplitude value. It is an energy-compensation heuristic for dense overlap, not loudness normalization.

Frequency handling and sampling headroom

The script uses safeTop = 0.45 × sample rate.

General modes

If the requested Frequency maximum exceeds safeTop, the complete minimum/maximum range is scaled by one common factor:

frequencyScale = min(1, safeTop / requestedMax)
effectiveMin = requestedMin × frequencyScale
effectiveMax = requestedMax × frequencyScale

This preserves the ratio between the range boundaries. If common scaling would push the lower boundary below 20 Hz, the script stops and asks for safer settings.

AELA-inspired 25-Hz field

AELA mode is treated differently because the 25-Hz arithmetic spacing is the historical constraint being preserved. Frequencies are rounded to the nearest 25 Hz, and the upper boundary is truncated rather than proportionally scaled.

Version 1.6.1 also quantizes that safe upper boundary itself:

effectiveMax = 25 × floor(min(requestedMax, safeTop) / 25)

so sampling-headroom truncation cannot introduce a final frequency that falls between grid steps.

Presets

1. Etude-inspired Serial Parameter Field

32 s · 121 events · Cycle · hold 11

Frequency range 120–6500 Hz; Global amplitude .58; IOI multiplier .92; attack 4 ms; release 10 ms; nominal noise bandwidth 700 Hz.

All four state material preferences are set to Mixed, but the serial-grid mode replaces ordinary material selection: six articulation classes are rotated and mapped by this engine to tone, noise, or metallic source classes.

The synthetic serial analogy uses deterministic rotating indices:

pitch: step 7 through 11 levels
duration: step 3 through 11 levels
amplitude: step 5 through 11 levels
articulation: step 5 through 6 classes

Duration and amplitude levels are interpreted inside the current state's ranges. The articulation-to-source mapping is an AudioTools invention; it is not presented as Kotoński's historical articulation table.

2. Microstructures-inspired Fragment Montage

36 s · 260 events · Adjacent aleatoric · hold 3

Frequency range 100–9000 Hz; Global amplitude .52; IOI multiplier .55; attack 2 ms; release 8 ms; nominal noise bandwidth 1500 Hz.

State materials: metallic / noise / mixed / mixed.

In this mode, selected fragments are shortened by an additional random factor of .35–.75, while IOIs receive an additional random factor of .55–1.15. The result is a synthetic overlapping montage analogy, not a recreation of the original glass/wood/metal recordings.

3. AELA-inspired 25-Hz Sine Field

36 s · 190 events · Directed aleatoric graph · hold 1

Frequency range 25–10000 Hz subject to safe 25-Hz truncation; Global amplitude .50; IOI multiplier .90; attack 4 ms; release 12 ms.

All events are sine tones. Mixed/noise/metallic state preferences are bypassed.

4. Sparse Point Field

50 s · 90 events · Cycle · hold 12

Frequency range 700–6500 Hz; Global amplitude .56; IOI multiplier 1.25; attack 3 ms; release 6 ms. State materials: tone / tone / metallic / mixed.

5. Dense Mixed State Field

34 s · 320 events · Adjacent aleatoric · hold 2

Frequency range 180–8500 Hz; Global amplitude .46; IOI multiplier .46; attack 2 ms; release 6 ms; nominal noise bandwidth 1200 Hz. State materials: mixed / noise / mixed / mixed.

6. Custom Finite-State Field

Uses the values entered in the main form and optional advanced page. Historical special modes — serial grid, Microstructures fragment modifications, and AELA 25-Hz quantization — are off.

Controls

ControlRange / defaultBehavior
Durationdefault 40 s; max 180 sExact final Sound duration after common timing normalization.
Sample rate8–192 kHz; default 44.1 kHzDirect synthesis and final output rate.
Num events2–4000; default 140Exact number of scheduled events.
Global amplitude>0–2; default .60Multiplies every event before final peak protection.
Transition logic4 controllersDetermines the next state when the current hold expires.
State hold events1–Num events; default 8Number of events generated before each transition decision.
Spatial modeMono / Event Spread / State PositionsControls channel count and event pan.
Frequency min/maxadvanced; default 100–8000 HzRequested center-frequency range before sampling-headroom policy.
IOI density multiplier>0–10; default 1Scales raw onset intervals; chiefly changes overlap after final exact-duration normalization.
Attack / Releasepositive; defaults 6 / 10 msCosine event edges, automatically shortened for very short events.
Nominal noise bandwidthpositive; default 900 HzCenter of the random .65–1.35 bandwidth multiplier for noise events.
Random seed0 or positive integer0 = unpredictable; positive = reproducible state/material/frequency/timing/noise realization for the same settings.
State 1–4 material1 tone / 2 noise / 3 metallic / 4 mixedMaterial preference for general modes. Special historical presets can override this mechanism.

Spatial modes

ModeOutputMapping
Mono1 channelAll events centered into the mono master.
Event SpreadStereoEach event receives an independent random pan from .04 to .96.
State PositionsStereoS1=.08, S2=.36, S3=.64, S4=.92.

Stereo gains use equal-power panning:

left = sqrt(1 - pan)
right = sqrt(pan)

Output and level

PropertyBehavior
InputNo selected Sound is required.
DurationExactly the requested Duration.
Sample rateExactly the selected 8–192 kHz rate.
ChannelsMono in Mono mode; stereo in Event Spread and State Positions.
Density compensationApplied from realized overlap before events are mixed.
Peak protectionIf enabled and the final mixed peak exceeds .92, the complete Sound is scaled down once to .92.
NormalizationNo upward normalization. If peak ≤ .92, the generated level is preserved.
Output nameKotonski_StateEvent_<preset name>, with spaces replaced by underscores.

Visualization — Partytura Realizacyjna

Version 1.6 deliberately presents the visualization as one realization-score page, not as an analysis dashboard. Every system uses the same horizontal time axis, so a vertical cut through the page refers to the same moment/event across parameters.

Head block

Shows preset, event count, requested duration, realized events/s, tone/noise/metallic counts, transition controller, state hold, spatial mode, and seed.

Montaż — event field

A log-frequency field shows the actual realized events as horizontal filled bars. Color indicates the engine's four state classes. Tone and metallic events appear as narrow frequency bars; a noise event's vertical height represents its realized bandwidth.

Tablice skal — four scale systems

The score contains four aligned ruled systems:

For the Etude-inspired serial-grid preset, the first three systems show the actual generated serial-grid indices, while articulation shows its actual six-class index. For presets that do not use the serial grid, realized frequency, duration, and amplitude values are binned to the same 11-level display purely to keep one score grammar; the key explicitly says that those presets use no grid.

State ribbon

A colored strip beneath the parameter systems shows the realized finite-state trajectory across the common time axis.

Color convention: black/ink parameter marks refer to the historically informed scale analogy; colored state classes identify the finite-state machinery invented by this engine. The score itself states this distinction.

v1.6.1 visual-range correction

The log-frequency bounds now use effective_min_Hz and effective_max_Hz after any sampling-headroom scaling. This keeps scaled low-frequency events inside the plotted score instead of calculating the visual range from stale pre-scaling values.

Historical basis and Further Reading

The historical statements retained in this guide are limited to points supported by archival, institutional, or scholarly collection sources.

Study on One Cymbal Stroke / Concrete Etude (1959)

POLMIC identifies Kotoński's 1959 Study on One Cymbal Stroke as the first autonomous tape composition created at the Polish Radio Experimental Studio and describes one recorded cymbal stroke transformed within a precisely planned structure. Unearthing the Music documents the source being filtered into six bands of different widths, transposed to eleven pitches, and organized with related duration and articulation scales. The present 11/11/11/6 grid is a structural analogy, not a reconstruction of that concrete-source workflow.

Microstructures (1963)

UNT Music Library metadata describes Microstructures as a montage built from recorded impacts on wood, metal, and glass: tape fragments were cut and assembled into chance sequences and loops/layers. This script substitutes synthetic tone/noise/metallic fragments and an FSM-controlled montage.

AELA (1970)

POLMIC and Map of Polish Composers date AELA to 1970. MoMA's Polish Radio Experimental Studio archive describes the work as a framework or “family of electronic pieces” using sine-wave material on a frequency scale from 25 to 10000 Hz in 25-Hz intervals, with aleatoric procedures. The AELA-inspired preset therefore uses sine tones only, retains a 25-Hz grid, and uses the engine's directed aleatoric state graph without claiming to reproduce a specific realization.

Verified online references: