Humanizer runs a track through eight signal-processing stages, each targeting one acoustic property that a synthesized or overly-clean recording tends to lack: timing regularity, dynamic flatness, harmonic purity, spatial imaging, noise floor, and inharmonicity. Nothing leaves your browser — decoding, processing, and rendering all happen client-side with the Web Audio API.
Detects transients using an energy-flux picker — it looks for sudden jumps in short-time RMS energy, which catches drum hits, picked notes, and other percussive onsets well. It doesn't reliably catch onsets in sustained pads or legato/bowed material, since there's no sharp energy jump to key off there. Detected onsets show up as magenta ticks on the waveform. Each note segment then gets re-triggered with a small random timing offset — the note content itself is untouched, only when it fires moves. Because this changes how the source is scheduled rather than filtering it, changes apply on release rather than live, with a brief restart.
Continuous slow (wow) and fast (flutter) pitch/time modulation, like a tape transport with imperfect speed stability. This is the "everything drifts slightly" counterpart to Note Timing's per-note jitter.
Two slow, deliberately non-aligned LFOs modulate overall gain, mimicking the way a human performer's intensity naturally swells and recedes phrase to phrase rather than sitting at a constant level.
A broadband tanh-based saturation stage adds odd/even harmonics that a clean synthesized signal typically lacks. drive controls how hard the signal is pushed into the curve; mix blends it back with the unprocessed signal.
Real spatial reflections via convolution reverb. By default this uses a procedurally synthesized impulse response (sparse early reflections plus a decaying diffuse tail). You can upload a real captured impulse response instead — see the IR upload section below.
An additive, filtered noise bed simulating preamp hiss or room tone. Choose white, pink, or brown noise from the color selector — this swaps instantly during playback with no restart, since the noise floor is an independent branch that doesn't touch the rest of the chain.
A modulated micro-delay (comb filter) network detunes upper partials slightly, the way a real string or reed instrument's harmonics aren't perfectly integer multiples of the fundamental. The comb send is high-passed so the low end is never comb-filtered — inharmonicity is a high-partial effect physically, and this keeps it from hollowing out the bass.
High-passed cross-channel delay and gain, simulating the way a real multitrack capture picks up mic/room crosstalk between channels. High-passed for the same reason as inharmonicity — bass doesn't meaningfully bleed between mics in a real room, and leaving it full-band would cause low-end phase cancellation.
Three built-in starting points:
Use 💾 SAVE AS to store your own combination under a name — saved presets persist between sessions. ↺ RESET snaps every module back to its shipped default.
In the Room Convolution module, click ⇧ UPLOAD IR and pick an audio file captured from a real space (or a guitar cab/amp IR if you want that character instead of a room). It's decoded at your browser's native sample rate for live preview, and re-decoded at the export sample rate when you render, so there's no mismatch between what you hear and what you download. Click ✕ CLEAR to revert to the synthesized room. While a custom IR is loaded, the size slider has no effect, since a captured IR has its own fixed length.
Good free sources for real room/space IRs: EchoThief (echothief.com) for unusual real-world spaces, and OpenAIR (openairlib.net) for a more academically documented library of buildings and halls.
⇓ WAV renders a full-quality 16-bit PCM file. ⇓ MP3 encodes at 192kbps using an in-browser MP3 encoder. Both render the entire track offline through the exact same signal chain used for live preview — nothing is approximated for export.
Most sliders and toggles update the live audio graph directly — gain, filter frequency, and delay-time changes are ramped smoothly with no dropout, so you can dial things in while listening. A module tagged RESCHED (currently just Note Timing) changes how the source itself is scheduled rather than filtering an existing signal, so it can't be updated mid-stream the same way — instead it restarts playback from your current position when you release a slider or flip its toggle.