Poisson Point Process Synthesis — User Guide

Stochastic grain synthesis driven by two independent homogeneous Poisson point processes. Left and right events arrive at random times, each event receives an independently randomized centre frequency, duration, and amplitude, and the resulting channel sums are shaped with an exact mid/side stereo-width control.

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

What this does

The generator creates two independent stochastic event streams, one for the left channel and one for the right. Each stream is a homogeneous Poisson point process with its own event rate in events per second.

Every event triggers one short sinusoidal grain. Frequency, duration, and amplitude are randomized independently for each event. Grains can overlap freely because event spacing and grain duration are independent variables.

No input Sound is required. This is an autonomous generator rather than an analysis/resynthesis effect.

The final stereo image is not created by panning individual grains. The left and right Poisson processes are synthesized independently first; Stereo width then transforms their complete channel sums through a mid/side matrix.

Quick start

  1. Run Poisson_Point_Process_Synthesis.praat.
  2. Choose Custom or one of the seven presets.
  3. Set Duration, Left/Right event rates, Left/Right base frequencies, and Stereo width.
  4. Enable Edit details to change sample rate, random seed, frequency spreads, mean grain durations, duration spreads, and nominal amplitudes.
  5. Run the script. Independent Poisson event times and grain parameters are generated for both channels, rendered in chunks, combined to stereo, width-adjusted, faded, and optionally peak-protected.
A positive Random seed makes the stochastic realization reproducible. Seed 0 uses an unpredictable random state.

Poisson timing

For a homogeneous Poisson process with rate λ events per second, the waiting time between consecutive events is exponentially distributed:

p(Δt) = λ exp(-λΔt)

expected waiting time = 1 / λ

Therefore the event rate controls average density, not a fixed pulse interval. Individual inter-onset intervals remain random.

The expected event count over a duration T is approximately:

expected events = λ × T

but every finite realization can contain more or fewer events. At very low rates and short durations it is possible to obtain zero events in one or both channels.

Normalized waiting-time QC

The visualization multiplies each realized waiting time by its process rate:

normalized waiting time = λ × Δt

For the theoretical exponential distribution, the expected normalized mean is 1 and the coefficient of variation is also 1. The Info window reports the realized event rate, mean IOI, and IOI CV for each channel.

Preset names such as Rhythmic Pulse do not introduce a metrical grid or quantization. Event times remain Poisson-distributed.

Grain model

Each Poisson event receives three randomized parameters: centre frequency, duration, and amplitude.

Frequency

For each channel, grain frequency is drawn uniformly from the effective frequency interval:

base frequency - spread/2
        ...
base frequency + spread/2

The requested interval can be truncated by the synthesis frequency guard described below.

Duration

Grain duration is drawn uniformly around the mean:

duration =
  mean duration
  + spread × (U - 0.5)

where U is uniform on [0,1]

The form validation requires the mean to be greater than half the spread so the requested random duration interval remains positive. Internally, duration is also protected by a 10 ms minimum before end-of-Sound clipping.

If a grain begins near the end of the requested Duration, it is shortened so that it does not extend past the final sample. After that clipping, grains of 5 ms or less are not rendered.

Amplitude

Each grain amplitude is uniformly randomized between 70% and 100% of its channel's nominal amplitude:

A = nominalAmplitude × (0.7 + 0.3U)

Hann-windowed sinusoid

The rendered grain is:

g(t) =
  A × sin(2π f t)
    × 0.5[1 - cos(2π(t - tevent)/D)]

inside the grain interval and zero outside it. The Hann envelope reaches zero at both grain boundaries, so overlapping grains sum without a discontinuous rectangular gate.

The carrier uses absolute Sound time t, not a phase reset to zero at each event. The envelope still begins and ends at zero, so this absolute-time phase choice does not create a boundary discontinuity.

Overlap

Overlap is genuine: if a new Poisson event occurs before an earlier grain has finished, both grains are present simultaneously and are added into the same channel.

For implementation stability, the script adds grains to the Sound in groups of 25 formula terms. Chunking changes only how the computation is assembled; it does not change the event realization.

Stereo width

The independent left and right grain sums first form the raw stereo pair. Stereo width then uses an exact mid/side transform:

M = (L + R) / 2
S = (L - R) / 2

L' = M + width × S
R' = M - width × S
WidthResult
0True dual-mono output: both channels equal the mid signal.
1The original independently generated L/R stereo pair is preserved.
0–1Continuously reduces side information between those endpoints.

The output object remains stereo even when Width = 0.

Controls

Main page

