Pulsar Synthesis Engine — User Guide

Pulsar-style synthesis from a selected Praat Sound. The engine creates periodic, chirped/jittered, or Poisson onset times; converts them to a band-limited impulse train; convolves that train with the selected Sound; then applies a per-IOI Hann duty gate, global fades, and optional amplitude modulation.

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

Scope and signal flow

The selected Sound acts as a timbre / convolution kernel. The engine does not repeatedly copy that Sound directly at every onset. Its implemented signal flow is:

onset process
→ sinc-band-limited impulse train
→ convolution with selected h(t)
→ per-IOI Hann duty gate
→ global fade / optional AM
→ optional target-peak normalization

This is related to Curtis Roads' pulsar synthesis framework, but it is important to distinguish the implementation from the simplest canonical pulsar model. In the classic description, a pulsar contains a pulsaret followed by silence within a period. Here, the selected Sound is first excited by the complete impulse train through convolution, and the duty-cycle window is applied after convolution. Therefore Duty cycle controls how much of the convolved response remains audible inside each realized inter-onset interval.

Roads' 2001 pulsar-synthesis article also describes an advanced method combining pulsar trains with convolution of sampled sounds. This script uses that idea as a practical Praat workflow, but its exact post-convolution Hann gating is the implementation defined here.

Quick start

  1. Select exactly one Sound in Praat. It will become the timbre kernel.
  2. Run Pulsar_Synthesis_Engine.praat.
  3. Choose a preset or select Custom.
  4. For Custom, choose Periodic or Stochastic Poisson and set Duration, Period or Density, and Duty cycle.
  5. Use Edit details for jitter, chirp, AM, fades, sample rate, output peak, and random seed.
  6. Run the script. The final Sound remains selected and is optionally played.
The form opens on Periodic Tone, not Custom. Non-Custom presets override the relevant timing, duty, chirp/jitter, AM, and fade fields after the Details page is closed.

Onset modes

Periodic

With no chirp and no jitter, events are spaced by the selected Period:

pulse rate = 1 / Period

For example, a 10 ms period corresponds to a 100 Hz repetition rate.

Periodic chirp

When chirp is enabled, the period is interpolated linearly through time:

p(t) = startPeriod + (endPeriod - startPeriod) × t / Duration

Because repetition frequency is 1/p(t), a linear period trajectory is generally not a linear frequency glide.

Periodic jitter

Jitter perturbs each current period independently:

realizedPeriod = currentPeriod + Gaussian(0, currentPeriod × jitterRatio)

In the chirp/jitter path, realized periods shorter than two samples are clamped to two samples and counted in the QC statistics.

Stochastic Poisson

Mode B uses Praat's homogeneous Poisson-process generator. Density is the expected pulse rate λ in pulses per second, and the expected inter-onset interval is:

E[IOI] = 1 / λ

The actual pulse count and inter-onset intervals vary from realization to realization. Very short or low-density settings can produce few pulses, and a Poisson realization can theoretically contain none.

Random seed

Random seed = 0 leaves onset randomness unpredictable. A positive seed makes the stochastic onset stage reproducible. In v1.1.1 the fixed seed is scoped to onset generation only; immediately afterward Praat's global random generator is returned to a safely unpredictable state.

The onset process is the only stochastic stage. The convolution, gating, fades, and AM are deterministic once the onset times are known.

Selected Sound, sample rate, and convolution

The script requires one non-silent Sound with positive duration. It extracts the complete selected Sound with a rectangular window and zero-shifts the working copy so its response begins at each impulse time.

Sample rate

If the selected kernel uses a different sampling frequency from the requested output rate, the working copy is resampled to the output rate with Praat's Resample: ..., 50 setting before convolution.

Band-limited impulse train

The PointProcess is converted using Praat's To Sound (pulse train) command. This produces the sinc-band-limited excitation train used by the convolution stage.

Convolution

The pulse train and kernel are convolved with Praat's sum amplitude convention and zero outside the input domains. The sum convention is appropriate for treating the selected Sound as a finite impulse response excited by a pulse train.

Convolution naturally extends the time domain. The script then extracts exactly 0 ... Duration, so any kernel response extending beyond the requested end is discarded.

Channel behavior

The pulse train is mono. Praat's convolution rules preserve the channel count of a multichannel kernel when the other Sound is mono. Therefore:

Each kernel channel is convolved with the same mono pulse train; the relative channel structure of the selected kernel is retained through the convolution stage.

Per-IOI Hann duty gate

For every realized onset, the script measures the following inter-onset interval. The active duration is:

activeWindow = DutyCycle × realizedIOI

The active window begins at the onset and is shaped by a raised-cosine/Hann gate:

gate(τ) = 0.5 × [1 - cos(2π τ / activeWindow)]

with zero outside the active region. Duty cycle is restricted to 0 < duty ≤ 1, so the requested gate never intentionally extends beyond its own IOI.

For the final pulse, the script reuses the previous IOI when available. With only one pulse, it falls back to the requested Period in Periodic mode or 1/Density in Poisson mode.

Kernel tails and duty cycle

The convolution happens before gating. If the selected kernel lasts longer than the duty window, its convolved tail is intentionally cut by the gate. The Info/QC report shows kernel duration / mean active window; values above 1 indicate this truncation is expected.

Very short windows

