Dynamic Tremolo Effect — User Guide
Frequency-dependent tremolo modulation: spectral-domain amplitude modulation with frequency-varying tremolo rates and high-frequency attenuation for complex, evolving tremolo textures.
What this does
This script implements dynamic tremolo — a frequency-domain effect where tremolo rate and depth vary across the spectrum. Unlike traditional tremolo (uniform amplitude modulation), this processes audio in the spectral domain (FFT), applying different tremolo characteristics to different frequency regions. Low frequencies (below cutoff) receive cosine-squared modulation that varies by frequency. High frequencies (above cutoff) receive static attenuation. Result: complex, evolving tremolo textures where bass, mids, and treble pulsate at different rates, creating shimmering, chorusing, or phasing-like effects impossible with time-domain tremolo.
Key Features:
- Spectral Processing — Operates on FFT spectrum, not time-domain waveform
- Frequency-Dependent Rate — Each frequency bin gets unique tremolo speed
- Adjustable Cutoff — Split point between modulated/attenuated regions (default 8000 Hz)
- Depth Control — Tremolo ranges from minimum to minimum+maximum
- High-Frequency Roll-off — Attenuates treble above cutoff (0.5-1.0 scale)
- 5 Presets — Default, Deep, Subtle, Fast, Strong High-Freq Attenuation
Technical Implementation: (1) Convert to spectrum: FFT (Fast Fourier Transform) converts time-domain audio to frequency-domain representation, each "bin" = specific frequency with amplitude/phase. (2) Apply frequency-dependent modulation: For each frequency bin (col): If frequency < low_freq_cutoff (8000 Hz): modulation = tremolo_min + tremolo_max × cos²(frequency / divisor), cos² creates smooth oscillation 0→1→0, divisor controls oscillation rate (higher = slower), multiply bin amplitude by modulation factor, If frequency ≥ cutoff: multiply by high_freq_attenuation (static scaling 0.5-1.0). (3) Convert back to time domain: Inverse FFT reconstructs audio waveform, (4) Normalize: Scale peak to 0.9. Key insight: Cosine-squared modulation means adjacent frequencies modulate at different phases/rates → creates complex interference patterns in time domain. Not simple amplitude pulsation but frequency-dependent spectral animation.
Quick start
- In Praat, select exactly one Sound object.
- Run script… →
Dynamic_Tremolo_Effect.praat. - Choose Preset: Default, Deep Tremolo, Subtle Tremolo, Fast Tremolo, or Strong High-Freq Attenuation.
- If Custom: adjust low_freq_cutoff (Hz), tremolo_minimum/maximum (depth), tremolo_frequency_divisor (rate), high_freq_attenuation.
- Click OK — processing applies spectral tremolo, auto-plays result.
Spectral Tremolo Theory
Time Domain vs Frequency Domain
Time-Domain Tremolo (Traditional)
Concept: Multiply entire waveform by LFO (Low-Frequency Oscillator)
Frequency-Domain Tremolo (This Script)
Concept: Apply different modulation to each frequency bin in spectrum
Fast Fourier Transform (FFT)
What is FFT?
Fourier Transform: Converts time-domain signal → frequency-domain representation
Spectrum Representation
Frequency bins:
- Spectrum divided into discrete bins (typically 512-4096+)
- Each bin represents narrow frequency range
- Bin number ("col" in script) corresponds to frequency
- Bin 0 = DC (0 Hz), highest bin = Nyquist (sample_rate/2)
Cosine-Squared Modulation
Formula
modulation = tremolo_min + tremolo_max × cos²(frequency / divisor)
Why Cosine-Squared?
Advantages:
- Smooth modulation: No sharp transitions, gentle curves
- Always positive: Squaring eliminates negative values
- Natural pulsation: Similar to breathing, swelling
- Frequency-dependent: Different frequencies at different phases
Visual comparison:
Sine modulation: Smooth but can go negative
Cosine-squared: Smooth, always positive, rounded peaks
Frequency-Dependent Rate
How Divisor Controls Rate
Formula: cos²(frequency / divisor)
Perceptual Effect
Bass (100-500 Hz):
- Slow, deep pulsation
- Foundation of tremolo effect
- Rhythmic, grooving character
Mids (500-2000 Hz):
- Moderate pulsation rate
- Interacts with bass for complex patterns
- Adds richness, movement
Treble (2000-8000 Hz):
- Faster pulsation (above cutoff: attenuated instead)
- If modulated: shimmering, chorusing quality
- Creates sense of motion, air
🎼 Musical Metaphor
Imagine orchestra where each instrument (frequency) plays tremolo at different tempo:
- Double bass: Slow tremolo (2 beats per bar)
- Cello: Medium tremolo (4 beats per bar)
- Violin: Fast tremolo (8 beats per bar)
Combined: polyrhythmic texture, not simple pulsation. This script creates similar effect in frequency domain.
High-Frequency Attenuation
Cutoff Mechanism
Two-region processing:
Why Attenuate Highs?
Practical reasons:
- Spectral balance: Tremolo emphasizes modulated region, attenuation balances
- Artifact reduction: High frequencies more prone to FFT artifacts
- Perceptual clarity: De-emphasizing treble focuses on modulated mids/bass
- Musical character: Darker, warmer tone complements tremolo texture
Effect on timbre:
Attenuation = 0.8: Gentle darkening, subtle roll-off
Attenuation = 0.6: Moderate darkening, clear treble reduction
Attenuation = 0.5: Strong darkening, muffled highs
Attenuation < 0.5: Extreme darkness, almost no treble
Complete Processing Pipeline
Spectral Artifacts and Considerations
- Spectral leakage: Frequency bins not perfectly isolated, some "bleeding"
- Time smearing: Sharp transients slightly blurred by FFT windowing
- Phase distortion: Modifying magnitude affects phase relationships
- Edge artifacts: File boundaries may show slight discontinuities
Mitigation: Use fast_fourier for speed (accepts minor quality loss). Disable for critical applications. Normalize prevents clipping from modulation peaks. Avoid extreme parameters (very low min, very high max) to minimize artifacts.
Parameters & Presets
Preset Options
🎵 Default
Parameters: Cutoff 8000 Hz, Min 0.3, Max 0.7, Divisor 500, Atten 0.8
Character: Balanced spectral tremolo, moderate depth and rate
Best for: General use, exploring effect, textural enhancement
💫 Deep Tremolo
Parameters: Min 0.2, Max 0.9 (other defaults)
Character: Dramatic pulsation, wide modulation range 20-110%
Best for: Obvious tremolo effect, rhythmic emphasis, experimental
✨ Subtle Tremolo
Parameters: Min 0.4, Max 0.4 (range 40-80%)
Character: Gentle shimmer, barely noticeable modulation
Best for: Subtle animation, mixing enhancement, transparent processing
⚡ Fast Tremolo
Parameters: Divisor 200 (faster rate, other defaults)
Character: Rapid spectral modulation, chorusing-like, shimmering
Best for: Textural complexity, pseudo-chorus, animated pads
🌙 Strong High-Freq Attenuation
Parameters: Attenuation 0.5 (darker, other defaults)
Character: Darkened tremolo, muffled highs, warm low-mid focus
Best for: Lo-fi aesthetic, warm textures, reducing harshness
Custom Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| preset | option | Default | Choose preset (affects other params) |
| fast_fourier | boolean | yes | Use fast FFT (speed vs quality trade-off) |
| low_freq_cutoff | positive | 8000 | Frequency boundary (Hz) for tremolo region |
| tremolo_minimum | positive | 0.3 | Modulation floor (minimum amplitude scale) |
| tremolo_maximum | positive | 0.7 | Modulation range (added to minimum) |
| tremolo_frequency_divisor | positive | 500 | Controls modulation rate (higher = slower) |
| high_freq_attenuation | positive | 0.8 | Scaling for frequencies above cutoff |
| scale_peak | positive | 0.9 | Output normalization level |
| play_after_processing | boolean | yes | Auto-play result |
| keep_intermediate_objects | boolean | no | Retain spectrum object for inspection |
Parameter Details
low_freq_cutoff
Range: 1000-16000 Hz (practical 2000-12000 Hz)
Default: 8000 Hz
Effect:
- Low cutoff (2000-4000 Hz): Only bass/low-mids modulated, most spectrum attenuated
- Mid cutoff (6000-10000 Hz): Balanced, most musical content modulated
- High cutoff (12000-16000 Hz): Almost entire spectrum modulated, minimal attenuation
tremolo_minimum
Range: 0.1-0.9 (practical 0.2-0.6)
Default: 0.3 (30%)
Effect: Sets modulation floor. Lower values = deeper troughs (more dramatic pulsation). Very low (<0.2) creates near-silence at modulation minimum.
tremolo_maximum
Range: 0.1-0.9 (practical 0.3-0.8)
Default: 0.7
Effect: Added to minimum to set modulation ceiling. Total range = min to (min+max). Example: min=0.3, max=0.7 → range 30-100%
tremolo_frequency_divisor
Range: 50-2000 (practical 100-1000)
Default: 500
Effect:
- Low (100-300): Fast modulation rate, rapid pulsation, chorusing quality
- Mid (300-700): Moderate rate, musical tremolo character
- High (700-1500): Slow modulation, gentle phase shifts, subtle shimmer
high_freq_attenuation
Range: 0.3-1.0
Default: 0.8 (20% reduction)
Effect:
- 1.0: No attenuation (bypass high-freq processing)
- 0.7-0.9: Subtle to moderate darkening
- 0.5-0.7: Clear treble reduction, warm character
- <0.5: Heavy darkening, muffled/lo-fi
Applications
Ambient / Atmospheric Music
Preset: Default or Subtle Tremolo
Use case: Animated pads, evolving textures
Effect:
- Subtle spectral movement without obvious tremolo
- Creates