ControlDefaultBehavior
PresetCustomSelects one of seven complete grain-field configurations or retains the current custom values.
Duration10 sFinal Sound duration.
Left event rate8 /sPoisson intensity λ for the raw left process.
Right event rate8 /sPoisson intensity λ for the raw right process.
Left base frequency120 HzCenter of the left grain-frequency distribution before safety truncation.
Right base frequency120 HzCenter of the right grain-frequency distribution before safety truncation.
Stereo width1.00 = dual mono; 1 = original independent stereo.
Edit detailsoffOpens the secondary technical/reproducibility page.
Peak protectiononEnables the v0.6.1 down-only peak ceiling at .90.

Details page

ControlDefaultBehavior
Sample rate44100 HzDirect synthesis and final output rate; minimum accepted value is 1000 Hz.
Random seed00 = unpredictable; positive = reproducible event/grain realization.
Left/Right frequency spread200 / 200 HzTotal width of each uniform grain-frequency interval.
Left/Right mean grain duration.10 / .10 sCenter of each uniform duration distribution.
Left/Right duration spread.05 / .05 sTotal width of each duration distribution.
Left/Right nominal amplitude.60 / .60Top of each grain's 70–100% amplitude randomization range.

Presets

PresetMain behaviorKey overrides
Sparse AmbienceLow event density and comparatively long grains.L/R rates 3/2.5 s⁻¹; bases 80/100 Hz; durations .15/.18 s; width 1.0.
Dense TextureHigh event density with shorter grains and substantial overlap.Rates 25/22; bases 200/220 Hz; durations .05/.06 s; width .8.
Rhythmic PulseNarrow frequency/duration spreads and reduced stereo width.Rates 12/12; bases 100/105 Hz; durations .08/.08 s; width .3. Timing remains Poisson, not quantized.
Wide Stereo FieldStrong spectral contrast between independent channels.Rates 10/10; bases 150/450 Hz; spreads 100/300 Hz; width 1.0.
Ascending ShimmerHigher right-channel register and short grains.Rates 18/16; bases 300/600 Hz; spreads 500/800 Hz; width .9. No temporal upward glissando is generated.
Granular CloudVery dense field of short grains.Rates 35/32; bases 400/380 Hz; durations .03/.035 s; width .85.
Metallic RainHigh-frequency, short-duration event field.Rates 20/18; bases 800/1200 Hz; spreads 1000/1500 Hz; durations .02/.025 s; width 1.0.

Presets override the left/right rates, base frequencies, frequency spreads, grain durations, duration spreads, nominal amplitudes, and Stereo width. Sample rate and Random seed remain controlled by the Details page.

Centre-frequency safety

The engine limits grain centre frequencies to:

0.1 Hz ... 95% of Nyquist

For each channel, the requested interval is first calculated from base frequency ± half the spread. The lower endpoint is clipped upward to 0.1 Hz and the upper endpoint downward to 95% of Nyquist.

This is range truncation, not a common scaling of base frequency and spread. If a requested interval does not intersect the valid synthesis range at all, the script stops.

The 95%-of-Nyquist guard constrains the sinusoidal carrier centre frequency. It is not an oversampling or anti-aliasing stage.

Output and level

PropertyBehavior
InputNo input Sound is required.
DurationExactly the requested Duration.
Sample rateExactly the rate selected on the Details page.
ChannelsAlways stereo, including Width = 0.
Fade-in20 ms maximum, capped at half the total Duration.
Fade-out50 ms maximum, capped at half the total Duration.
Silent realizationPossible for very short/low-rate settings; handled without attempting peak scaling.
Peak protectionIn v0.6.1, if enabled and peak > .90, the complete stereo output is scaled down once to .90.
NormalizationNo upward normalization. A non-silent output whose peak is already ≤ .90 keeps its generated level.
Output namepoisson_<preset name>.

Visualization and QC

PanelWhat it shows
A — Poisson ClocksActual normalized waiting times λΔt for both processes. The horizontal guide at 1 marks the theoretical mean.
B — Random Grain ParametersEach rendered grain's onset, centre frequency, duration, and amplitude: Y = frequency, horizontal segment = duration, marker size = amplitude.
C — Grain Kernel → Channel Sum → M/S WidthRepresentative realized left/right Hann-windowed grains together with the equations for summation and mid/side width processing.
D — Measured OutputFinal left and right waveforms after width, fades, and optional down-only peak protection. This panel confirms the result rather than defining the stochastic model.

The QC block reports target/realized event rates, IOI CV, stored grain means, rendered grain counts, stereo width, centre-frequency guard, sample rate, event counts, final peak/RMS, and whether peak protection changed the level.

Further reading