GRM-Style Resonator — User Guide

Filter bank resonator inspired by GRM (Groupe de Recherches Musicales) techniques: multi-band filtering with pitch-synchronous delays, spectral tilt, and spatial architecture.

Author: Shai Cohen Version: 1.1 (2025) Technique: Resonant Filter Banks + Feedback Delays Application: Praat scripting language
Contents:

What this does

This script implements a GRM-style tuned resonator — a multi-band filter bank with frequency-synchronous feedback delays, inspired by the electroacoustic techniques developed at Groupe de Recherches Musicales (GRM) in Paris. The processor splits audio into multiple frequency bands, applies resonant feedback delays tuned to each band's center frequency, shapes gain via spectral tilt profiles, and positions bands in the stereo field using architectural panning strategies.

Key Features:

🎛️ What is GRM-Style Resonance?

The Groupe de Recherches Musicales (founded 1958 by Pierre Schaeffer) pioneered techniques for transforming recorded sound through filtering, feedback, and spatialization. This resonator implements three key GRM concepts:

  • Filter Banks: Splitting sound into discrete frequency regions for independent processing
  • Pitch-Synchronous Feedback: Delays tuned to the period of each band's center frequency (T = 1/f)
  • Spatial Architecture: Distributing frequency bands across the stereo field for spectral spatialization

The result: sounds that "ring" at their resonant frequencies, creating metallic, vocal, or bell-like timbres from any source material.

Technical Implementation: (1) Frequency Generation: Create N band center frequencies via manual list, harmonic series, or inharmonic ratios. (2) Filtering: Bandpass filter source into each frequency band (Hann window, adjustable bandwidth). (3) Resonator Physics: Apply cascading feedback delays with delay time = 1000/fc (pitch-synchronous) and exponential decay. (4) Gain Shaping: Apply spectral tilt profile (flat, dampen highs, boost highs) at specified gain level. (5) Spatialization: Position each band in stereo field using selected panning architecture. (6) Dry/Wet Mix: Blend processed and original signals with final peak normalization.

Quick start

  1. In Praat, select exactly one Sound object (any duration, mono or stereo).
  2. Run script… → select GRM_Tuned_Resonator.praat.
  3. Choose Preset (2-5 for specific characters, 1 for custom configuration).
  4. Adjust generator settings (number of bands, tuning mode, frequencies).
  5. Set resonance physics (delay tuning, iterations, decay).
  6. Configure gain profile and stereo panning architecture.
  7. Set dry/wet mix and final peak level.
  8. Enable Draw_visualization for graphical feedback.
  9. Click OK — processor generates bands, applies resonance, spatializes, creates "original_GRM_Tuned_preset" sound object.
Quick tip: Start with Harmonic Organ preset on sustained material (pad, vocal, string). For metallic effects, use Inharmonic Metallic preset. For voice coloring, try Formant-ish preset. Enable Draw_visualization to see band architecture and panning distribution. The output appears as "originalName_GRM_Tuned_PresetName" in Objects window. For advanced sound design, explore Custom mode with manual frequency lists and different panning architectures.
Important: RESONATOR FEEDBACK — High iteration counts (20+) with high decay (0.9+) can create extremely long ringing and potential clipping. Start with lower values. BANDWIDTH — Narrow bandwidths (20-50 Hz) create pure resonant peaks; wider bandwidths (100-200 Hz) create colored bands. PITCH-SYNCHRONOUS DELAYS — When enabled, delay = 1000/fc (ms). Low frequencies (e.g., 100 Hz = 10 ms delay) may require longer ringIterations to hear effect. STEREO INPUTS — Converted to mono for processing, then re-stereoized via panning architecture. HIGH FREQUENCY BANDS — May exceed Nyquist limit; automatically clamped to safe range.

GRM Resonance Theory

The Resonant Filter Bank

