Grisey — Spectral Becoming Engine — User Guide

Spectral synthesis engine inspired by Gérard Grisey's concept of "spectral becoming" (devenir spectral). Generates slowly evolving additive synthesis sounds that transform from fused harmonic timbres into progressively inharmonic, spectrally diffused textures.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 1.0 (2025) Citation: Cohen, S. (2025). Praat AudioTools Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

This script implements a Spectral Becoming Engine — an additive synthesis system that models the continuous transformation from harmonic to inharmonic spectra, a central concept in the spectral music of Gérard Grisey (1946-1998). The engine generates slowly evolving sounds where individual partials undergo frequency chirps, spectral energy redistribution, and micro-detuning, creating the illusion of a single sound "becoming" something else over time.

🎼 What is Spectral Becoming?

Gérard Grisey, a founder of the spectral school of composition, explored the idea that sound is not a static object but a process in time — a "becoming." His works like Partiels (1975) and the cycle Les Espaces Acoustiques (1974-85) feature sounds that gradually transform:

  • Harmonic fusion: Initially, partials are locked to harmonic ratios, creating a fused, instrumental timbre
  • Spectral fission: Over time, partials drift apart, becoming inharmonic and eventually noise-like
  • Beating patterns: Micro-detuning creates audible amplitude fluctuations (beats)
  • Threshold perception: The ear hears the transformation not as a succession of timbres but as a single evolving entity

This engine implements these principles through phase-correct frequency chirps, time-varying amplitude envelopes, and controlled inharmonicity.

Key Features:

Technical Implementation: (1) Partial Parameters: For each harmonic n, compute start frequency f0×n, end frequency f0×n^(1+inharm) with detuning, start amplitude 1/n^α_start, end amplitude 1/n^α_end. (2) Additive Synthesis: Create each partial using phase-correct formulas based on curve type, accumulate into buffer. (3) Global Processing: Apply cosine fade in/out, add spectral breathing AM. (4) Visualization: Spectrogram with overlaid frequency trajectories, waveform zooms of start and end states.

Quick start

  1. In Praat, ensure no objects are selected (script generates new sound).
  2. Run script… → select Grisey_Spectral_Becoming_Engine.praat.
  3. Choose Preset (2-6 for specific strategies, 1 for custom).
  4. Set fundamental frequency, number of partials, and duration.
  5. Adjust inharmonicity factor and micro-detuning amount.
  6. Select temporal curve shape.
  7. Enable Show_visualization for spectrogram with partial trajectories.
  8. Click OK — engine synthesizes, applies envelope/breathing, creates "Grisey_PresetName_f0Hz" sound.
Quick tip: Start with Partiels preset (trombone E1, 41.2 Hz, 30 seconds). Enable visualization — you'll see the spectrogram with colored partial trajectories showing the gradual frequency drift. Listen for the transformation from a fused, low brass-like tone to a shimmering, inharmonic texture. The output appears as "Grisey_Partiels_41Hz" in the Objects window. For a longer, more meditative experience, try the Gondwana preset (45 seconds).
Important: NYQUIST LIMIT — Partials exceeding 95% of Nyquist frequency are automatically skipped. For high fundamentals or many partials, you may lose high partials. SYNTHESIS TIME scales with number of partials × duration. 24 partials for 30 seconds takes 10-20 seconds. PHASE-CORRECT FORMULAS ensure no frequency glitches; however, complex formulas may be slow to evaluate. BREATHING DEPTH > 0.3 may cause audible amplitude pumping. CURVE CHOICE affects when the spectral change occurs: Exponential = early, Linear = even, Logarithmic = late.

Spectral Becoming Theory

The Partial Evolution Equation

For partial number n (1 to N): Start frequency: f_start(n) = f0 × n End frequency: f_end(n) = f0 × n^(1 + inharm) + detuning(n) where detuning(n) ∼ 𝒩(0, detHz × n/N) (Gaussian, scaled by partial number) Amplitude: A(n,t) = 1 / n^α(t) where α(t) = α_start × (1 - u(t)) + α_end × u(t) α_start = 1.0 (natural harmonic rolloff) α_end = 1.0 - inharm × 1.5 (minimum 0.2) Frequency interpolation: f(n,t) = f_start(n) + [f_end(n) - f_start(n)] × c(t/duration) where c(u) is the temporal curve function

