Undertone Field — SR Reinterpretation — User Guide
Creates undertone layers from a mono or stereo phrase using sample-rate reinterpretation. Output is stereo with undertones spread spatially across the field using equal-power panning.
What this does
This script implements an Undertone Field generator — a tool that creates undertone layers from a source sound using sample-rate reinterpretation. The original sound remains at the center, while generated undertones are spread spatially across the stereo field using an equal-power panning arc. No PSOLA or pitch manipulation is used; undertones are created purely by playing the source at lower sample rates and resampling back to the original rate.
🎵 What are Undertones?
Undertones are the inverse of overtones (harmonics). While overtones are integer multiples of the fundamental frequency, undertones are integer fractions:
- First undertone: frequency = fundamental × 1/2 (one octave down)
- Second undertone: frequency = fundamental × 1/3 (octave + fifth down)
- Third undertone: frequency = fundamental × 1/4 (two octaves down)
- And so on: 1/5, 1/6, 1/7, ...
This creates a subharmonic series beneath the original pitch, producing rich, dark, resonant textures.
Key Features:
- 7 Preset Strategies — Pure Harmonic to Microtonal Dense, plus Custom
- SR Reinterpretation Technique — No PSOLA, just sample rate override + resampling
- 5 Series Modes — Integer, Odd denominators, Even denominators, Custom list, Geometric (microtonal)
- Stretch Factor — Widens or compresses the undertone spacing (0 = pure integer series)
- 5 Gain Curves — Flat, Linear, Exponential, Gaussian, Inverse (spectralist bass build)
- Equal-Power Stereo Panning — Original at centre, partials spread from hard left to hard right
- Micro-Delay Decorrelation — Tiny delays per partial to reduce comb filtering
- Low-Pass Filter — Removes aliasing above specified cutoff
- Comprehensive Visualization — 6-panel display with waveforms, spectrograms, partial structure, stereo field
Technical Implementation: (1) Denominator Calculation: Based on series mode and stretch factor. (2) Pitch Factor: pitchFactor = 1 / denominator. (3) SR Reinterpretation: Override sampling frequency to origFs × pitchFactor, then resample back to origFs. (4) Filtering: Apply low-pass to remove aliasing. (5) Gain & Pan: Apply gain curve weights and equal-power pan gains. (6) Accumulation: Add to left/right buffers. (7) Output: Combine to stereo, normalize.
Quick start
- In Praat, select exactly one Sound object (minimum 50 ms, mono or stereo).
- Run script… → select
Undertone_Field.praat. - Choose Preset (2-8 for specific strategies, 1 for custom).
- Set partial structure parameters (number of undertones, stretch factor, series mode).
- Select gain curve and adjust base gain/rolloff.
- Set low-pass filter cutoff and optional micro-delay.
- Enable Draw_visualization for analysis display.
- Click OK — engine generates undertones, applies panning, creates "source_undertones_preset".
Undertone Theory
The Undertone Series
SR Reinterpretation Technique
🎚️ How SR Reinterpretation Works
Instead of using pitch-shifting algorithms (which can introduce artifacts), this technique uses sample-rate manipulation:
- Override sampling frequency: Tell Praat to play the sound at a different sample rate. If you set the sample rate to origFs × pitchFactor, the sound will play back at that pitch.
- Resample: Convert back to the original sample rate using high-quality sinc interpolation (50-point). This "bakes" the pitch shift into the samples.
- Trim/Pad: The resampled sound will have a different duration (longer for pitch down, shorter for pitch up). Trim or pad to match the original duration.
Advantages: No PSOLA artifacts, preserves transients, simple and reliable.
Disadvantages: Requires resampling, which can be computationally intensive for many partials.
Stretch Factor
Series Modes
| Mode | Description | Formula | Example (n=1..4) |
|---|---|---|---|
| Integer | Standard undertones | dₙ = (n+1)^(1+s) | 2, 3, 4, 5 |
| Odd denominators | Only odd numbers | dₙ = (2n+1)^(1+s) | 3, 5, 7, 9 |
| Even denominators | Only even numbers | dₙ = (2n)^(1+s) | 2, 4, 6, 8 |
| Custom list | User-specified denominators | parse string | 2,3,5,7 (user input) |
| Geometric | Exponential spacing (microtonal) | dₙ = 2 × r^(n-1), r = 2^(1+s) | 2, 2^(2+s), 2^(3+2s), ... |
Gain Curves
Equal-Power Stereo Panning
🎧 Stereo Spatial Layout
Original: centre (equal power L+R: gainL = gainR = 1/√2)
Partial n: panned along an arc from hard left to hard right:
Properties:
- Equal power — total energy constant across arc
- Gradual spatial spread — first partial hard left, last hard right
- Original centre remains distinct
Micro-Delay Decorrelation
Preset Strategies
Preset 2: Pure Harmonic
🎵 Standard Undertones
Undertones: 4 | Stretch: 0.0
Series: Integer | Gain: Linear, base -12 dB, rolloff 3 dB
Low-pass: 2000 Hz | Micro-delay: 0 ms
Character: Pure integer undertone series, linear rolloff — balanced subharmonic field
Use on: General purpose, melodic material
Preset 3: Stretched Cloud
☁️ Wide, Inharmonic Cloud
Undertones: 5 | Stretch: +0.20
Series: Integer | Gain: Gaussian, base -10 dB
Low-pass: 1800 Hz | Micro-delay: 0 ms
Character: Stretched undertones create inharmonic, wide intervals; Gaussian gain peaks at middle partials
Use on: Ambient, textural material
Preset 4: Compressed Cluster
🗜️ Tight, Dense Cluster
Undertones: 4 | Stretch: -0.20
Series: Integer | Gain: Exponential, base -14 dB, rolloff 4 dB
Low-pass: 2500 Hz | Micro-delay: 0 ms
Character: Compressed intervals create tight cluster; exponential gain emphasizes early partials
Use on: Percussive material, dense textures
Preset 5: Bass Spectral
🔊 Spectralist Bass Build
Undertones: 6 | Stretch: 0.0
Series: Integer | Gain: Inverse, base -18 dB, rolloff 2 dB
Low-pass: 1500 Hz | Micro-delay: 0 ms
Character: Inverse gain makes lower undertones louder — creates massive bass foundation
Use on: Bass lines, drone, spectralist composition
Preset 6: Spectral Haze
🌫️ Ethereal, Soft
Undertones: 5 | Stretch: +0.12
Series: Integer | Gain: Gaussian, base -9 dB, rolloff 1.5 dB
Low-pass: 3000 Hz | Micro-delay: 0 ms
Character: Gentle stretch, soft Gaussian curve, higher low-pass — ethereal, hazy texture
Use on: Pads, dreamy textures
Preset 7: Dark Undertow
🌑 Heavy, Dark
Undertones: 4 | Stretch: -0.10
Series: Integer | Gain: Exponential, base -8 dB, rolloff 6 dB
Low-pass: 1200 Hz | Micro-delay: 0 ms
Character: Tight cluster, steep exponential rolloff, low cutoff — dark, heavy undertow
Use on: Bass-heavy material, dramatic moments
Preset 8: Microtonal Dense
🎼 Microtonal Density
Undertones: 7 | Stretch: +0.05
Series: Geometric | Gain: Flat, base -20 dB
Low-pass: 2000 Hz | Micro-delay: 0 ms
Character: Geometric series creates microtonal spacing; flat gain gives equal presence
Use on: Microtonal composition, dense harmonic fields
Parameters & Controls
Partial Structure
| Parameter | Default | Description |
|---|---|---|
| Number_of_undertones | 4 | How many undertone layers to generate (1-8) |
| Stretch_factor | 0.0 | Widens (>0) or compresses (<0) undertone spacing |
| Series_mode | Integer | Integer, Odd, Even, Custom list, or Geometric |
| Custom_denominators | 2,3,5,7 | Comma-separated list for Custom mode |
Micro-delay Decorrelation
| Parameter | Default | Description |
|---|---|---|
| Micro_delay_ms | 1.2 | Delay per partial index (ms) — 0 to disable |
Gain Curve
| Parameter | Default | Description |
|---|---|---|
| Gain_curve | Linear | Flat, Linear, Exponential, Gaussian, Inverse |
| Base_gain_dB | -12.0 | Reference gain level (dB) |
| Rolloff_dB | 3.0 | Rate of gain change per partial (dB) |
Filter
| Parameter | Default | Description |
|---|---|---|
| Lowpass_Hz | 2000.0 | Low-pass filter cutoff (≤ Nyquist-100) |
Output
| Parameter | Default | Description |
|---|---|---|
| Draw_visualization | 1 | Generate 6-panel analysis display |
| Play_result | 1 | Audition after processing |
Visualization & Analysis
6-Panel Display
Reading the Partial Structure Diagram
- Bar height: Pitch ratio (1 = original, 0.5 = octave down, 0.33 = octave+fifth down)
- Bar color: Warm red = low partials, deep indigo = high partials — shows register
- Label: Denominator (e.g., "1/2.30" for stretched series) — shows exact pitch relationship
- Bottom label: Pan position (L, C, R) — shows where in stereo field this partial appears
- Grid lines: Musical intervals for reference (octave, fifth, two octaves)
Reading the Stereo Field Diagram
- Position on arc: Left side = hard left, centre top = centre, right side = hard right
- Dot color: Same register mapping as partial bars — warm = low, cool = high
- Dot size: Proportional to gain — larger dots = louder partials
- Dot number: Partial index
- Original: Amber dot at centre top
- The arc shows the equal-power panning law — dots are distributed along it
Applications
Electroacoustic Composition
Use case: Creating rich subharmonic textures from any source
Technique: Pure Harmonic or Stretched Cloud presets on instrumental phrases
Workflow:
- Select a 2-5 second melodic or textural phrase
- Apply Pure Harmonic preset for balanced undertone field
- Listen on headphones — original centered, undertones spread left to right
- Use as background texture or layer with original
- Experiment with different gain curves for different balances
Spectralist Composition
Use case: Building spectralist structures where lower partials are emphasized
Technique: Bass Spectral preset with Inverse gain curve
Settings:
- Source: Sustained instrumental note or chord
- Preset: Bass Spectral (6 undertones, Inverse gain)
- Custom: Increase number_of_undertones to 8 for deeper field
- Low-pass: 1000 Hz for darker texture
Result: Massive subharmonic field where lowest undertones are loudest — spectralist "bass build"
Sound Design for Media
Use case: Creating dark, rumbling textures, ethereal pads, or dense clusters
Technique: Dark Undertow or Spectral Haze presets on appropriate sources
Applications:
- Horror/thriller: Dark Undertow on vocal whispers — creates unsettling low rumbles
- Sci-fi: Stretched Cloud on synth tones — creates alien, inharmonic textures
- Ambient: Spectral Haze on pads — ethereal, drifting layers
Research & Education
Use case: Demonstrating undertone series, sample-rate manipulation, spatial hearing
Technique: Enable visualization, compare presets on simple test signals
Learning outcomes:
- Understand undertone series and their relationship to harmonics
- See how sample-rate reinterpretation creates pitch shifts
- Hear spatial panning and its effect on texture
- Explore relationship between gain curves and perceived balance
Practical Workflow Examples
🎬 Film Scene: Approaching Monster
Goal: Create rumbling, approaching monster sound from a single roar
Settings:
- Source: 2-second animal roar
- Preset: Dark Undertow
- Custom: N=5, stretch=-0.15, gain=Exponential, rolloff=8 dB
- Low-pass: 800 Hz (very dark)
- Micro-delay: 2 ms (decorrelate for width)
Result: Massive, dark undertone field spreading left to right — creates sense of enormous presence
🎚️ Electronic Music: Bass Layer
Goal: Create subharmonic bass layer from synth stab
Settings:
- Source: 1-second synth bass stab
- Preset: Bass Spectral
- Custom: N=8, stretch=0, gain=Inverse, base=-24 dB
- Low-pass: 500 Hz (sub-bass only)
Result: 8 undertones from 1/2 to 1/9, with lower ones louder — massive sub-bass layer
🎙️ Voice Processing: Choral Effect
Goal: Create choir-like texture from solo voice
Settings:
- Source: 3-second vocal phrase
- Preset: Pure Harmonic
- Custom: N=4, gain=Gaussian, base=-15 dB
- Micro-delay: 3 ms (creates ensemble effect)
Result: Original voice centered, undertones spread left to right with Gaussian gain — creates simulated choir
Troubleshooting Common Issues
Cause: Low-pass filter cutoff too high for the pitch-shifted material
Solution: Reduce lowpass_Hz (800-1500 Hz for deep undertones), or increase number_of_undertones to spread energy
Cause: Undertones adding in phase, causing comb filtering
Solution: Enable micro_delay_ms (1-3 ms) to decorrelate partials
Cause: base_gain_dB too low, or gain curve too steep
Solution: Increase base_gain_dB, use Flat or Inverse curves for more presence
Cause: Many undertones × resampling operations
Solution: Reduce number_of_undertones (4-6 typical), use lower resampling quality (change 50 to 30 in script)
Cause: Resampling rounding errors in trim/pad
Solution: Script handles this automatically; if persistent, check lowpass_Hz not near Nyquist
Advanced Techniques
Use Custom series mode to specify exact denominators, creating non-standard undertone series (e.g., "2, 2.5, 3, 3.5" for quarter-tone undertones).
Modify script to make stretch_factor change over time — start compressed, end stretched for evolving inharmonicity.
For stereo sources, the script converts to mono first. To preserve stereo, modify to process each channel separately and recombine.
The UI limits to 8, but script can handle more. Edit number_of_undertones in code for 10+ — beware of processing time.