Resonant Filter Bank Architecture: ┌─ Filter 1 ─ Resonator 1 ─ Gain 1 ─ Pan 1 ─┐ │ │ Input Signal ───┼─ Filter 2 ─ Resonator 2 ─ Gain 2 ─ Pan 2 ─┼─ Sum → Output │ │ └─ Filter N ─ Resonator N ─ Gain N ─ Pan N ─┘ Each channel: 1. Bandpass Filter: Hann window, center = fc, bandwidth = B 2. Resonator: Cascading feedback delays, delay = T = 1/fc (or manual) 3. Gain Shaping: Linear gain with spectral tilt profile 4. Spatialization: Stereo pan coefficients (L,R)

Pitch-Synchronous Delay Physics

⏱️ Frequency-to-Delay Mapping

Fundamental relationship: Period T = 1 / frequency

Delay implementation: delSamples = round((1000.0 / fc) × samplingRate / 1000.0)

Simplified: delSamples = round(samplingRate / fc)

Example at 44100 Hz:

  • fc = 110 Hz → delay = 401 samples (9.1 ms)
  • fc = 440 Hz → delay = 100 samples (2.27 ms)
  • fc = 1000 Hz → delay = 44 samples (1.0 ms)
  • fc = 4000 Hz → delay = 11 samples (0.25 ms)

Physical meaning: The delayed signal reinforces the original at intervals matching the waveform's period, creating constructive interference at the resonant frequency — a tuned resonator.

Cascading Feedback Algorithm

For each iteration i from 1 to ringIterations: delay = delSamples × i decay = ringDecay^i s[n] = s[n] + decay × s[n - delay] Effect: • Creates exponentially decaying echo train • Echo spacing = fundamental period of fc • Pitched resonance: frequency-domain peaks at fc and harmonics • Decay rate controlled by ringDecay (0.0-1.0) Example: fc = 440 Hz, ringIterations = 10, ringDecay = 0.8 • Echoes at 2.27ms, 4.54ms, 6.81ms, ... • Amplitudes: 0.8, 0.64, 0.512, 0.410, ... • Creates "ringing" at 440 Hz and its harmonics

Tuning Modes

Mode 1: Manual Frequency List

Direct specification of band center frequencies: manualFrequencies$ = "300 520 890 1440 2330 3770" Parsing: Space-separated values Count determines actualNumBands Each frequency used directly as fc Use cases: • Formant synthesis (vowel resonances) • Specific harmonic/inharmonic collections • Exact frequency control

Mode 2: Harmonic Series

Harmonic series based on baseFreqHz: fc[i] = baseFreqHz × i Example: baseFreqHz = 110 Hz Band 1: 110 Hz (fundamental) Band 2: 220 Hz (octave) Band 3: 330 Hz (perfect fifth) Band 4: 440 Hz (octave) Band 5: 550 Hz (major third) Band 6: 660 Hz (perfect fifth) Band 7: 770 Hz (minor seventh) Band 8: 880 Hz (octave) Use cases: • Organ-like timbres • Additive synthesis • Harmonic reinforcement

Mode 3: Inharmonic Ratios

Inharmonic series from ratio list: fc[i] = baseFreqHz × ratio[i] Example metallic ratios (based on struck metal modes): ratioList$ = "1 1.59 2.14 2.76 3.41 4.07" Mathematical basis: • 1.59 ≈ 8/5 (minor sixth) • 2.14 ≈ 15/7 (approximate) • 2.76 ≈ 11/4 (approximate) • 3.41 ≈ 24/7 (approximate) • 4.07 ≈ 49/12 (approximate) Use cases: • Bell-like timbres • Cymbal/metal textures • Non-western scales

Spectral Gain Profiles

📊 Spectral Tilt Architectures

Flat (Equal): bandGain[i] = baseGainLin

All bands receive equal amplification. Pure additive approach.

Dampen Highs (Tilt Down): bandGain[i] = baseGainLin × (1.0 - 0.8 × (i-1)/(N-1))

High frequencies progressively attenuated. Warmer, darker timbre.

Boost Highs (Tilt Up): bandGain[i] = baseGainLin × (0.2 + 0.8 × (i-1)/(N-1))

High frequencies progressively emphasized. Brighter, more present timbre.

Base gain calculation: baseGainLin = 10^(gainDB/20)

Example: gainDB = 6 dB → baseGainLin = 10^(6/20) = 2.0 (linear doubling)

Stereo Panning Architectures