Temporal Curve Functions

📈 The Three Curves

Linear (u): c(u) = u
Even distribution of change throughout duration.

Exponential (early change): c(u) = (e^(3u) - 1) / (e^3 - 1)
Most change occurs in the first half; later partials stabilize.

Logarithmic (late change): c(u) = ln(1 + 9u) / ln(10)
Change accelerates toward the end; initial spectrum remains stable longer.

Phase-correct integration: For each curve, we derive the exact integral ∫f(t)dt to ensure correct instantaneous phase, preventing frequency glitches or phase discontinuities.

Inharmonicity Formula

🎵 From Harmonic to Inharmonic

Natural harmonic series: f_n = f0 × n

Inharmonic series: f_n = f0 × n^(1 + β), where β = inharmonicity_factor

βEffectExample
0.00-0.02Subtle inharmonicity, beatingMeditation preset
0.03-0.06Moderate inharmonicity, bell-likePartiels, Prologue
0.07-0.12Strong inharmonicity, metallicGondwana
0.15-0.25Extreme inharmonicity, spectral dissolutionVortex

The exponent (1+β) means higher partials are stretched more than lower ones — a realistic model for stiff strings, bells, and gongs.

Micro-Detuning and Beating

Each partial receives an independent, normally distributed frequency offset: Δf_n ∼ 𝒩(0, detHz × n/N) The standard deviation scales with partial number, so higher partials have more detuning — mimicking the behavior of real instruments where upper harmonics are less stable. When two partials are close in frequency (within 10-15 Hz), they produce audible amplitude beating at the difference frequency. As the sound evolves, beating patterns emerge and shift, creating the "living" quality Grisey sought.

Spectral Brightness Evolution

Amplitude rolloff follows a power law: A_n ∝ 1 / n^α α = 1.0 gives the classic 1/n harmonic rolloff (fused timbre) α < 1.0 emphasizes higher partials (brighter) α > 1.0 attenuates higher partials (darker) In this engine, α decreases over time (brighter end state): α_start = 1.0 α_end = max(0.2, 1.0 - inharm × 1.5) Thus, as inharmonicity increases, the spectrum also brightens — a natural correlation.

Spectral Breathing

Global amplitude modulation: A_global(t) = 1 + depth × sin(2π × rate × t) where rate = breathRate (0.06-0.25 Hz), depth = breathDepth (0.08-0.20) This slow AM creates a "breathing" quality — the sound swells and recedes imperceptibly, mimicking the natural fluctuations of acoustic instruments and giving life to the synthetic texture.

Preset Strategies

Preset 2: Partiels (trombone E1, slow bloom)

🎺 Trombone E1 — 41.2 Hz

Partials: 24 | Duration: 30 s

Inharmonicity: 0.04 | Detuning: 1.5 Hz

Curve: Logarithmic (late change)

Breathing: 0.12 Hz, depth 0.10

Character: Slow bloom from low brass-like fusion to shimmering inharmonic texture. Inspired by the opening of Partiels (1975).

Preset 3: Gondwana (deep drift)

🌍 Geological Time-Scale

Fundamental: 32.7 Hz (C1) | Partials: 32 | Duration: 45 s

Inharmonicity: 0.08 | Detuning: 3.0 Hz

Curve: Logarithmic

Breathing: 0.08 Hz, depth 0.15

Character: Very slow, deep transformation — massive low-end evolving into complex inharmonic cloud.

Preset 4: Vortex (fast dissolution)

🌀 Rapid Spectral Fission

Fundamental: 65.4 Hz (C2) | Partials: 20 | Duration: 15 s

Inharmonicity: 0.20 | Detuning: 5.0 Hz

Curve: Exponential (early change)

Breathing: 0.25 Hz, depth 0.08

