GRM-Style Resonator — User Guide

A stereo resonant filter-bank processor that extracts selected frequency bands, rings each band with a tuned or fixed delay-line resonator, shapes the bank spectrally, and distributes the bands across a stereo field.

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

What this does

GRM-Style Resonator builds a bank of narrow or moderate-width frequency bands from the selected Sound. Each band is multiplied by a frequency-dependent gain, passed through a delay-line resonator, assigned left/right gains, and added to a stereo wet bus. The wet bank is then blended with the source according to dryWet.

The center frequencies can come from a manual list, a harmonic series, or a list of inharmonic ratios. The delay can follow each band center or use one fixed manual delay for every band. Two bounded resonance models are available: a finite echo train and a single recursive feedback comb.

About “GRM-Style”: the name describes an aesthetic connection to resonant spectral transformation associated with GRM Tools. This script is not a reimplementation of the GRM Tools Reson algorithm. The present processor uses Praat Hann band-pass filters followed by delay-line resonators.

Quick start

  1. Select exactly one mono or stereo Sound object in Praat.
  2. Run GRM-Style_Resonator.praat.
  3. Choose a preset, or use Custom to define the frequency bank.
  4. Choose Finite echoes or Single feedback comb.
  5. Set the bank gain, spectral gain profile, stereo architecture, and dryWet.
  6. Choose the output-level mode. Safety ceiling is the default.
  7. Run the script. The result is named <source>_GRMstyle_<preset>.
Starting point: Harmonic Organ is useful for a clearly pitched resonant bank; Inharmonic Metallic and Sparse Bells emphasize non-harmonic ringing; Formant-ish concentrates energy around a fixed set of broad resonance regions.

Signal flow

INPUT SOUND ↓ optional zero tail ↓ frequency-bank generation ↓ Hann band-pass per center frequency ↓ per-band gain profile ↓ finite echo train OR single feedback comb ↓ per-band stereo coefficients ↓ sum to stereo wet bus ↓ dry / wet blend ↓ optional safety ceiling or peak normalization ↓ OUTPUT SOUND

The source is not pitch-tracked. When tuned delay is enabled, the delay is calculated directly from each requested band center frequency.

Presets

Presets override the bank/tuning parameters listed below, but they do not change the selected resonator model, Dry/Wet value, output-level mode, visualization, playback, tail length, random seed, or final ceiling.

PresetFrequency bankBandwidthDelay / resonance settingsGain / pan
CustomUses the form fields80 Hz defaultTuned delay; 3 iterations; decay 0.60 by default+6 dB; Dampen Highs; Wide Spread by default
Harmonic (organ-like)8 bands: 110 × 1…8 Hz100 HzTuned delay; 20 iterations; decay 0.85Dampen Highs; Stereo Spread
Inharmonic metallic200 Hz × 1, 1.59, 2.14, 2.76, 3.41, 4.0740 HzTuned delay; 10 iterations; decay 0.70Flat; Wide Spread
Formant-ish500, 1500, 2500, 3500, 4500 Hz200 HzFixed 6 ms delay; 2 iterations; decay 0.40Dampen Highs; V Shape
Sparse bells287, 645, 1203, 2156 Hz35 HzTuned delay; 40 iterations; decay 0.95+12 dB; Dampen Highs; Random
Resonator model remains user-controlled: the preset values for ringIterations matter only when Finite echoes is selected. In Single feedback comb mode, ringIterations is intentionally ignored.

Parameters

Frequency-bank controls

ControlDefaultMeaning
numBands6Maximum number of bands used. A manual or ratio list is truncated to this count.
tuningModeManual listManual center frequencies, harmonic multiples of baseFreqHz, or baseFreqHz × ratio.
manualFrequencies300 520 890 1440 2330 3770Space-separated center frequencies in Hz.
baseFreqHz110Base frequency for harmonic and inharmonic-ratio modes.
ratioList1 1.41 1.89 2.37 2.98 3.56Space-separated multipliers used by Inharmonic ratios mode.
bandwidthHz80 HzNominal pass-band width around each center frequency.

Every center frequency must lie above 20 Hz and below Nyquist − 20 Hz. Invalid centers stop the script rather than being silently moved. At the spectrum edges, the actual pass-band limits are constrained to the same usable range.

Band filtering

Each band is extracted with Praat’s Filter (pass Hann band). Transition smoothing follows the actual band width:

smoothing = max(10 Hz, min(100 Hz, actual_bandwidth / 2))