🎧 Spatial Distribution Strategies

ArchitectureLeft Gain (pL[i])Right Gain (pR[i])Spatial Effect
All Center (Mono)1.01.0No spatialization, summed to center
Stereo Spread (Alternate)Odd: 1.0, Even: 0.3Odd: 0.3, Even: 1.0Gentle alternation, full center blend
Wide Spread (Hard L/R)Odd: 1.0, Even: 0.0Odd: 0.0, Even: 1.0Extreme separation, no center
Left Heavy1.00.3All bands favor left channel
Right Heavy0.31.0All bands favor right channel
V Shape (Outside In)Low bands: 1.0→0.3, High bands: 0.3→1.0Low bands: 0.3→1.0, High bands: 1.0→0.3Extremes panned outward, center bands inward
Random1.0 - rrUnpredictable spatial placement

V-Shape Logic: Creates spatial arc — low and high frequencies at edges, mid frequencies at center. Mimics orchestral seating or spectral spatialization.

Preset Architectures

Preset 2: Harmonic Organ

🎹 Organ-like Resonance

Tuning: Harmonic series, baseFreqHz = 110 Hz

Bands: 8 (110, 220, 330, 440, 550, 660, 770, 880 Hz)

Bandwidth: 100 Hz (moderate, overlapping)

Resonance: Pitch-synchronous, 20 iterations, decay 0.85 (long ring)

Gain: Dampen Highs (warmer tone)

Panning: Stereo Spread (alternating L/R)

Character: Rich, organ-like resonance with harmonic reinforcement

Use on: Sustained pads, vocal holds, string ensembles

Preset 3: Inharmonic Metallic

🔔 Metallic/Glass-like Texture

Tuning: Inharmonic ratios, baseFreqHz = 200 Hz

Ratios: 1, 1.59, 2.14, 2.76, 3.41, 4.07

Bands: 6 (200, 318, 428, 552, 682, 814 Hz)

Bandwidth: 40 Hz (narrow, precise peaks)

Resonance: Pitch-synchronous, 10 iterations, decay 0.7 (moderate ring)

Gain: Flat (equal amplification)

Panning: Wide Spread (hard L/R alternation)

Character: Metallic, glass-like resonance with inharmonic spectra

Use on: Percussion, transient-rich material, abstract textures

Preset 4: Formant-ish (Voice Coloring)

🗣️ Vowel Formant Resonance

Tuning: Manual frequencies (vowel formants)

Frequencies: 500, 1500, 2500, 3500, 4500 Hz (approximate /a/ vowel)

Bands: 5

Bandwidth: 200 Hz (wide, formant-like)

Resonance: Manual delay, 6 ms, 2 iterations, decay 0.4 (subtle)

Gain: Dampen Highs (natural voice roll-off)

Panning: V-Shape (outside-in spatialization)

Character: Subtle vocal coloring, formant enhancement

Use on: Speech, vocals, any material needing "voice-like" quality

Preset 5: Sparse Bells

🕊️ Bell-like Resonance

Tuning: Manual frequencies (bell partials)

Frequencies: 287, 645, 1203, 2156 Hz (approximate bell modes)

Bands: 4

Bandwidth: 35 Hz (very narrow, pure tones)

Resonance: Pitch-synchronous, 40 iterations, decay 0.95 (very long ring)

Gain: Dampen Highs (natural decay), +12 dB boost

Panning: Random (unpredictable placement)

Character: Bell-like sustained resonance, sparse texture

Use on: Percussive attacks, piano, any transient material

System Components

Component 1: Frequency Generation

ParameterTypeDefaultDescription
numBandsinteger6Maximum number of bands (actual may vary)
tuningModeoptionManual listFrequency generation strategy
manualFrequenciessentence300 520 890 1440 2330 3770Space-separated frequency list (Hz)
baseFreqHzreal110Fundamental for harmonic/inharmonic modes
ratioListsentence1 1.41 1.89 2.37 2.98 3.56Inharmonic ratios

Component 2: Filtering

ParameterTypeDefaultDescription
bandwidthHzreal80Bandpass filter width (-3 dB points)
Filter typefixedHann bandHann window bandpass, 100 Hz smoothing
Edge clampingauto20 Hz - Nyquist-20Prevents out-of-range frequencies