Character: Rapid dissolution from harmonic to chaotic — vortex of sound.

Preset 5: Meditation (static shimmer)

🧘 Near-Harmonic Drift

Fundamental: 55.0 Hz (A1) | Partials: 16 | Duration: 60 s

Inharmonicity: 0.01 | Detuning: 0.8 Hz

Curve: Linear

Breathing: 0.06 Hz, depth 0.20

Character: Minimal inharmonicity, subtle beating — meditative, shimmering texture.

Preset 6: Prologue (voice-like)

🗣️ Mid-Range Formant Region

Fundamental: 110.0 Hz (A2) | Partials: 18 | Duration: 25 s

Inharmonicity: 0.06 | Detuning: 2.5 Hz

Curve: Linear

Breathing: 0.18 Hz, depth 0.14

Character: Voice-like range, moderate transformation — prologue to a spectral journey.

Parameters & Controls

Spectral Source

ParameterDefaultDescription
Fundamental_Hz41.2Base frequency of harmonic series (Hz)
Number_of_partials24Number of harmonics to synthesize
Duration_s30Total duration in seconds

Transformation

ParameterDefaultDescription
Inharmonicity_factor0.05Exponent for inharmonic stretching (0 = harmonic)
Micro_detuning_Hz2.0Standard deviation of frequency detuning (scaled by partial)

Temporal Shape

ParameterDefaultDescription
Temporal_curveLogarithmicShape of evolution: Linear, Exponential, Logarithmic

Output

ParameterDefaultDescription
Sample_rate44100Output sample rate (Hz)
Show_visualization1Generate spectrogram with partial trajectories

Fixed Parameters (internal)

ParameterDefaultDescription
breathRate0.12-0.25Spectral breathing frequency (Hz)
breathDepth0.08-0.20Breathing modulation depth
fadeInFraction0.02-0.08Fraction of duration for fade in
fadeOutFraction0.08-0.15Fraction of duration for fade out
alphaStart1.0Spectral rolloff at start (1/n^α)
alphaEndmax(0.2, 1.0 - inharm×1.5)Rolloff at end

Visualization & Analysis

3-Panel Display

Grisey Spectral Becoming Visualization: Panel 1: TITLE • Script name, preset, fundamental, partial count, duration, curve type Panel 2: SPECTROGRAM WITH PARTIAL TRAJECTORIES (main panel) • X-axis: Time (0 to duration) • Y-axis: Frequency (Hz) up to max partial frequency × 1.25 • Background: Grayscale spectrogram (narrow-band, 50 ms window) • Overlay: Colored lines showing frequency evolution of each partial - Color gradient: low partials (warm yellow) → high partials (cool cyan) • 40-point piecewise linear trajectories based on selected curve • Title: "Spectrogram with Partial Trajectories" Panel 3: WAVEFORM ZOOM: Start vs End • Left panel: First 0.5s (or 10% of duration) of waveform — harmonic fusion state - Blue waveform - Title: "Start: Harmonic Fusion" • Right panel: Last 0.5s before fade-out — spectral dissolution state - Orange waveform - Title: "End: Spectral Dissolution" • Both zoomed to same amplitude scale for comparison Panel 4: STATS PANEL • Source parameters: f0, partials (active/total), frequency range, duration, sample rate • Transformation: inharmonicity, detuning, curve, brightness change (α start→end) • Envelope: fade in/out durations, breathing rate/depth, preset name Panel 5: LEGEND • Color key: low/mid/high partials, start/end waveforms

Reading the Partial Trajectories

What the colored lines tell you:
  • Warm colors (yellow-orange): Low partials (fundamental, 2nd, 3rd) — they change less in frequency but carry most energy
  • Mid colors (green-teal): Middle partials — where most spectral evolution occurs
  • Cool colors (cyan-blue): High partials — they drift the most, often crossing and becoming inharmonic
  • Slope: Steeper lines = faster frequency change; shallower = stable
  • Curvature: Reflects the chosen temporal curve (linear = straight, exponential = early bend, logarithmic = late bend)

Comparing Start and End Waveforms

