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.
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:
- 5 Compositional Presets — Harmonic organ, metallic inharmonic, formant voice, sparse bells, custom
- 3 Tuning Modes — Manual frequency list, harmonic series, inharmonic ratios
- Pitch-Synchronous Delays — Delay time = 1000/fc (ms), or manual ring time
- Iterative Feedback Resonator — Cascading delay lines with exponential decay
- Spectral Tilt Profiles — Flat, dampen highs, boost highs
- 7 Stereo Panning Architectures — From mono to complex spatial distributions
- Comprehensive Visualization — Band architecture, panning, gain profile, waveforms
- Individual Band Export — Optional preservation of separate band sounds
🎛️ 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
- In Praat, select exactly one Sound object (any duration, mono or stereo).
- Run script… → select
GRM_Tuned_Resonator.praat. - Choose Preset (2-5 for specific characters, 1 for custom configuration).
- Adjust generator settings (number of bands, tuning mode, frequencies).
- Set resonance physics (delay tuning, iterations, decay).
- Configure gain profile and stereo panning architecture.
- Set dry/wet mix and final peak level.
- Enable Draw_visualization for graphical feedback.
- Click OK — processor generates bands, applies resonance, spatializes, creates "original_GRM_Tuned_preset" sound object.
GRM Resonance Theory
The Resonant Filter Bank
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
Tuning Modes
Mode 1: Manual Frequency List
Mode 2: Harmonic Series
Mode 3: Inharmonic Ratios
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
| Architecture | Left Gain (pL[i]) | Right Gain (pR[i]) | Spatial Effect |
|---|---|---|---|
| All Center (Mono) | 1.0 | 1.0 | No spatialization, summed to center |
| Stereo Spread (Alternate) | Odd: 1.0, Even: 0.3 | Odd: 0.3, Even: 1.0 | Gentle alternation, full center blend |
| Wide Spread (Hard L/R) | Odd: 1.0, Even: 0.0 | Odd: 0.0, Even: 1.0 | Extreme separation, no center |
| Left Heavy | 1.0 | 0.3 | All bands favor left channel |
| Right Heavy | 0.3 | 1.0 | All bands favor right channel |
| V Shape (Outside In) | Low bands: 1.0→0.3, High bands: 0.3→1.0 | Low bands: 0.3→1.0, High bands: 1.0→0.3 | Extremes panned outward, center bands inward |
| Random | 1.0 - r | r | Unpredictable 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
| Parameter | Type | Default | Description |
|---|---|---|---|
| numBands | integer | 6 | Maximum number of bands (actual may vary) |
| tuningMode | option | Manual list | Frequency generation strategy |
| manualFrequencies | sentence | 300 520 890 1440 2330 3770 | Space-separated frequency list (Hz) |
| baseFreqHz | real | 110 | Fundamental for harmonic/inharmonic modes |
| ratioList | sentence | 1 1.41 1.89 2.37 2.98 3.56 | Inharmonic ratios |
Component 2: Filtering
| Parameter | Type | Default | Description |
|---|---|---|---|
| bandwidthHz | real | 80 | Bandpass filter width (-3 dB points) |
| Filter type | fixed | Hann band | Hann window bandpass, 100 Hz smoothing |
| Edge clamping | auto | 20 Hz - Nyquist-20 | Prevents out-of-range frequencies |
Component 3: Resonator Physics
| Parameter | Type | Default | Description |
|---|---|---|---|
| Tune_Delay_To_Pitch | boolean | 1 | Delay = 1000/fc (ms) when enabled |
| Manual_Ring_Delay_Ms | real | 8 | Fixed delay when tuning disabled |
| ringIterations | integer | 3 | Number of cascading feedback delays |
| ringDecay | real | 0.6 | Exponential decay factor per iteration |
Component 4: Gain & Mix
| Parameter | Type | Default | Description |
|---|---|---|---|
| gainDB | real | 6 | Base gain in decibels (0 dB = unity) |
| Gain_Profile | option | Dampen Highs | Spectral tilt strategy |
| dryWet | real | 0.6 | 0.0 = dry only, 1.0 = wet only |
| finalPeak | real | 0.99 | Output peak normalization level |
Component 5: Stereo Panning
| Parameter | Type | Default | Description |
|---|---|---|---|
| Stereo_Panning | option | V Shape | Spatial distribution architecture |
| pL[i], pR[i] | calculated | varies | Left/right gain coefficients per band |
Component 6: Output
| Parameter | Type | Default | Description |
|---|---|---|---|
| Keep_individual_bands | boolean | 0 | Preserve separate band Sound objects |
| Draw_visualization | boolean | 1 | Generate graphical analysis |
| Play_result | boolean | 1 | Audition after processing |
Visualization & Analysis
Visualization Panels
Interpretation Guide
- 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
- 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
- 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:
- Start with transient-rich source (percussion, piano, speech transients)
- Apply Preset 3 (Inharmonic Metallic) or Preset 5 (Sparse Bells)
- Adjust ringIterations (20-40) and ringDecay (0.8-0.95) for longer resonance
- Experiment with different panning architectures for spatial interest
- Blend dry/wet to taste
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:
- /a/ (father): 700, 1200, 2600, 3800, 4800 Hz
- /i/ (see): 280, 2200, 3000, 3500, 4000 Hz
- /u/ (boot): 320, 900, 2300, 3300, 4000 Hz
- /e/ (bet): 500, 1800, 2500, 3500, 4500 Hz
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:
- Bass enhancement: baseFreqHz = fundamental of bass part
- Pad thickening: baseFreqHz = root note, wide bandwidth
- Subharmonic synthesis: baseFreqHz = 1/2 fundamental (octave down effect)
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
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
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)
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
Cause: Bands exceeding Nyquist limit, automatically clamped
Solution: Reduce high frequencies in manual list, use lower baseFreqHz, increase sample rate
Cause: High numBands (10+) with high ringIterations (20+) on long files
Solution: Reduce numBands, reduce ringIterations, disable Keep_individual_bands
Advanced Techniques
- 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)
- 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