Component 3: Resonator Physics

ParameterTypeDefaultDescription
Tune_Delay_To_Pitchboolean1Delay = 1000/fc (ms) when enabled
Manual_Ring_Delay_Msreal8Fixed delay when tuning disabled
ringIterationsinteger3Number of cascading feedback delays
ringDecayreal0.6Exponential decay factor per iteration

Component 4: Gain & Mix

ParameterTypeDefaultDescription
gainDBreal6Base gain in decibels (0 dB = unity)
Gain_ProfileoptionDampen HighsSpectral tilt strategy
dryWetreal0.60.0 = dry only, 1.0 = wet only
finalPeakreal0.99Output peak normalization level

Component 5: Stereo Panning

ParameterTypeDefaultDescription
Stereo_PanningoptionV ShapeSpatial distribution architecture
pL[i], pR[i]calculatedvariesLeft/right gain coefficients per band

Component 6: Output

ParameterTypeDefaultDescription
Keep_individual_bandsboolean0Preserve separate band Sound objects
Draw_visualizationboolean1Generate graphical analysis
Play_resultboolean1Audition after processing

Visualization & Analysis

Visualization Panels

GRM Resonator Visualization Layout: 1. TITLE PANEL • "GRM-Style Resonator: [source] [preset]" • Subtitle: "Pitch-Tracking Delays | Spectral Tilt | Stereo Architecture" 2. ORIGINAL WAVEFORM • Gray waveform display • Label: "Original Signal" 3. BAND FREQUENCY ARCHITECTURE • Frequency vs. Band Number plot • Colored rectangles representing each band's frequency range • Color intensity indicates gain (darker = damped, brighter = boosted) • Red center line marks exact fc • Label: "Band Architecture" 4. STEREO PANNING VISUALIZATION • Pan position vs. Band Number • Gold rectangles: left channel amplitude • Blue rectangles: right channel amplitude (inverted visually) • Dotted line: center reference • Label: "Stereo Panning: [architecture]" • Legend: Left/Right color key 5. PROCESSED WAVEFORM • Teal waveform (stereo) • Label: "Processed Signal (Stereo)" 6. GAIN PROFILE VISUALIZATION • Gain vs. Band Number line plot • Purple line connecting gain values • Magenta circles at each band • Label: "Gain Profile: [profile]" 7. INFO PANEL • Left column: Bands, Tuning, Bandwidth, Ring iterations, Decay, Tuned Delay • Right column: Gain, Tilt, Panning, Dry/Wet, Peak, Duration • Gray background with black border

Interpretation Guide

Reading the Band Architecture panel:
  • Vertical position: Frequency range of each band (low = bottom, high = top)
  • Rectangle height: Bandwidth (wider = taller rectangle)
  • Color intensity: Gain level (paler = lower gain, saturated = higher gain)
  • Red line: Exact center frequency
  • Pattern: Harmonic = evenly spaced, Inharmonic = irregular spacing
Reading the Stereo Panning panel:
  • Gold bars above center: Left channel amplitude (height = gain coefficient)
  • Blue bars below center: Right channel amplitude (depth = gain coefficient)
  • Center line: Equal balance reference
  • Pattern: Alternate = alternating sides, V-Shape = extremes at edges, Random = unpredictable
Reading the Gain Profile panel:
  • Purple line: Gain trend across frequency bands
  • Sloping down: Dampen Highs (darker, warmer)
  • Sloping up: Boost Highs (brighter, more present)
  • Flat line: Equal amplification

Applications

Sound Design & Textural Transformation

Use case: Transforming ordinary sounds into metallic, glass, or bell-like textures

Technique: Inharmonic metallic preset with narrow bandwidth, pitch-synchronous delays

Workflow:

Vocal Processing & Formant Design

Use case: Adding vocal character, creating choir effects, formant shifting

Technique: Formant-ish preset with manual frequency list of vowel formants

Formant frequency examples:

Settings: Wide bandwidth (150-250 Hz), manual delay (4-8 ms), few iterations (2-3), low decay (0.3-0.5)

