Moog Ladder Filter — User Guide

Vintage analog emulation: implements the classic Moog ladder filter using Topology-Preserving Transform (TPT) with parameter automation, adaptive processing, and authentic analog character.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.1 (2025) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

This script implements Moog ladder filter emulation — a sophisticated digital recreation of the classic analog filter using Topology-Preserving Transform (TPT) methodology. Unlike simple digital filters, this method provides: (1) Authentic analog character: Emulates the warm, nonlinear behavior of the original Moog design. (2) TPT implementation: Preserves filter topology for numerical stability and musical quality. (3) Parameter automation: Real-time cutoff and resonance sweeps with musical interpolation. (4) Adaptive processing: Automatic iteration control based on filter settings. (5) Professional features: DC blocking, analog-style limiting, output trimming. Process implements 4-pole ladder topology with feedback, handles both static filtering and dynamic parameter sweeps, and applies authentic analog-style saturation. Result: professional-quality filter effects with the warmth and character of vintage analog hardware.

Key Features:

What is the Moog ladder filter? Traditional digital filters: Linear, stable, but often sterile-sounding. Moog ladder filter: Nonlinear analog design famous for its warm, musical character. Key characteristics: (1) 4-pole topology: Four cascaded filter stages create 24dB/octave slope. (2) Voltage control: Cutoff frequency controlled by voltage (now parameter). (3) Resonance feedback: Output fed back to input creates emphasis at cutoff. (4) Nonlinear saturation: Natural compression and harmonic generation. Advantages: (1) Musical quality: Warm, rich sound that complements audio. (2) Expressive control: Resonance creates dramatic tonal changes. (3) Analog character: Gentle saturation and nonlinearities. (4) Historical significance: Industry standard for decades. Use cases: Music production (subtractive synthesis, tone shaping), sound design (vintage effects, tonal evolution), electronic music (acid bass, filter sweeps), mixing (creative EQ effects), education (analog filter principles).

Technical Implementation: (1) TPT coefficients: Calculate g = tan(π×fc/fs) for bilinear transform stability. (2) Ladder structure: Four identical one-pole low-pass filters in series. (3) Resonance feedback: Output of fourth stage fed back to input with gain k. (4) Adaptive iterations: 2-4 iterations based on resonance and cutoff for accuracy. (5) Automation system: Chunk-based processing with parameter interpolation. (6) Analog emulation: Soft clipping or tanh limiting for saturation. (7) DC blocking: High-pass filter to remove DC offset. Key insight: TPT methodology preserves the analog filter's topological relationships in the digital domain, maintaining musical quality while ensuring numerical stability.

Quick start

  1. In Praat, select exactly one Sound object.
  2. Run script…moog_ladder_filter.praat.
  3. Choose Preset for common filter types or "Custom" for full control.
  4. For static filtering: adjust Cutoff_frequency and Resonance.
  5. For sweep presets: parameters are pre-configured for musical sweeps.
  6. Enable DC_blocker to remove low-frequency artifacts.
  7. Choose Limiter_type for analog saturation character.
  8. Set Output_trim for gain compensation.
  9. Click OK — Moog filter applied, result named "originalname_moog".
Quick tip: Start with presets to explore the filter's character — "Bass Filter" for warm low-end, "Warm Pad" for smooth highs, "Acid Bass" for resonant squelch. Use sweep presets for dynamic effects — "Cutoff Sweep Up" for building tension, "Resonance Sweep" for evolving textures. The filter automatically uses adaptive processing — higher resonance and extreme cutoff settings get more iterations for better accuracy. Enable DC blocker to prevent low-frequency buildup, especially with high resonance. Choose Soft limiting for gentle saturation or Analog-style for more aggressive tanh compression. Processing shows real-time progress for long files with automation — chunk-based system ensures smooth parameter changes.
Important: NONLINEAR PROCESSING — creates harmonics and can change overall level. High resonance settings (>0.7) can cause significant gain increase and potential clipping — use output trim or limiting. Very low cutoff frequencies (< 100 Hz) with high resonance may cause instability — the script includes safety limits. Automation mode processes in 10ms chunks for smooth parameter changes — longer files take more processing time. The Moog filter has a characteristic sound that works best with harmonic-rich sources — simple sine waves may not demonstrate the full effect. Always monitor output levels — resonant peaks can be much louder than input. For authentic analog emulation, some distortion and nonlinearity is intentional and part of the characteristic sound.

Filter Theory

Moog Ladder Filter Fundamentals

Analog Circuit Basis

Original Moog design:

