Tone.Limiter: Protecting Audio Levels in Tone.js

In web audio development, preventing signal distortion and protecting listeners’ ears is crucial. This article explains how the Tone.Limiter class in Tone.js acts as a master safeguard by capping audio signals at a specified decibel threshold, preventing digital clipping, and ensuring a polished, safe audio output.

What is Tone.Limiter?

Tone.Limiter is a specialized dynamic range processor in the Tone.js framework. It is essentially a compressor configured with a very high compression ratio (often infinity-to-one) and an extremely fast attack time. Its primary job is to act as an absolute ceiling for volume, ensuring that the audio signal never exceeds a designated decibel level.

How It Protects Audio Levels

When working with multiple synthesizers, samplers, and effects in Tone.js, their combined output volumes can easily add up. If the total signal exceeds 0 dBFS (decibels relative to full scale), the browser’s audio engine will truncate the waveform, resulting in harsh, unpleasant digital clipping.

Tone.Limiter protects your audio in two ways:

Implementing Tone.Limiter in Code

To use Tone.Limiter, you instantiate the class, define the threshold, and connect your audio sources to it before routing the limiter to the main output.

// Create a limiter with a threshold of -2 decibels
const limiter = new Tone.Limiter(-2).toDestination();

// Connect your instrument or synth to the limiter
const synth = new Tone.PolySynth().connect(limiter);

By routing all synthesizers and sound sources through this limiter, any sudden volume spikes are automatically attenuated, keeping the overall mix safe, cohesive, and distortion-free.