Additive Synthesis & Harmonic Enhancement

Use case: Reinforcing harmonic content of musical sources

Technique: Harmonic organ preset with adjustable base frequency

Applications:

Spectral Spatialization

Use case: Distributing frequency content across stereo field for immersive audio

Technique: V-Shape panning or custom panning architectures

Concept: Low frequencies left, mid frequencies center, high frequencies right (or vice versa)

Implementation: Use V-Shape panning with custom frequency order, or create manual panning via custom mode

Practical Workflow Examples

🎬 Film Sound Design: Metal Impact

Goal: Create metallic impact from generic percussion

Settings:

  • Preset: Inharmonic Metallic
  • Modify: ringIterations = 30, ringDecay = 0.9
  • Panning: Wide Spread (hard L/R alternation)
  • Dry/Wet: 0.7 (70% wet)

Result: Percussion rings with metallic, glass-like resonance; stereo alternation creates spatial movement

🎵 Music Production: Vocal Doubler

Goal: Create subtle vocal enhancement/chorus effect

Settings:

  • Preset: Formant-ish
  • Modify: bandwidthHz = 150, ringIterations = 2, ringDecay = 0.3
  • Gain: gainDB = 3 dB (subtle boost)
  • Panning: Stereo Spread (gentle alternation)
  • Dry/Wet: 0.4 (40% wet)

Result: Vocal gains subtle resonant character, slight spatial spread without obvious processing

🎚️ Experimental: Bell Choir from Speech

Goal: Transform spoken voice into bell-like texture

Settings:

  • Preset: Sparse Bells
  • Modify: ringIterations = 50, ringDecay = 0.96 (very long ring)
  • Frequencies: Custom bell partials (try 180, 420, 890, 1520, 2380 Hz)
  • Panning: Random
  • Dry/Wet: 0.9 (90% wet)

Result: Speech transients excite bell-like resonances, creating ethereal, pitched texture from voice

Troubleshooting Common Issues

Problem: Output extremely loud/clipping
Cause: High gainDB + high ringIterations + high ringDecay = massive amplitude build-up
Solution: Reduce gainDB (0-3 dB), reduce ringIterations (3-10), reduce ringDecay (0.3-0.6), enable finalPeak normalization
Problem: No audible resonance/ringing
Cause: Insufficient ringIterations, low ringDecay, or bandwidth too wide
Solution: Increase ringIterations (10-20), increase ringDecay (0.7-0.9), reduce bandwidthHz (20-50 Hz)
Problem: Stereo image collapses or sounds phasey
Cause: Clashing panning coefficients or excessive wet mix with mono source
Solution: Try different panning architecture, reduce dryWet to 0.5-0.7, ensure bandwidth isn't extremely narrow
Problem: High frequencies missing or distorted
Cause: Bands exceeding Nyquist limit, automatically clamped
Solution: Reduce high frequencies in manual list, use lower baseFreqHz, increase sample rate
Problem: Processing very slow
Cause: High numBands (10+) with high ringIterations (20+) on long files
Solution: Reduce numBands, reduce ringIterations, disable Keep_individual_bands

Advanced Techniques

Custom frequency list strategies:
  • Octave multiples: 100, 200, 400, 800, 1600, 3200 Hz
  • Just intonation ratios: 1, 3/2, 5/4, 4/3, 5/3, 15/8
  • Bohlen-Pierce scale: 1, 1.68, 1.96, 2.34, 2.76, 3.23
  • Equal temperament: 440 × 2^(i/12) for i = -12 to +12
  • Fibonacci sequence: 1, 2, 3, 5, 8, 13, 21 (× base)
Resonator physics exploration:
  • Short resonance: ringIterations = 2-5, ringDecay = 0.3-0.5 (subtle coloration)
  • Long resonance: ringIterations = 30-50, ringDecay = 0.9-0.98 (bell-like)
  • Percussive resonance: ringIterations = 8-15, ringDecay = 0.7-0.8, narrow bandwidth
  • Non-pitched delay: Disable Tune_Delay_To_Pitch, set manual delay (2-50 ms)
  • Multi-tap effect: Increase ringIterations, keep ringDecay high