Active windows using fewer than four samples are counted and reported. Windows below one sample are raised to one sample where the current IOI allows it. This is a resolution safeguard, not a change to the onset process.

Global envelope and amplitude modulation

Fades

Global fade-in and fade-out use half-cosine curves after duty gating. Each requested fade is capped at 45% of the total Duration.

AM

When enabled, the complete gated output is multiplied by:

AM gain = 1 + depth × sin(2π × rate × t)

With depth from 0 to 1, the gain ranges from 1-depth to 1+depth. At depth 1 the trough reaches zero.

Controls

Main page

ControlDefaultMeaning
PresetPeriodic ToneCustom plus six predefined configurations.
Synthesis modePeriodicUsed directly in Custom; non-Custom presets can override it.
Duration3 sFinal requested output duration; valid range >0 to 120 s.
Period.01 sPeriodic onset interval for Custom Periodic mode.
Density100 /sPoisson intensity for Custom Stochastic mode.
Duty cycle.5Fraction of each realized IOI occupied by the Hann gate; >0 to 1.
Edit detailsoffOpens jitter/chirp/AM/fade/sample-rate/normalization-seed controls.
Normalize outputonWhen on, any nonzero result is peak-scaled to Output peak.
Draw visualizationonDraws the mechanism-first four-panel QC display.
Play resultonPlays the final selected Sound.

Details page

ControlDefaultValidation / behavior
Periodic IOI jitter ratio00–.95; Gaussian standard deviation equals currentPeriod × ratio.
Enable periodic chirpoffPeriodic mode only; linearly changes period through time.
Chirp end period.005 sPositive endpoint for the period trajectory.
Enable amplitude modulationoffApplies global sinusoidal AM after gating/fades.
AM rate4 HzNon-negative.
AM depth.50–1.
Fade in / out.05 / .10 sNon-negative; each capped to 45% of Duration.
Sample rate44100 Hz8000–192000 Hz.
Output peak.95Target peak when Normalize output is enabled; >0 to 1.
Random seed00 = unpredictable; positive = reproducible stochastic onsets.

Presets

Presets override the mode-specific variables listed here. They do not override Duration, Sample rate, Output peak, Random seed, Normalize output, Draw visualization, or Play result.

PresetMode / timingDutyOther overrides
Periodic TonePeriodic; 10 ms period (100 Hz).50jitter 0; no chirp; no AM; fades .03/.10 s.
Rhythmic PulsePeriodic; .25 s period (4 Hz).15jitter .05; no chirp; no AM; fades .02/.05 s.
Stochastic CloudPoisson; density 100/s.50no chirp/AM; fades .05/.10 s.
Chirp SweepPeriodic; 20 ms → 2 ms period.50jitter .01; chirp on; no AM; fades .04/.12 s.
Tremolo WebPoisson; density 150/s.40AM 6 Hz, depth .7; fades .08/.15 s.
Noise BurstPoisson; density 400/s.80no AM; fades .01/.04 s.
Details-page values are read before presets are applied. If a non-Custom preset is selected, any field that the preset explicitly overrides takes the preset value even if it was edited on the Details page.

Sampling and runtime safety

Requested periodic-rate guard

For Periodic mode, the shortest requested endpoint period (start or chirp end) is checked so its reciprocal does not exceed 95% of Nyquist:

1 / minimumRequestedPeriod ≤ 0.95 × Nyquist

In the chirp/jitter event loop, any realized IOI below two samples is clamped to two samples.

12,000-pulse runtime guard

Version 1.1.1 limits a realization to 12,000 pulses. This is important because the duty gate is assembled with one Formula (part) operation per event.

If the limit would be exceeded, the script stops with a message asking for lower density, longer period, or shorter duration rather than attempting an impractically large gate.

Output and normalization

PropertyBehavior
InputExactly one non-silent Sound used as the kernel.
DurationExactly the requested Duration after convolution is cropped to 0…Duration.
Sample rateExactly the selected output rate; the kernel is resampled when necessary.
ChannelsFollows the selected kernel's channel count.
Normalize output = onEvery nonzero result is peak-scaled to Output peak. This can scale either up or down.
Normalize output = offNo final peak scaling; the level produced by convolution, gating, fades, and AM is retained.
RandomnessOnly onset timing can be stochastic: Poisson timing or Periodic jitter. The positive seed is reproducible and scoped to onset generation.
Object namePulsar_<preset>_<mode>.
Normalize output is target normalization, not down-only protection. If enabled, a quiet nonzero result is amplified to the selected Output peak as well as a loud result being attenuated to it.

Visualization and QC

The v1.1 visualization is mechanism-first rather than an eight-panel result overview.

PanelWhat it shows
A — Onset ProcessRealized IOIs through time against the model: fixed period, linearly changing period for chirp, or the Poisson expected IOI 1/λ.
B — Pulsar GeometryOne representative realized IOI with the actual Hann gate and the boundary between active time and silence.
C — Timbre + Post ControlThe selected/resampled kernel waveform plus the global fade envelope and, when active, the AM gain curve.
D — Measured OutputThe final measured output waveform after convolution, duty gate, fades, AM, and optional normalization.

The QC summary reports the onset model, pulse count, realized rate, mean IOI and CV when available, Duty cycle, mean active window, kernel/active ratio, under-resolved gate count, output channel count, final peak/RMS, pre-normalization peak, and sample rate.

Further reading