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.

Author: Shai Cohen Version: 3.1 (2025) Technique: SR Reinterpretation (Undertones) Category: Synthesis / Spectral / Composition Citation: Cohen, S. (2025). Praat AudioTools
Contents:

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:

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

  1. In Praat, select exactly one Sound object (minimum 50 ms, mono or stereo).
  2. Run script… → select Undertone_Field.praat.
  3. Choose Preset (2-8 for specific strategies, 1 for custom).
  4. Set partial structure parameters (number of undertones, stretch factor, series mode).
  5. Select gain curve and adjust base gain/rolloff.
  6. Set low-pass filter cutoff and optional micro-delay.
  7. Enable Draw_visualization for analysis display.
  8. Click OK — engine generates undertones, applies panning, creates "source_undertones_preset".
Quick tip: Start with Pure Harmonic preset on a 2-3 second melodic phrase. Enable visualization — you'll see the partial structure panel showing the undertone ratios and pan positions, and the stereo field diagram with colored dots representing each undertone. Listen on headphones — the original stays centered while undertones spread left to right, creating a rich spatial subharmonic field. The output appears as "source_undertones_PureHarmonic" in the Objects window.
Important: SR REINTERPRETATION — This technique changes pitch by altering the sample rate. For a pitch factor of 1/n, the resulting sound is n times longer before resampling; after resampling back to original rate, the duration is restored. LOW-PASS FILTER is essential to remove aliasing artifacts; set appropriately for your material (typically 1000-4000 Hz). MICRO-DELAY adds tiny delays to each partial (n × delay) to reduce phase cancellation; start with 1-2 ms. GAIN CURVES control the relative loudness of undertones — Inverse (spectralist) makes lower undertones louder, creating a bass-heavy texture.

Undertone Theory

The Undertone Series

For a fundamental frequency f₀, the undertone series is: U₁ = f₀ × 1/2 (octave down) U₂ = f₀ × 1/3 (octave + fifth down) U₃ = f₀ × 1/4 (two octaves down) U₄ = f₀ × 1/5 (two octaves + major third down) U₅ = f₀ × 1/6 (two octaves + fifth down) U₆ = f₀ × 1/7 (approx. harmonic seventh down) U₇ = f₀ × 1/8 (three octaves down) General formula: Uₙ = f₀ / (n+1)

SR Reinterpretation Technique

🎚️ How SR Reinterpretation Works

Instead of using pitch-shifting algorithms (which can introduce artifacts), this technique uses sample-rate manipulation:

  1. 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.
  2. Resample: Convert back to the original sample rate using high-quality sinc interpolation (50-point). This "bakes" the pitch shift into the samples.
  3. 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

Denominator formula with stretch factor s: dₙ = (n+1)^(1 + s) Where: s = 0 → pure integer series: 2, 3, 4, 5, ... s > 0 → stretched (wider intervals, more inharmonic) s < 0 → compressed (tighter cluster, more dense) Example with s = 0.2: n=1: 2^(1.2) ≈ 2.30 n=2: 3^(1.2) ≈ 3.74 n=3: 4^(1.2) ≈ 5.28

Series Modes

ModeDescriptionFormulaExample (n=1..4)
IntegerStandard undertonesdₙ = (n+1)^(1+s)2, 3, 4, 5
Odd denominatorsOnly odd numbersdₙ = (2n+1)^(1+s)3, 5, 7, 9
Even denominatorsOnly even numbersdₙ = (2n)^(1+s)2, 4, 6, 8
Custom listUser-specified denominatorsparse string2,3,5,7 (user input)
GeometricExponential spacing (microtonal)dₙ = 2 × r^(n-1), r = 2^(1+s)2, 2^(2+s), 2^(3+2s), ...

Gain Curves

Five gain curve types (applied in dB, converted to linear): Flat: Gₙ = base Linear: Gₙ = base - (n-1) × rolloff Exponential: Gₙ = base - (n-1) × rolloff × (1 - e^(-k)) Gaussian: Gₙ = base + 20×log10(exp(-(n - μ)²/(2σ²))) Inverse: Gₙ = base + (n-1) × rolloff (clipped at 0 dB)

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:

panAngle = (n-1)/(N-1) × π/2 (0 = left, π/2 = right) gainL = cos(panAngle) gainR = sin(panAngle)

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

delayₙ = (n-1) × micro_delay_ms Each partial is delayed by a small amount, then trimmed back to original duration. This breaks phase coherence between partials, reducing comb-filtering when summed.

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