4-pole ladder topology: Input → Stage 1 → Stage 2 → Stage 3 → Stage 4 → Output ↓ ↓ ↓ ↓ Feedback ← Feedback ← Feedback ← Feedback Each stage: One-pole low-pass filter Transfer function: H(s) = 1 / (1 + s/ωc) Where ωc = 2π × cutoff_frequency Resonance feedback: Feedback gain = k (0 to 4 typically) Output fed back to input: V_in = Input - k × V_feedback Creates emphasis at cutoff frequency Digital emulation challenge: Analog circuits have nonlinearities and saturations Simple digital models sound sterile TPT preserves musical qualities

Why TPT Methodology?

Topology-Preserving Transform advantages:

TPT Mathematics

Digital Implementation

TPT coefficient calculation:

Normalized frequency: fc = cutoff_frequency / sampling_frequency ωc = 2π × fc g = tan(ωc / 2) [TPT warping] One-pole filter coefficients: gg = g / (1 + g) [feedforward] gg_comp = 1 - gg [feedback] Single stage difference equation: y[n] = gg × x[n] + gg_comp × y[n-1] Resonance calculation: k = 4 × (resonance ^ 1.5) [power curve for musical response] Feedback structure: x1[n] = input[n] - k × y4[n-1] y1[n] = gg × x1[n] + gg_comp × y1[n-1] y2[n] = gg × y1[n] + gg_comp × y2[n-1] y3[n] = gg × y2[n] + gg_comp × y3[n-1] y4[n] = gg × y3[n] + gg_comp × y4[n-1] Multiple iterations: Repeat 2-4 times for accuracy Higher resonance/cutoff → more iterations

Adaptive Processing

Intelligent iteration control:

Default case (iterations = 2):
Normal resonance (< 0.7) and moderate cutoff
Fast processing, good musical quality
Suitable for most applications

Enhanced accuracy (iterations = 3):
High resonance (> 0.7) OR high cutoff (> 0.5×Nyquist)
Better approximation of analog behavior
Noticeable quality improvement

Maximum accuracy (iterations = 4):
Very high resonance (> 0.85) AND high cutoff
Closest analog emulation
Computationally intensive but necessary

Resonance limiting:
k_max = 3.9 (theoretical maximum: 4.0)
Reduced at very high cutoffs for stability
k_max = 3.9 - (g - 0.6) × 3.0 for g > 0.6
Prevents numerical instability

Practical benefits:
Automatic quality/performance balance
No manual iteration setting required
Consistent results across parameter range

🎵 Analog Intuition

Cutoff frequency:

Higher cutoff → brighter sound, more high frequencies

Lower cutoff → darker sound, emphasis on lows

Musical sweep → evolving tone color

Resonance:

Higher resonance → peaked response at cutoff

Very high resonance → self-oscillation (tonal peak)

Musical use → emphasis, squelch, acid bass

Moog character:

Warm saturation → gentle harmonic generation

Smooth response → musical rather than clinical

Nonlinearities → part of the charm

Automation System

Real-time Parameter Control

Chunk-based processing:

Chunk duration: chunk_duration = 0.01 seconds (10ms) Provides smooth parameter changes Balance between smoothness and performance Parameter interpolation: For each chunk, calculate midpoint time: t_mid = (chunk_start + chunk_end) / 2 progress = t_mid / total_duration Cutoff interpolation (exponential): cutoff = start_cutoff × exp(ln(end_cutoff/start_cutoff) × progress) Musical: equal steps in frequency ratio space Resonance interpolation (linear): resonance = start_resonance + (end_resonance - start_resonance) × progress Perceptual: linear in control space Processing pipeline: FOR each chunk: Calculate interpolated parameters at chunk midpoint Extract audio chunk Calculate TPT coefficients for current parameters Process through ladder filter with current settings Store processed chunk Concatenate all chunks Apply final processing (DC block, limiting) Benefits: Smooth, musical parameter sweeps No zipper noise or stepping artifacts Efficient processing of long files

Why Chunk-based Automation?

Perceptual advantages:

Complete Processing Pipeline

SETUP: Select Sound object Choose preset or custom parameters Extract audio properties (duration, sampling rate) PRESET APPLICATION: IF preset selected: Apply predefined cutoff/resonance values Set automation flags if sweep preset ELSE custom: Use user-provided parameters AUTOMATION MODE (IF enabled): Calculate number_of_chunks = duration / 0.01 FOR chunk_index FROM 0 TO number_of_chunks-1: Calculate chunk time bounds Interpolate parameters at chunk midpoint: cutoff = exponential_interp(start_cutoff, end_cutoff, progress) resonance = linear_interp(start_resonance, end_resonance, progress) Extract audio chunk Calculate TPT coefficients for current parameters Process through ladder filter with adaptive iterations Apply output trim and limiting Store processed chunk Concatenate all processed chunks STATIC MODE (IF no automation): Calculate TPT coefficients once Process entire sound through ladder filter Apply output trim and limiting FINAL PROCESSING: IF DC_blocker enabled: Apply high-pass filter (20 Hz cutoff) Select result object Rename with "_moog" suffix OUTPUT: Professionally filtered sound with Moog character Optional parameter automation sweeps

Filter Presets

Static Filter Presets

🎛️ Fixed Parameter Settings

Character: Classic Moog filter settings for common applications

Parameters: Pre-configured cutoff and resonance values

Best for: Quick tonal shaping, specific frequency effects

Static filter presets:

PresetCutoff (Hz)ResonanceSonic CharacterTypical Use
Bass Filter3000.3Warm, rounded low-endBass enhancement, low-pass
Warm Pad8000.5Smooth, musical highsPads, strings, vocals
Vocal Formant15000.65Peaked, vocal-likeVoice processing, emphasis
Bright Sweep25000.55Crisp, clear highsLead sounds, brightness
Resonant Peak12000.75Strong resonance peakSpecial effects, squelch
Telephone28000.35Band-limited, vintageLo-fi effects, retro
Sub Bass1500.2Deep, powerful lowsSub-bass, rumble
Acid Bass5000.75Squelchy, resonant303-style bass, acid

Automation Presets

🔄 Dynamic Parameter Sweeps

Character: Evolving filter effects with parameter automation

Parameters: Start/end values for cutoff and resonance

Best for: Dynamic effects, building tension, evolving textures

Automation presets:

PresetCutoff SweepResonanceSonic CharacterTypical Use
Cutoff Sweep Up200→3000 Hz0.5 (static)Brightening, opening upBuild-ups, transitions
Cutoff Sweep Down3000→200 Hz0.5 (static)Darkening, closing downBreakdowns, endings
Resonance Sweep800 Hz (static)0.1→0.85Increasing peak emphasisTexture evolution, tension

Preset Selection Guide

🎯 Choosing the Right Preset

For bass sounds: Bass Filter, Sub Bass, Acid Bass

For melodic content: Warm Pad, Bright Sweep, Vocal Formant

For special effects: Resonant Peak, Telephone

For dynamic evolution: Cutoff Sweep Up/Down, Resonance Sweep

For custom control: Use Custom preset with manual parameters

Parameters

Filter Parameters

ParameterTypeDefaultDescription
PresetoptionCustom11 filter presets + Custom
Cutoff_frequency_(Hz)positive1000Filter cutoff frequency (static mode)
Resonance_(0-1)real0.7Resonance amount 0-1 (static mode)

Automation Parameters

ParameterTypeDefaultDescription
Start_cutoff_(Hz)positive200Starting cutoff for sweeps
End_cutoff_(Hz)positive3000Ending cutoff for sweeps
Start_resonance_(0-1)real0.2Starting resonance for sweeps
End_resonance_(0-1)real0.8Ending resonance for sweeps

Processing Parameters

ParameterTypeDefaultDescription
DC_blockerboolean1 (on)Remove DC offset with 20Hz high-pass
Limiter_typeoptionSoftSaturation character: Soft or Analog-style
Output_trim_(dB)real0Gain adjustment after filtering

Automatic Calculations

CalculationFormulaPurpose
TPT coefficient gtan(π×fc/fs)Frequency warping for stability
Resonance gain k4 × resonance^1.5Musical resonance response
DC blocker alphaexp(-2π×20/fs)20Hz high-pass coefficient
Output trim gain10^(dB/20)Linear gain from dB

Applications

Music Production

Use case: Tonal shaping and creative filtering in mixes

Technique: Use Bass Filter preset for kick drums, Warm Pad for vocals

Example: Apply Acid Bass preset to synth bass for squelchy character

Sound Design

Use case: Creating evolving textures and special effects

Technique: Use automation presets for dynamic filter movements

Workflow:

Electronic Music Production

Use case: Authentic analog-style filtering for electronic genres

Advantages:

Example: 303-style bass lines with Acid Bass preset

Mixing and Mastering

Use case: Creative EQ and tonal shaping

Technique: Use as character filter instead of surgical EQ

Application: Drum bus processing, vocal sweetening

Practical Workflow Examples

