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.
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.
Quick start
- Select exactly one mono or stereo Sound object in Praat.
- Run
GRM-Style_Resonator.praat. - Choose a preset, or use Custom to define the frequency bank.
- Choose Finite echoes or Single feedback comb.
- Set the bank gain, spectral gain profile, stereo architecture, and dryWet.
- Choose the output-level mode. Safety ceiling is the default.
- Run the script. The result is named
<source>_GRMstyle_<preset>.
Signal flow
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.
| Preset | Frequency bank | Bandwidth | Delay / resonance settings | Gain / pan |
|---|---|---|---|---|
| Custom | Uses the form fields | 80 Hz default | Tuned delay; 3 iterations; decay 0.60 by default | +6 dB; Dampen Highs; Wide Spread by default |
| Harmonic (organ-like) | 8 bands: 110 × 1…8 Hz | 100 Hz | Tuned delay; 20 iterations; decay 0.85 | Dampen Highs; Stereo Spread |
| Inharmonic metallic | 200 Hz × 1, 1.59, 2.14, 2.76, 3.41, 4.07 | 40 Hz | Tuned delay; 10 iterations; decay 0.70 | Flat; Wide Spread |
| Formant-ish | 500, 1500, 2500, 3500, 4500 Hz | 200 Hz | Fixed 6 ms delay; 2 iterations; decay 0.40 | Dampen Highs; V Shape |
| Sparse bells | 287, 645, 1203, 2156 Hz | 35 Hz | Tuned delay; 40 iterations; decay 0.95 | +12 dB; Dampen Highs; Random |
ringIterations matter only when Finite echoes is selected. In Single feedback comb mode, ringIterations is intentionally ignored.
Parameters
Frequency-bank controls
| Control | Default | Meaning |
|---|---|---|
| numBands | 6 | Maximum number of bands used. A manual or ratio list is truncated to this count. |
| tuningMode | Manual list | Manual center frequencies, harmonic multiples of baseFreqHz, or baseFreqHz × ratio. |
| manualFrequencies | 300 520 890 1440 2330 3770 | Space-separated center frequencies in Hz. |
| baseFreqHz | 110 | Base frequency for harmonic and inharmonic-ratio modes. |
| ratioList | 1 1.41 1.89 2.37 2.98 3.56 | Space-separated multipliers used by Inharmonic ratios mode. |
| bandwidthHz | 80 Hz | Nominal 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:
The pale transition regions and darker pass regions are shown separately in the visualization.
Gain profile
| Profile | Behavior |
|---|---|
| Flat (Equal) | Every band receives the linear gain corresponding to gainDB. |
| Dampen Highs | Gain falls from full base gain at the lowest center to 20% of that gain at the highest center. |
| Boost Highs | Gain 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
| Setting | Default | Meaning |
|---|---|---|
| tune_Delay_To_Pitch | 1 | Use a delay derived from each band center. Despite the historical variable name, this is frequency tuning, not pitch analysis. |
| manual_Ring_Delay_Ms | 8 ms | One fixed delay for all bands when tuned delay is disabled. |
| tail_ms | 0 | Append silence before processing so resonance can continue beyond the original ending. Output duration grows by this amount. |
| random_seed | 0 | 0 gives unseeded Random panning; a non-zero integer makes the random band positions reproducible. |
| finalPeak | 0.99 | Target used by Safety ceiling and Peak normalize. |
| keep_individual_bands | 0 | When 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:
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:
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:
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.
Stereo architecture
The wet bank is always a two-channel stereo bus. Mono and stereo inputs are handled differently:
- Mono input: each resonant band is fanned to left and right according to its panning coefficients.
- Stereo input: the left and right source channels are filtered and resonated independently. The panning coefficients act as per-band side gains; the script does not fold the source to mono and does not move left-channel material into the right channel or vice versa.
- More than two channels: processing is refused because the wet architecture has no defined placement for additional channels.
| Architecture | Left / 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 Heavy | 1.0 / 0.3 for every band. |
| Right Heavy | 0.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. |
| Random | For 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.
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
| Mode | Behavior |
|---|---|
| Natural level | No 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 normalize | Any 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
- The source start time (
xmin) is restored to the output. - With
tail_ms = 0, duration is preserved. - With a positive tail, the output is longer by exactly that appended silence duration.
- Sample rate is preserved.
- Output name:
<source>_GRMstyle_<presetName>.
Visualization
When Draw_visualization is enabled, the script creates a suite-standard 8-inch diagnostic page containing:
- Input waveform and output waveform on the same amplitude scale.
- Band architecture: dark rectangles show the pass regions, pale rectangles show Hann transition regions, and red marks show requested band centers.
- Panning architecture: upward bars show left coefficients and downward bars show right coefficients for each band.
- Gain profile: linear band gains across the frequency bank.
- Summary: tuning mode, bandwidth, resonator model, decay, gain profile, Dry/Wet, wet/output peaks, level action, duration, source-channel behavior, and random seed.
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
- Narrow bands isolate smaller spectral regions; wider bands pass more source material into each resonator.
- High decay produces longer resonance. In Finite echoes mode, the maximum number of taps is explicit; in Single feedback comb mode the decay continues recursively through the available Sound duration and optional tail.
- tail_ms is useful when a source ends immediately after an excitation and you want to retain the subsequent ringing.
- Random panning is the only nondeterministic part of the processor when
random_seed = 0. Use a non-zero seed to reproduce the same spatial assignment. - Because Praat’s Hann band-pass is a frequency-domain, zero-phase filter, its impulse response is symmetric in time. Very abrupt material can therefore show pre/post ringing associated with the band extraction itself.