The small pieces of software that shape almost every sound you hear — the
equalisers, compressors, reverbs, and synthesisers that live inside a digital
audio workstation. A complete tour of their history, the categories engineers
build, the formats that carry them, the frameworks that make them, and seven
working examples you can play in the browser.
An audio plugin is a self-contained software module that a host
application loads at run time to process or generate audio. The host — usually a
digital audio workstation (DAW) such as Ableton Live, Logic Pro, Cubase,
Pro Tools, or Reaper — owns the audio hardware, the transport, and the mix graph;
the plugin is dropped into that graph to do one job: filter a signal, squeeze its
dynamics, drench it in reverberation, or synthesise notes from MIDI.
Conceptually a plugin is a function evaluated on a stream of samples. The host hands
it a small block of input samples together with the current parameter values, and the
plugin returns a block of output samples. An effect maps audio in to audio
out; an instrument maps MIDI in to audio out. Everything else — the knobs,
the meters, the saved presets — is machinery around that central mapping.
Track / Input→EQ→Compressor→Saturation→Delay→Mix Bus
A typical insert chain: plugins process the signal in series, each feeding the next.
Two facts shape everything about how plugins are written. First, they run on the
real-time audio thread: the host calls the plugin's process function
every few milliseconds, and it must always finish before the soundcard needs the next
buffer or the listener hears a click. That callback may not lock a mutex, allocate
memory, touch a file, or block on anything — the discipline that governs all serious
audio code. Second, the plugin must conform to a format: a binary and
API contract (VST3, Audio Unit, AAX, CLAP…) that tells the host how to find it,
negotiate its buses, enumerate its parameters, and call it safely.
Try it — a plugin is just f(x)
Below, a short loop is synthesised in your browser and passed through a trivial
"plugin" — a one-knob tilt filter with a bypass. This is the whole idea in miniature:
a source, a processor with a parameter, and an A/B comparison. The seven example
repositories at the end build the real thing for each effect family.
press play — output waveform
idle
All audio on this site is generated or processed live in the browser with the Web Audio
API — nothing is streamed from a file. It is a faithful analogue of what a native plugin
does inside a DAW, running on the same principles.
1A short history
The plugin is the child of two older worlds colliding: the rack of outboard studio
hardware, and the general-purpose computer fast enough to emulate it in real time.
For most of the twentieth century, signal processing meant hardware: passive
Pultec equalisers, optical LA-2A compressors, EMT plate reverbs, tape echoes, and Moog
modular synthesisers — each a physical box patched into the console. Digital signal
processing arrived in studios first as expensive dedicated hardware (the Lexicon 224,
the Publison and AMS units, the Sony DRE) and then, in the late 1980s, as
DSP-card systems: Digidesign's Sound Tools and then Pro Tools ran effects on
Motorola 56000 chips mounted inside the computer. The processing was still on custom
silicon, but the routing and the user interface had moved into software.
The decisive break came in 1996, when Steinberg opened the Virtual Studio
Technology (VST) interface in Cubase and — crucially — published the SDK so
that anyone could write an effect that ran on the host CPU. Native processing, an open
API, and ever-faster processors turned a specialist hardware market into a software one.
Within a decade the mixing desk, the outboard rack, and the synthesiser had all been
redrawn as windows on a screen.
1987
Digidesign Sound Tools — the first mainstream hard-disk recording/editing system for the Mac. Effects run on dedicated DSP hardware; it evolves into Pro Tools (1991) with its TDM plugin bus on 56k DSP cards.
1996
Steinberg VST 1.0 ships in Cubase 3.02, with a free SDK. Native (host-CPU) effects become possible for everyone. The first bundled plugins — including a reverb and the Espacial — define the template. Microsoft's DirectX plugins (Cakewalk) appear on Windows around the same time.
1999
VST 2.0 adds MIDI and thereby VST instruments (VSTi). Native Instruments' Reaktor, Propellerhead's ReBirth/Reason era, and a wave of software synthesisers follow. Steinberg's Neon is the first VSTi.
2002–2005
Apple ships Audio Units (AU) as part of Core Audio in Mac OS X, tightly integrated with Logic and GarageBand. Digidesign replaces TDM's host API with RTAS for native Pro Tools processing. Cross-platform frameworks emerge to target them all at once.
2004–2008
JUCE (Julian Storer) matures into the dominant C++ framework for cross-format plugins. UAD and Waves build businesses on meticulous hardware emulations; convolution reverb (Altiverb) and amp-sim modelling go mainstream.
2008
VST3 — a ground-up redesign: sample-accurate automation, flexible bus/side-chain arrangements, silence flags, and a cleaner component model separating processor from editor.
2011–2018
AUv3 brings sandboxed Audio Units to iOS and macOS. Avid replaces RTAS with AAX (native and DSP/HDX) for Pro Tools. Roli acquires JUCE (2014); the plugin world is now overwhelmingly software, cross-platform, and native-CPU.
2022
CLAP (CLever Audio Plugin) — an open, MIT-licensed format from Bitwig and u-he — arrives with modern threading, polyphonic per-note modulation and per-voice parameter control, quickly gaining host support. The same year, browser Web Audio and WebAssembly make plugins that run on this very page practical.
The plugin did to the recording studio what the spreadsheet did to the accountant's
desk: it did not merely digitise the tools, it dissolved the boundary between the tool
and the workspace, so that an unlimited rack could be conjured and rearranged at will.
2Formats — the technologies that carry a plugin
A format is the contract between plugin and host: how the binary is packaged,
how the host discovers and instantiates it, how buses and parameters are described, and
how the process callback is invoked. Choosing which to support is the first engineering
decision; most developers target several through one framework.
Format
Owner
Since
Platforms
Notes
VST2
Steinberg
1999
Win / macOS / Linux
Ubiquitous for two decades; SDK licence closed in 2018, deprecated but still hosted everywhere.
Native to Core Audio; required by Logic & GarageBand. Validated by auval.
AUv3
Apple
2015
macOS / iOS
App-extension model, sandboxed; the only plugin format on iOS.
AAX
Avid
2011
Win / macOS
Pro Tools only; native and DSP (HDX) variants. SDK requires Avid registration; signed builds.
CLAP
Bitwig / u-he
2022
Win / macOS / Linux
Open MIT licence, modern threading, per-note/polyphonic modulation. Fast-growing host support.
LV2
Open community
2008
mostly Linux
Successor to LADSPA/DSSI; extensible via RDF "features". The Linux native standard.
LADSPA / DSSI
Open community
2000
Linux
Minimalist early Linux APIs; largely superseded by LV2.
RTAS / TDM
Digidesign
1990s
Win / macOS
Legacy Pro Tools formats, replaced by AAX.
Standalone
—
—
all
Not a plugin at all: the same DSP wrapped as its own application talking directly to the audio device.
Beneath the differences, every format exposes the same handful of ideas: a way to
enumerate parameters (with ranges, units, and automation), a
bus layout (mono/stereo/side-chain in and out), a
process callback operating on sample blocks, and a mechanism to
save and restore state so a session recalls exactly what you heard.
A good framework hides the format-specific plumbing behind one API, so you write the
DSP once and it compiles to VST3, AU, AAX, CLAP and Standalone together.
The web analogue used throughout this site — Web Audio's AudioWorkletNode — is itself a "format": a process callback on a dedicated audio thread, parameters delivered as automation curves, and a message port for the GUI. The parallels to VST3/AU are exact.
3The types commonly built
Almost every plugin falls into one of a dozen families. The seven with a green arrow
have a full working example in this collection — click through to play them.
Subtractive, FM, additive, wavetable, granular, physical-modelling. Sound from first principles.
example ▶
Samplers & ROMplers
Play back and manipulate recorded audio mapped across a keyboard; multisampling, round-robins, key/velocity zones.
Drum machines
Step-sequenced or pad-triggered percussion instruments, often blending samples with synthesis.
MIDI & control
MIDI effects
Arpeggiators, chord generators, scale quantisers, note repeaters — they transform MIDI, not audio.
Modulators
LFOs, envelope followers, macro controllers routed to other plugins' parameters (host-dependent).
Analysis / sidechain sources
Tuners, key detectors, and triggers that drive other processors.
4Anatomy of a plugin
Whatever the format or framework, a plugin has the same four parts. Understanding the
boundaries between them — especially the wall between the audio thread and everything
else — is the whole craft.
1 · The processor (DSP core)
The real-time heart. A processBlock callback receives an audio buffer and the current parameters and computes the output, sample by sample or block by block. No allocation, no locks, no I/O.
2 · Parameters
The automatable, host-visible controls, each with a range, unit, and default. They cross the thread boundary atomically and are usually smoothed to avoid zipper noise.
3 · State
The full snapshot saved with a session or a preset: parameters plus any extra data (loaded IRs, curves). Serialised to and from the host as an opaque blob.
4 · The editor (GUI)
The optional window of knobs, meters, and displays, running on the message thread. It observes parameters and sends changes back — never touching the DSP data directly.
The real-time contract
The audio callback runs under a hard deadline. With a 48 kHz sample rate and a
128-sample buffer, the host expects the next block roughly every
$128/48000 \approx 2.67$ ms, forever, without exception. Miss it and the listener
hears a click or dropout. The rules that follow are absolute inside the callback:
No memory allocation — new/malloc can block on the OS. Pre-allocate everything in prepareToPlay.
No locks — a mutex held by a lower-priority thread can cause priority inversion and a glitch. Communicate with lock-free FIFOs and atomics.
No system calls — no file, network, or console I/O; no unbounded loops.
Bounded, deterministic work — the cost of a block must not depend on data in ways that can spike.
Everything the DSP does — every biquad, every delay tap, every oscillator — is a small,
predictable amount of arithmetic chosen to fit comfortably inside that window even with
dozens of instances running at once.
Why parameters must be smoothed
A parameter changed instantly from one block to the next creates a step discontinuity
in a coefficient or gain, which the ear hears as a click ("zipper noise"). The fix is a
one-pole smoother applied per sample:
with $\alpha$ chosen for a short time constant (a few milliseconds). Frameworks provide
this as SmoothedValue (JUCE) or as k-rate AudioParam ramps
(Web Audio). Every example in this collection smooths its parameters.
5Frameworks — how plugins are actually built
Nobody writes VST3, AU, AAX and CLAP boilerplate by hand for each product. A
framework provides the format wrappers, a DSP library, a GUI toolkit, and a
build system, so you write the plugin once and export to all targets.
Framework
Language
Targets
Character
JUCE
C++
VST3 · AU · AUv3 · AAX · CLAP* · Standalone · LV2
The industry default. Huge dsp module, GUI toolkit, and the AudioProcessor abstraction. Dual GPL/commercial. Full tutorial →
iPlug2
C++
VST2/3 · AU · AAX · Web (WAM)
Lean, permissive (open source), popular for indie plugins; can compile to the browser.
*CLAP support in JUCE is available via the community clap-juce-extensions.
For nearly all newcomers the answer is JUCE: it has the largest
community, the most complete DSP and GUI libraries, and it targets every mainstream
format from a single C++ codebase. This collection includes a
dedicated in-depth JUCE
tutorial, and every example plugin below shows its DSP written both in browser
JavaScript (so you can hear it here) and in idiomatic JUCE C++ (so you can build it for
real).
6The DSP building blocks
A surprisingly small toolbox of primitives, combined and tuned, produces the entire
catalogue of effects and instruments. Each links to the example where it does the work.
The sample loop
At bottom, all of it is a loop over samples. A processor keeps some state
(past inputs and outputs, buffer contents, oscillator phase) and, for each incoming
sample $x[n]$, emits $y[n]$ as a function of the input and that state. A linear
time-invariant block is fully described by a difference equation:
whose behaviour is captured by the transfer function
$H(z) = \dfrac{\sum_k b_k z^{-k}}{1+\sum_k a_k z^{-k}}$, evaluated on the unit circle
$z=e^{j\omega}$ to read off the frequency response. From this one relation flow filters,
equalisers, comb-based delays and reverbs.
Biquads & filters
Second-order IIR sections — the atoms of every equaliser and of the resonant filter in a synth.
Delay lines
A circular buffer with (fractional) read taps — the basis of delay, reverb and modulation.
Envelopes & detectors
Followers and ADSR generators that track or shape level over time — the engine of dynamics and of note articulation.
Oscillators
Band-limited generators (PolyBLEP, wavetable) for synthesis and LFOs for modulation.
Nonlinearities
Memoryless waveshapers that add harmonics — the core of distortion and saturation, tamed by oversampling.
Transforms
The FFT and its relatives move processing into the frequency domain for spectral effects, convolution reverb, and analysis. See the transform guides.
7Building & shipping
A plugin is a product as much as a program. Turning working DSP into something that
loads reliably in every host on every machine is its own discipline.
Build system. Modern JUCE uses CMake to produce all targets; the classic route is the Projucer. A CI matrix cross-compiles for Windows, macOS (universal x86-64 + arm64), and Linux.
Validation. Apple's auval gates AU loading; the community's pluginval stress-tests VST3/AU/AAX against threading, state, and bus-layout edge cases. Passing them is non-negotiable before release.
Code signing & notarisation. macOS requires signed, notarised, hardened-runtime binaries or Gatekeeper blocks them; Windows expects an Authenticode signature. AAX additionally requires Avid's PACE signing.
Installers. Plugins live in fixed folders (~/Library/Audio/Plug-Ins/… on macOS, %CommonProgramFiles%\VST3 on Windows). Installers place each format's bundle correctly and clean up old versions.
Licensing & protection. From simple serials to challenge–response and third-party systems; the perennial tension between piracy resistance and user goodwill.
Latency reporting. Any look-ahead or oversampling introduces delay; the plugin must report its latency so the host can compensate and keep tracks in sync.
The browser examples in this collection sidestep signing and installers entirely — they are just web pages — but they honour the same DSP correctness, parameter smoothing, and latency awareness that a shipping native plugin must.
8The collection
Nine repositories. This hub, an in-depth JUCE tutorial, and seven working plugin
examples — each a self-contained page with a live, playable demo, real DSP maths, and
the equivalent JUCE C++.
Explore the family
JUCE Tutorial — build a real plugin from an empty folder: AudioProcessor, APVTS parameters, processBlock, editor & look-and-feel, MIDI, presets, packaging.