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.
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.
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
- Run
Kotonski_FSM_Event_Generator.praat. No input Sound is required. - Choose one of the five ready-made fields or Custom Finite-State Field.
- Set Duration, Sample rate, Number of events, Global amplitude, transition controller, state hold, and Spatial mode.
- Open Edit state / sound details to change frequency range, IOI multiplier, attack/release, noise bandwidth, seed, and material preference for each state.
- Run the script. Event/state data are realized first, then globally time-scaled so the latest event end lands exactly on the requested Duration.
- The generated Sound remains in Praat. If enabled, a realization-score page is drawn after rendering.
Four engine states
The states are compositional classes invented for this engine. Each state defines ranges rather than one fixed event.
| State | Duration before final scaling | IOI before density multiplier/scaling | Register tendency | Amplitude range |
|---|---|---|---|---|
| 1 — Sparse points | 18–70 ms | 180–550 ms | High: center .78, spread .18 in normalized log-frequency space | .38–.72 |
| 2 — Sustained bands | 120–350 ms | 90–240 ms | Low: center .26, spread .23 | .42–.80 |
| 3 — Micro-fragments | 12–50 ms | 25–95 ms | Upper-mid/high: center .68, spread .28 | .30–.64 |
| 4 — Dense field | 80–240 ms | 30–110 ms | Wide: 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
Palindrome
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
| From | to S1 | to S2 | to S3 | to S4 |
|---|---|---|---|---|
| S1 | .20 | .50 | .20 | .10 |
| S2 | .20 | .20 | .45 | .15 |
| S3 | .15 | .25 | .20 | .40 |
| S4 | .45 | .15 | .20 | .20 |
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:
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:
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.
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:
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:
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:
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:
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
| Control | Range / default | Behavior |
|---|---|---|
| Duration | default 40 s; max 180 s | Exact final Sound duration after common timing normalization. |
| Sample rate | 8–192 kHz; default 44.1 kHz | Direct synthesis and final output rate. |
| Num events | 2–4000; default 140 | Exact number of scheduled events. |
| Global amplitude | >0–2; default .60 | Multiplies every event before final peak protection. |
| Transition logic | 4 controllers | Determines the next state when the current hold expires. |
| State hold events | 1–Num events; default 8 | Number of events generated before each transition decision. |
| Spatial mode | Mono / Event Spread / State Positions | Controls channel count and event pan. |
| Frequency min/max | advanced; default 100–8000 Hz | Requested center-frequency range before sampling-headroom policy. |
| IOI density multiplier | >0–10; default 1 | Scales raw onset intervals; chiefly changes overlap after final exact-duration normalization. |
| Attack / Release | positive; defaults 6 / 10 ms | Cosine event edges, automatically shortened for very short events. |
| Nominal noise bandwidth | positive; default 900 Hz | Center of the random .65–1.35 bandwidth multiplier for noise events. |
| Random seed | 0 or positive integer | 0 = unpredictable; positive = reproducible state/material/frequency/timing/noise realization for the same settings. |
| State 1–4 material | 1 tone / 2 noise / 3 metallic / 4 mixed | Material preference for general modes. Special historical presets can override this mechanism. |
Spatial modes
| Mode | Output | Mapping |
|---|---|---|
| Mono | 1 channel | All events centered into the mono master. |
| Event Spread | Stereo | Each event receives an independent random pan from .04 to .96. |
| State Positions | Stereo | S1=.08, S2=.36, S3=.64, S4=.92. |
Stereo gains use equal-power panning:
right = sqrt(pan)
Output and level
| Property | Behavior |
|---|---|
| Input | No selected Sound is required. |
| Duration | Exactly the requested Duration. |
| Sample rate | Exactly the selected 8–192 kHz rate. |
| Channels | Mono in Mono mode; stereo in Event Spread and State Positions. |
| Density compensation | Applied from realized overlap before events are mixed. |
| Peak protection | If enabled and the final mixed peak exceeds .92, the complete Sound is scaled down once to .92. |
| Normalization | No upward normalization. If peak ≤ .92, the generated level is preserved. |
| Output name | Kotonski_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:
- WYSOKOŚĆ / height — 11 levels.
- DŁUGOŚĆ / length — 11 levels.
- DYNAMIKA / dynamics — 11 levels.
- ARTYKUL. / articulation — 6 levels.
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.
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: