Multiband Distortion — User Guide

Three-band nonlinear processing with complementary zero-phase splitting, independent waveshaping per band, optional drive normalization/compensation, oversampling, and explicit output-level policy.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 0.7.1 (2026) License: MIT License Repo: Praat AudioTools
Contents:

What this does

Multiband Distortion splits one Sound into complementary low, mid, and high components, applies an independent memoryless nonlinearity to each band, sums the processed bands, optionally blends that wet signal with the original, and then applies an explicit output-level policy.

Low = LP(fL) Mid = LP(fH) − LP(fL) High = x − LP(fH) Therefore, before nonlinear processing: Low + Mid + High = x

The complementary reconstruction is algebraic: the same filtered objects used to define the bands are subtracted from one another. With identity band processing, the three components sum back to the working signal. Once the bands are shaped differently, the result is intentionally no longer a reconstruction of the source.

Zero-phase, not causal crossover. Praat’s Hann-band filtering is performed with a symmetric zero-phase response. This avoids inter-band phase offset in the undistorted complementary split, but it is acausal: energy can appear before a transient. With identity processing the complementary bands cancel that pre-ringing on recombination; different nonlinear processing can prevent complete cancellation, making pre-ringing audible around sharp events.

Quick start

  1. Select exactly one Sound in Praat.
  2. Choose a preset, or leave Manual to use the main-form settings directly.
  3. Set Low_Split_Hz and High_Split_Hz.
  4. For Low, Mid, and High, choose a Drive and one of three shaping types: Soft Clip, Hard Clip, or Sine Waveshaper.
  5. Set Mix_0_to_1 and Output_Gain.
  6. Enable Advanced_settings only when you need band gains, drive-normalization behavior, output policy, oversampling, or a different visualization ceiling.
  7. Run the script. The result is named <source>_MultiDist_<presetName>.
Preset scope: each named preset fixes both crossovers plus all three Drive, Type, and Gain values. Global controls remain yours: Mix, Output_Gain, Output_mode, Oversample, Normalize_drive, and Drive_compensation are not part of the preset identity.

Band splitting

Complementary subtractive split

1. LP_H = Hann-band low-pass from 0 Hz to High_Split_Hz 2. Low = Hann-band low-pass from 0 Hz to Low_Split_Hz 3. Mid = LP_H − Low 4. High = Working signal − LP_H

The two Praat filters use a 20 Hz smoothing/transition width. The script therefore requires at least 40 Hz between the two crossover frequencies.

ValidationRule
Low crossoverMust be above 0 Hz.
High crossoverMust be below Nyquist.
OrderingLow_Split_Hz < High_Split_Hz.
SpacingAt least 40 Hz between the crossovers.
Pre-ringing is a real property of this design. The crossover is zero-phase and acausal. The script’s own development tests measured substantial pre-event energy on an impulse after unequal band distortion. This is not a causal crossover and should not be documented as one.

Waveshaping and Drive

Three shaping types

TypeCore mappingInterpretation
Soft Clip (Tanh)tanh(inputScale × x) × outputScaleSmooth odd-symmetric saturation.
Hard ClipClamp the scaled input to ±1, then apply outputScale.Flat-topped clipping with strong high-frequency generation.
Sine Waveshapersin(inputScale × x) × outputScaleA sinusoidal waveshaper. It does not begin folding until the argument exceeds ±π/2; with normalized Drive = 1 it remains monotonic over the available ±1-radian range.

Normalize_drive

With Normalize_drive = ON (default), each band is measured using one whole-file absolute peak. The band is scaled relative to that peak before Drive reaches the waveshaper. This makes Drive less dependent on the raw level of the split band, but it is not local or time-varying normalization.

Linked across channels: the peak is measured over the entire multichannel band object. A loud channel can therefore set the Drive staging for quieter channels. This is intentional linked behavior, suitable for a stereo pair but important for unrelated multichannel material.

With Normalize_drive = OFF, the legacy mapping is used directly: the band enters the waveshaper as x × Drive. Drive therefore changes both shaping depth and the linear-region gain.

Drive_compensation

Drive_compensation requires Normalize_drive = ON. When active, the output scale divides out Drive’s linear-region gain. This means Drive primarily controls how deeply the signal enters the nonlinear curve rather than acting as an additional linear gain. It does not guarantee constant band peak or RMS after nonlinear shaping.

Normalize_drive ON, compensation OFF: inputScale = Drive / bandPeak outputScale = Gain × bandPeak linear-region slope ≈ Drive × Gain Normalize_drive ON, compensation ON: inputScale = Drive / bandPeak outputScale = Gain × bandPeak / Drive linear-region slope ≈ Gain

If compensation is requested while Normalize_drive is OFF, the script reports that compensation is inactive. Near Drive = 0 with both normalization and compensation active, the procedure bypasses the waveshaper and returns the linear limit x × Gain, avoiding a division-by-zero discontinuity.