🎵 Acid Bass Line

Goal: Create squelchy 303-style bass line

Settings:

  • Preset: Acid Bass
  • Source: Simple sawtooth or square wave bass
  • Cutoff: 500 Hz (from preset)
  • Resonance: 0.75 (from preset)
  • DC blocker: On
  • Limiter: Analog-style (tanh)
  • Output trim: 0 dB

Result: Authentic acid bass with squelchy resonance

🎵 Build-Up Effect

Goal: Create tension build with filter sweep

Settings:

  • Preset: Cutoff Sweep Up
  • Source: Pad or rhythmic element
  • Start cutoff: 200 Hz
  • End cutoff: 3000 Hz
  • Resonance: 0.5 (static)
  • DC blocker: On
  • Limiter: Soft
  • Output trim: -3 dB (compensate for resonance boost)

Result: Smooth brightness increase building tension

🎵 Vocal Sweetening

Goal: Add warmth and character to vocals

Settings:

  • Preset: Warm Pad
  • Source: Vocal track
  • Cutoff: 800 Hz (from preset)
  • Resonance: 0.5 (from preset)
  • DC blocker: On
  • Limiter: Soft
  • Output trim: 0 dB

Result: Warm, musical vocal treatment with analog character

Advanced Techniques

Creative filter strategies:
  • Serial filtering: Apply multiple Moog filters in sequence
  • Parallel processing: Blend dry and filtered signals
  • Automation chains: Create complex movements with multiple sweeps
  • Extreme settings: Explore self-oscillation at maximum resonance
  • Source selection: Use harmonic-rich sources for best results

The Moog filter responds differently to various source materials

Parameter optimization guide:
  • Cutoff 50-300 Hz: Sub-bass and rumble effects
  • Cutoff 300-800 Hz: Bass and lower midrange
  • Cutoff 800-2000 Hz: Vocal and instrument range
  • Cutoff 2000+ Hz: Brightness and presence
  • Resonance 0-0.3: Subtle emphasis
  • Resonance 0.3-0.7: Musical peak emphasis
  • Resonance 0.7-0.9: Strong resonance effects
  • Resonance 0.9+: Extreme squelch and self-oscillation

Troubleshooting Common Issues

Problem: Excessive volume increase with high resonance
Cause: Resonance peak creates significant gain boost
Solution: Use output trim to compensate, enable limiting
Problem: Low-frequency rumble or DC offset
Cause: Filter resonance amplifying very low frequencies
Solution: Enable DC blocker, check source material
Problem: Stepping or zipper noise in automation
Cause: Parameter changes too abrupt
Solution: Use smaller chunk sizes, ensure smooth interpolation
Problem: Numerical instability or NaN values
Cause: Extreme parameter combinations
Solution: The script includes safety limits, use moderate settings

Technical Deep Dive

TPT Mathematics

Topology-Preserving Transform

Mathematical foundation:

Analog prototype: H(s) = 1 / (1 + s/ωc) [one-pole low-pass] Bilinear transform: s = 2/T × (1 - z⁻¹)/(1 + z⁻¹) Where T = 1/fs (sampling period) TPT derivation: Substitute bilinear transform into analog transfer function: H(z) = 1 / [1 + (2/T × (1-z⁻¹)/(1+z⁻¹))/ωc] Simplify: H(z) = [1 + z⁻¹] / [(1 + 2/(ωc×T)) + (1 - 2/(ωc×T))×z⁻¹] TPT coefficient g: Let g = tan(ωc×T/2) Then: H(z) = (g/(1+g)) × (1 + z⁻¹) / (1 + ((1-g)/(1+g))×z⁻¹) Difference equation: y[n] = g/(1+g) × (x[n] + x[n-1]) + (1-g)/(1+g) × y[n-1] Practical implementation: gg = g/(1+g) gg_comp = 1 - gg y[n] = gg × (x[n] + x[n-1]) + gg_comp × y[n-1]

Why TPT for Moog Emulation?

Comparison with other methods:

Direct form I/II:
Standard digital filter implementation
Can become unstable with high resonance
Frequency response errors at high cutoffs

Impulse invariant:
Matches impulse response of analog filter
Aliasing issues at high frequencies
Complex computation

State variable:
Separate bandpass, highpass outputs
Good for modulation but less authentic Moog sound

TPT (This implementation):
Preserves analog filter topology exactly
Numerically stable across entire parameter range
Authentic Moog character and nonlinearities
Efficient computation suitable for real-time

Key advantage:
TPT maintains the musical qualities of the analog original
while providing digital stability and precision