What to look for in the waveform zooms:
  • Start waveform (blue): Regular, periodic pattern — reflects harmonic fusion, clear fundamental periodicity
  • End waveform (orange): Irregular, complex pattern — reflects spectral dissolution, loss of periodicity
  • Amplitude comparison: Both shown at same scale; end may have different peak structure due to beating

Applications

Compositional Material

Use case: Generating source material for electroacoustic compositions

Technique: Use different presets as building blocks; layer multiple outputs

Workflow:

Cross-Synthesis Source

Use case: Using the evolving spectrum as a filter envelope for other sounds

Technique: In Praat or other software, use the generated sound as:

Time-Stretching Exploration

Use case: Revealing micro-structures through extreme time-stretching

Technique: Use Praat's Manipulation or external tools to stretch the output by 10-100×

Result: The already slow evolution becomes geological — individual partial trajectories become audible as glissandi, beating patterns become separate events

Educational Demonstration

Use case: Teaching spectral music concepts to students

Technique: Enable visualization, compare presets, discuss relationship between parameters and sound

Learning outcomes:

Practical Workflow Examples

🎬 Film Score: Transformation Cue

Goal: Create a 45-second cue representing a character's psychological transformation

Settings:

  • Preset: Gondwana (deep, slow drift)
  • Customize: duration = 45s, inharm = 0.10 (more extreme), detuning = 4.0 Hz
  • Curve: Exponential (early change for dramatic onset)

Result: Deep, rumbling low end gradually dissolves into complex, shimmering texture — perfect for transformation scenes

🎚️ Electronic Music: Buildup Riser

Goal: Create a 15-second riser effect for EDM drop

Settings:

  • Preset: Vortex (fast dissolution)
  • Fundamental: 110 Hz (higher for more energy)
  • Inharm: 0.25 (extreme)
  • Curve: Exponential

Result: Rapid transformation from harmonic tone to chaotic noise cloud — effective riser

🔬 Research: Perceptual Thresholds of Inharmonicity

Goal: Generate stimuli for psychoacoustic experiments on inharmonicity perception

Settings:

  • Generate multiple versions with inharmonicity from 0.01 to 0.10 in steps of 0.01
  • Keep all other parameters constant (Meditation preset)
  • Present pairs (harmonic vs. inharmonic) to listeners

Result: Determine just-noticeable difference for inharmonicity in complex tones

Troubleshooting Common Issues

Problem: High partials missing from output
Cause: Partials exceeding Nyquist frequency are automatically skipped
Solution: Reduce number_of_partials, lower fundamental, or increase sample rate
Problem: Synthesis very slow
Cause: Many partials × long duration × complex formulas
Solution: Reduce partials (16-20), reduce duration, use Linear curve (simplest formula)
Problem: Audible clicks at start/end
Cause: Fade in/out too short or nonexistent
Solution: Increase fadeInFraction/fadeOutFraction in script (0.05-0.10)
Problem: Beating too strong or too weak
Cause: Micro_detuning_Hz inappropriate for fundamental
Solution: Adjust detuning — as rule of thumb, keep < 5% of f0 for subtle beating, >10% for prominent beats
Problem: Breathing modulation too obvious
Cause: breathDepth > 0.25 or breathRate too high
Solution: Reduce depth (0.08-0.15), keep rate below 0.2 Hz

Advanced Techniques

Customizing the amplitude envelope:

In the script, modify the Formula sections for fade in/out and breathing to implement different shapes (e.g., exponential fade, Hanning window).

Adding formant filtering:

After synthesis, apply a formant filter (e.g., Filter (pass Hann band) around desired formant frequencies) to impose vocal tract-like resonances — creating a "sung" quality.

Creating evolving chords:

Generate multiple sounds with related fundamentals (e.g., perfect fifth apart) and mix them. The inharmonic evolution will create complex harmonic relationships over time.

Microtonal variations:

Modify the start frequencies to use just intonation or equal temperament ratios instead of pure harmonics. Experiment with f0 × (n × ratio) for microtonal spectra.