ParameterDefaultDescription
Number_of_undertones4How many undertone layers to generate (1-8)
Stretch_factor0.0Widens (>0) or compresses (<0) undertone spacing
Series_modeIntegerInteger, Odd, Even, Custom list, or Geometric
Custom_denominators2,3,5,7Comma-separated list for Custom mode

Micro-delay Decorrelation

ParameterDefaultDescription
Micro_delay_ms1.2Delay per partial index (ms) — 0 to disable

Gain Curve

ParameterDefaultDescription
Gain_curveLinearFlat, Linear, Exponential, Gaussian, Inverse
Base_gain_dB-12.0Reference gain level (dB)
Rolloff_dB3.0Rate of gain change per partial (dB)

Filter

ParameterDefaultDescription
Lowpass_Hz2000.0Low-pass filter cutoff (≤ Nyquist-100)

Output

ParameterDefaultDescription
Draw_visualization1Generate 6-panel analysis display
Play_result1Audition after processing

Visualization & Analysis

6-Panel Display

Undertone Field Visualization: Panel 1: TITLE • Script name, preset, source name, undertone count, stretch, gain curve, low-pass Panel 2: INPUT WAVEFORM • X-axis: Time, Y-axis: Amplitude • Gray waveform • Title: "Original: filename" Panel 3: OUTPUT STEREO WAVEFORM • Same axes as input • Light gray = left channel, dark blue = right channel (overlaid) • Title: "output_filename (stereo)" Panel 4: INPUT SPECTROGRAM • Spectrogram of original (0-8000 Hz or Nyquist) • Title: "Input spectrogram" Panel 5: OUTPUT SPECTROGRAM • Spectrogram of mixed output • Title: "Output spectrogram (mix)" Panel 6: PARTIAL STRUCTURE DIAGRAM • X-axis: Partial number (1 to N, plus original) • Y-axis: Pitch ratio (0 to 1.18) • Colored bars = undertones (warm red to deep indigo gradient) - Bar height = pitch ratio (e.g., 0.5 for first undertone) - Bar labeled with denominator (e.g., "1/2") • Grid lines at musical intervals (1.0, 0.5, 0.33, 0.25) • Original bar in amber at top • Bottom labels: pan position (L, C, R) • Title: "Partial structure (color=register label=pan)" Panel 7: STEREO FIELD DIAGRAM • X-axis: Left (-1) to Right (+1), Y-axis: 0 to 1.25 • Quarter-circle arc from left to right • Original = amber dot at centre top • Undertones = colored dots on arc, size proportional to gain, color by register • Dot numbers label each undertone • L/R/C labels • Title: "Stereo field (dot=partial size=gain color=register)"

Reading the Partial Structure Diagram

What the bars tell you:
  • 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

What the dots mean:
  • 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:

Spectralist Composition

Use case: Building spectralist structures where lower partials are emphasized

Technique: Bass Spectral preset with Inverse gain curve

Settings:

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:

Research & Education

Use case: Demonstrating undertone series, sample-rate manipulation, spatial hearing

Technique: Enable visualization, compare presets on simple test signals

Learning outcomes:

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

Problem: Aliasing artifacts (high-frequency noise)
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
Problem: Phase cancellation (thin, hollow sound)
Cause: Undertones adding in phase, causing comb filtering
Solution: Enable micro_delay_ms (1-3 ms) to decorrelate partials
Problem: Undertones too quiet/inaudible
Cause: base_gain_dB too low, or gain curve too steep
Solution: Increase base_gain_dB, use Flat or Inverse curves for more presence
Problem: Processing very slow
Cause: Many undertones × resampling operations
Solution: Reduce number_of_undertones (4-6 typical), use lower resampling quality (change 50 to 30 in script)
Problem: Output duration mismatch
Cause: Resampling rounding errors in trim/pad
Solution: Script handles this automatically; if persistent, check lowpass_Hz not near Nyquist

Advanced Techniques

Custom denominator lists:

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).

Time-varying stretch:

Modify script to make stretch_factor change over time — start compressed, end stretched for evolving inharmonicity.

Stereo source processing:

For stereo sources, the script converts to mono first. To preserve stereo, modify to process each channel separately and recombine.

Beyond 8 undertones:

The UI limits to 8, but script can handle more. Edit number_of_undertones in code for 10+ — beware of processing time.