Pulsar Synthesis Engine — v1.0 User Guide
Advanced implementation of Curtis Roads' pulsar synthesis technique (Roads, 2001). Generates sounds ranging from pitched tones through rhythmic pulsing to complex noise textures by controlling the ratio of pulsaret duty‑cycle to inter‑onset interval.
What this does
Pulsar Synthesis Engine implements the classic pulsar synthesis technique described by Curtis Roads in Microsound (2001). A pulsar is a short waveform (pulsaret) that repeats with a given period. By controlling the ratio of the pulsaret's duration (duty cycle) to the inter‑onset interval, the synthesis spans a continuum from pitched tones (short period, high overlap) to rhythmic pulses (long period) to granular noise (stochastic onsets).
- Mode A – Periodic Pulsar Train – regular inter‑onset intervals (constant or chirped).
- Mode B – Stochastic Pulsar Cloud – Poisson‑distributed onsets, creating clouds and textures.
The pulsaret waveform is taken from a Sound object selected in Praat – any sound can become the grain. The engine then builds a pulse train, shapes each pulse with a Hanning window (duty‑cycle control), convolves with the pulsaret, applies envelope, AM, and chirp.
Quick start
- In Praat, select exactly one Sound object (this will be the pulsaret waveform – can be anything from a sine tone to a field recording).
- Run script… →
Pulsar_Synthesis_Engine.praat. - Choose a Preset:
- Periodic Tone, Rhythmic Pulse, Stochastic Cloud, Chirp Sweep, Tremolo Web, Noise Burst
- For custom mode (preset = Custom), adjust parameters as desired:
- Synthesis_mode – Periodic (Mode A) or Stochastic (Mode B).
- Duration_s, Period_s (Mode A), Density_pulses_per_s (Mode B).
- Duty_cycle – fraction of period occupied by the pulsaret.
- Period_jitter_ratio – random variation of onset times.
- Enable_chirp (Mode A) – glide from base period to chirp_end_period.
- Enable_am – amplitude modulation (tremolo) with rate and depth.
- Fade_in_s / Fade_out_s – cosine fades.
- Click OK. The engine builds the pulse process, shapes the pulsarets, convolves with the selected sound, and creates a new Sound object named
Pulsar_presetname_mode.
The 6 presets (+ Custom)
| Preset | Mode | Period/density | Duty | Special | Description |
|---|---|---|---|---|---|
| Periodic Tone | A | 10 ms (100 Hz) | 0.5 | – | Clean pitched tone – harmonic fundamental. |
| Rhythmic Pulse | A | 250 ms (4 Hz) | 0.15 | jitter 0.05 | Sub‑audio rhythm, percussive. |
| Stochastic Cloud | B | density 100 /s | 0.5 | – | Poisson cloud – granular texture. |
| Chirp Sweep | A | 20→2 ms (50→500 Hz) | 0.5 | chirp | Gliding pitch – sweeping tone. |
| Tremolo Web | B | density 150 /s | 0.4 | AM 6 Hz, depth 0.7 | Cloud with amplitude modulation. |
| Noise Burst | B | density 400 /s | 0.8 | – | Very dense, near‑noise burst. |
The perceptual continuum
Pulsar synthesis spans a full perceptual continuum based on period and duty cycle:
- Short period (< 20 ms) → pitched tone region (fundamental frequency = 1/period).
- Medium period (20–200 ms) → transition texture – between pitch and rhythm.
- Long period (> 200 ms) → rhythmic pulse / rhythm.
- Duty cycle < 0.2 → sparse clicks / sparser texture.
- Duty cycle > 0.7 → overlapping, washy texture.
- Poisson mode (B) → stochastic cloud / granular noise.
- Chirp sweep → gliding pitch / spectral smear.
- Combine with AM → tremolo / formant‑like modulation.
Suggested uses:
- Cross‑synthesis: use musical sounds as pulsaret kernel.
- Rhythm‑to‑pitch continuum exploration.
- Stochastic textures for electroacoustic composition.
- Layering with Grisey Spectral Becoming Engine output.
Synthesis modes
Mode A – Periodic Pulsar Train
Pulse onsets are generated with a constant base period, optionally modified by:
- Jitter – Gaussian jitter added to each period (scaled by
period_jitter_ratio). - Chirp – linear glide from
period_sat t=0 tochirp_end_period_sat t=duration.
The engine builds the pulse train by placing points in a PointProcess (manual placement when chirp/jitter are active; otherwise uses built‑in Fill).
Mode B – Stochastic Pulsar Cloud
Pulse onsets follow a Poisson process with mean rate density_pulses_per_s. The inter‑onset intervals are exponentially distributed, creating a natural cloud texture.
Jitter is not used in this mode (the Poisson process already provides randomness).
Pulsaret shaping
After the pulse train is created, each pulse is shaped with a Hanning window of width duty_cycle × IOI. This is implemented by building a gate sound that sums raised‑cosine windows for each pulse, then multiplying with the pulse train. This windowing smooths the pulsaret and controls the spectral spread.
Parameters & defaults
Timing
| Parameter | Range | Default | Description |
|---|---|---|---|
| Duration_s | any positive | 3 s | Total duration of the synthesized sound. |
| Period_s (Mode A) | ≥ 0.0005 | 0.01 s | Base period between pulses (in seconds). |
| Density_pulses_per_s (Mode B) | ≥ 1 | 100 | Mean pulse density for Poisson process. |
Pulsaret shape
| Parameter | Range | Default | Description |
|---|---|---|---|
| Duty_cycle | 0.01–0.99 | 0.5 | Fraction of the IOI occupied by the pulsaret (Hanning window). |
| Period_jitter_ratio | ≥0 | 0.0 | Gaussian jitter added to each period (standard deviation = ratio × base period). |
Chirp (Mode A only)
| Parameter | Range | Default | Description |
|---|---|---|---|
| Enable_chirp | yes/no | 0 | Enable linear glide of period. |
| Chirp_end_period_s | ≥0.0005 | 0.005 s | Period at the end of the duration (linear interpolation). |
Amplitude modulation
| Parameter | Range | Default | Description |
|---|---|---|---|
| Enable_am | yes/no | 0 | Enable amplitude modulation (tremolo). |
| Am_rate_hz | ≥0 | 4.0 Hz | Modulation frequency. |
| Am_depth | 0–1 | 0.5 | Modulation depth (1 = full tremolo). |
Envelope
| Parameter | Range | Default | Description |
|---|---|---|---|
| Fade_in_s | ≥0.005, ≤ duration×0.4 | 0.05 s | Cosine fade‑in duration. |
| Fade_out_s | ≥0.005, ≤ duration×0.4 | 0.10 s | Cosine fade‑out duration. |
Output
| Parameter | Default | Description |
|---|---|---|
| Sample_rate | 44100 Hz | Output sample rate. |
| Show_visualization | yes | Draw detailed 8‑panel visualisation (waveform, spectrogram, zooms, stats). |
Visualization (8 × 5.9 inch canvas)
When Show_visualization = 1, the script draws a comprehensive multi‑panel plot matching the layout of the Grisey Spectral Becoming Engine:
- Title row – preset, mode, period, duty, duration.
- Waveform overview (full duration) with pulse onset markers (orange ticks) overlaid.
- Spectrogram (0–4 kHz) with onset markers (short ticks) and, if chirp enabled, the chirp frequency curve (red).
- Waveform zooms – start (blue) and end (orange) 50 ms segments, with shared amplitude scale.
- Stats panel – mode, preset, duration, SR, period, duty, jitter, pulse count, AM/chirp status, fade times.
- Legend – waveform (blue), pulse onsets (orange), start zoom (blue), end zoom (orange), chirp curve (red).
FAQ / troubleshooting
Check that you have selected a Sound object before running the script – this becomes the pulsaret waveform. If the selected sound is extremely quiet, the convolution may produce low output. Also verify that Duty_cycle is not too small – if the pulsaret window is shorter than one sample, it may be skipped.
The duty‑cycle gate is built by iterating over each pulse and adding a Hanning window via Formula (part). For thousands of pulses (e.g., Noise Burst with 400 pulses/s × 2 s = 800 pulses), this can take a few seconds. Progress is printed every 50 pulses – be patient.
The chirp linearly interpolates the period, not frequency. Frequency = 1/period. A linear glide from period 0.02 s (50 Hz) to 0.002 s (500 Hz) produces a non‑linear frequency glide (accelerating upward). This is intended and matches Roads' descriptions of chirped pulsars.
The duty cycle determines how much of the inter‑onset interval is filled by the pulsaret. A low duty cycle (e.g., 0.1) gives isolated clicks; a high duty cycle (e.g., 0.8) causes overlap and a washy texture. When duty cycle > 0.5, pulsarets may overlap, creating complex interference patterns.
Jitter adds Gaussian noise to each period (p_jitter = period + Gauss(0, period × jitter_ratio)). This slightly randomises the onset times, broadening the spectrum and softening the pitch. Values up to 0.2 are typical.
In Poisson mode, the mean pulse density is set by density_pulses_per_s. The actual number of pulses may vary around duration × density. The Info window reports the exact pulse count after generation.