Named presets

There are five named presets plus Manual. The five named presets overwrite all eleven band-specific values: two crossovers, three Drive values, three Type selections, and three band Gains.

PresetCrossoversLowMidHigh
Warm Bass / Gentle Highs200 / 2500 HzSoft, Drive 2.0, Gain 1.1Soft, Drive 1.0, Gain 1.0Soft, Drive 0.8, Gain 1.0
Frizz (High-Band Hard Clip)200 / 1500 HzSoft, 1.0, 1.0Soft, 1.0, 1.0Hard, 3.5, 1.0
V-Shape Destruction200 / 2500 HzHard, 2.5, 1.0Soft, 1.0, 0.7Hard, 2.5, 1.0
Mid-Range Crunch400 / 3000 HzSoft, 0.6, 0.5Sine, 3.0, 1.2Soft, 0.6, 0.5
Full Spectrum Fuzz200 / 2500 HzHard, 3.0, 1.0Hard, 3.0, 1.0Hard, 3.0, 1.0
Advanced band gains and named presets: the Advanced dialog appears before preset application. Therefore Low_Gain, Mid_Gain, and High_Gain entered there are used by Manual, but are overwritten by any named preset. Advanced technical/output settings remain active with named presets.

Advanced settings

The compact main form keeps musical controls visible. Enabling Advanced_settings opens a secondary dialog with the following defaults:

ControlDefaultMeaning
Normalize_driveONWhole-file peak normalization into each band’s waveshaper; linked across channels.
Low_Gain / Mid_Gain / High_Gain1.0 / 1.0 / 1.0Post-waveshaper band gain. Named presets overwrite these values.
Drive_compensationOFFRequires Normalize_drive; removes Drive’s linear-region gain factor.
Output_modeNormalize to 0.95, then output gainSelects the final peak policy.
Oversample4Oversampling factor for split → shaping → wet sum. 1 disables it; 2 is explicitly refused.
Visualization_max_Hz8000Maximum frequency shown in the spectrum panel, limited by Nyquist.

Oversampling

When Oversample > 1, the source is resampled upward before splitting and nonlinear processing. The processed wet sum is then resampled back to the original sampling rate. The downsampling stage band-limits the result and therefore reduces fold-back from newly generated high-frequency components.

Alias-reduced, not alias-free. Oversampling reduces nonlinear aliasing but does not eliminate it. Factors outside 1–8 are clamped and reported. Oversample = 2 is refused because the script’s Praat 6.1.38 tests found a frequency-dependent phase offset in the 2× round trip that becomes especially problematic when wet and dry are mixed. Use 1, or 3–8; 4 is the default.

Wet/dry mix and output stage

Mix

Wet = distorted Low + distorted Mid + distorted High Result before output stage = Dry × (1 − Mix) + Wet × Mix

Mix_0_to_1 is validated to the closed interval 0…1. At Mix = 1 only the wet signal is used. At Mix < 1, a copy of the original Sound is combined with the downsampled wet signal. Output_Gain is applied later, in the output stage.

Output modes

ModeExact behavior
Normalize to 0.95, then output gainIf the pre-output peak is above 1e-9, scale the mixed signal to peak 0.95, then multiply by Output_Gain. Near-silent material skips normalization but still receives Output_Gain.
Preserve level (output gain only)No peak scaling. Multiply directly by Output_Gain.
Output gain, then attenuate to 0.95 only if peak > 0.95Apply Output_Gain first. If the resulting peak exceeds 0.95, globally attenuate the entire signal to peak 0.95; otherwise leave it unchanged.
The third mode is not a dynamics limiter. Praat’s Scale peak applies one scalar to the whole Sound. It only attenuates globally when the measured peak exceeds the target.

The Info report includes source peak, wet-sum peak, pre-output peak, the output-stage decision, measured final peak, effective oversampling, Mix, and Output_Gain. A final peak above 1.0 is explicitly warned about.

Visualization

The v0.7.1 visualization uses the AudioTools compact page layout and directly describes this processor rather than presenting a generic effect graph.

Original waveform

The selected source Sound in gray.

Processed waveform

The final result after Mix and output policy.

Spectral comparison

Original spectrum in gray, result in red, with shaded Low/Mid/High regions and crossover lines. The display ceiling is min(Nyquist, Visualization_max_Hz).

Band settings

Three columns showing each band’s range, type, Drive, and Gain.

Master information

Mix and Output_Gain.

Summary strip

Input, preset, band configuration, effective oversampling, output policy, gain, and final peak.

Spectrum interpretation: the displayed spectra compare the original and final rendered result. Differences therefore reflect all active stages together: splitting, band waveshaping, band gains, wet/dry mixing, output policy, and Output_Gain.

Interpretation and limitations