The pale transition regions and darker pass regions are shown separately in the visualization.

Gain profile

ProfileBehavior
Flat (Equal)Every band receives the linear gain corresponding to gainDB.
Dampen HighsGain falls from full base gain at the lowest center to 20% of that gain at the highest center.
Boost HighsGain rises from 20% of base gain at the lowest center to full base gain at the highest center.

The tilt position is calculated from log frequency, not from the order in which frequencies were entered. An unsorted manual list therefore still receives a frequency-correct tilt.

Advanced settings inside the script

SettingDefaultMeaning
tune_Delay_To_Pitch1Use a delay derived from each band center. Despite the historical variable name, this is frequency tuning, not pitch analysis.
manual_Ring_Delay_Ms8 msOne fixed delay for all bands when tuned delay is disabled.
tail_ms0Append silence before processing so resonance can continue beyond the original ending. Output duration grows by this amount.
random_seed00 gives unseeded Random panning; a non-zero integer makes the random band positions reproducible.
finalPeak0.99Target used by Safety ceiling and Peak normalize.
keep_individual_bands0When enabled, retains the generated per-band Sound objects after the final mix.

Resonator models

Frequency-tuned integer delay

With tuned delay enabled, each band uses:

D = round(sampleRate / centerFrequency) actual tuned frequency = sampleRate / D

The delay is therefore quantized to whole samples. The actual tuned frequency may differ from the requested band center, especially at high frequencies or low sample rates. The Info window reports the actual frequency and tuning error in cents for every band. This is frequency-derived delay tuning; the script performs no F0 or pitch analysis of the input.

Finite echoes (N taps, bounded)

This model adds delayed copies of the original filtered band:

y[n] = x[n] + a x[n-D] + a² x[n-2D] + … + aᴺ x[n-ND]

ringIterations sets N. ringDecay is a and must be at least 0 and below 1. Because every tap reads the same original band rather than the previous processed result, this is a finite, bounded echo train.

Single feedback comb (decay only)

This model uses one recursive delay:

y[n] = x[n] + a y[n-D]

ringDecay controls the feedback. ringIterations is not used in this mode. A decay of 0 produces no added resonance; values approaching 1 create progressively longer and stronger ringing.

Level: neither resonator model contains an internal peak normalization or hidden wet-bus limiter. High band gain, high decay, multiple overlapping bands, and strong wet mix can therefore produce peaks above 1.0 in Natural level mode.

Stereo architecture

The wet bank is always a two-channel stereo bus. Mono and stereo inputs are handled differently:

ArchitectureLeft / right coefficients per band
All Center (dual mono)1.0 / 1.0. On stereo input this preserves the two sides rather than summing them.
Stereo Spread (Alternate)Alternates 1.0/0.3 and 0.3/1.0.
Wide Spread (Hard L/R)Alternates 1.0/0.0 and 0.0/1.0.
Left Heavy1.0 / 0.3 for every band.
Right Heavy0.3 / 1.0 for every band.
V Shape (Outside In)Moves coefficients toward the opposite side around the middle of the band list, then outward again.
RandomFor each band, R is random in 0…1 and L = 1 − R.

Dry/Wet and output behavior

dryWet ranges from 0 to 1. At values above 0, the output is a stereo blend of dry and wet. A mono dry source is converted to stereo before this blend.

True bypass: when dryWet = 0, the script copies the working source directly, preserves its original channel count, and skips the output-level stage. With tail_ms = 0, this is a sample-preserving bypass. If a tail has been requested, the bypass includes the appended silence and is therefore longer than the original.

Output level modes

ModeBehavior
Natural levelNo level correction. The natural result of band gain, resonance, panning and mixing is retained.
Safety ceiling (default)If the output peak exceeds finalPeak (0.99 by default), the whole result is attenuated to that ceiling. Quieter results are left untouched.
Peak normalizeAny non-silent result is scaled so its peak equals finalPeak, whether this requires attenuation or amplification.

If Natural level produces a peak above 1.0, the Sound object is left unchanged and the Info window warns about integer-PCM clipping. Playback uses a temporary peak-scaled copy so audition does not require altering the stored output.

Time, duration, and naming

Visualization

When Draw_visualization is enabled, the script creates a suite-standard 8-inch diagnostic page containing:

The plot describes the requested center frequencies. For tuned integer delays, the exact delay-derived frequency and cents error are reported numerically in the Info window.

Practical notes