Input: any format the browser can decode. It is converted to 44.1 kHz on load.
Output:
WAV 16-bit (TPDF dither), WAV 24-bit or MP3 320 kbps;
44.1 or 48 kHz.
Metering:
ITU-R BS.1770-4 / EBU R128: integrated, short-term and momentary loudness, and LRA;
true peak with 4× oversampling.
Default target: -10.8 LUFS / -1.0 dBTP.
Origin: a 2-mix port of the AIDAW stem-mastering chain, with automatic settings guided by measurements of typical masters.
02Architecture
Main thread (app.js) UI, decoding, WAV/MP3 file encoding
├─ Web Worker (worker.js) analysis → prescription → calibration → loudness solve → offline render
└─ AudioWorklet realtime playback: the same MasterChain + LiveMeter
03Signal chain
input trim (to -14 LUFS) → HPF (4th-order Butterworth) → tone EQ → manual EQ ×4
→ dynamic EQ (up to 10 bands, loud moments only) → punch (<150 Hz transients)
→ glue compressor → colour (saturation) → space (FDN) → stereo (mono lows, width, M/S presence)
→ true-peak limiter (drive solved by the loudness lock)
04Modules
Tone EQ (RBJ biquads):
90 Hz low shelf, ±6 dB;
low bell, 40–120 Hz, Q 1.2;
mud bell, 150–500 Hz, Q 1.0;
broad high shelf, 2–10 kHz, Q 0.45, -8 to +3 dB;
16 kHz air shelf;
4 manual peaking bands (±12 dB, Q 0.3–10).
Dynamic bells:
They compute y = x + (g−1)·BP(x) with a 0 dB bandpass, which gives an exact bell whose gain can change every sample.
Thresholds are calibrated per song, so the loudest 15 % of the song gets the set depth.
For narrow resonance bells (Q ≥ 4), static EQ boosts at the same frequency are added to the depth. Broad bands don't do this, so they don't cancel the high shelf on loud moments.
Hi-hat tamer: a wide dynamic bell at 10 kHz, Q 0.8 (about 7–14 kHz), keyed on jumps rather than level: when a fast envelope (0.2 / 5 ms) rises more than 1 dB over the band's own average (15 / 120 ms), 3/4 of the jump is taken off, at most 6 dB, released in 40 ms. It acts on every hit, quiet hats included; cymbal ring and the overall top end are barely touched. It is an ordinary dynamic EQ band (level depth 0, jump detector only), so CUSTOM shows it as "Hi-hat control (10k)" with its maximum as the slider. It stays separate from the 8 kHz crash band: one band for both missed the hats around 10 kHz.
Punch: a complementary split at 150 Hz, with transient shaping on the low band only and a measured makeup.
Glue: a feed-forward, linked compressor.
The sidechain is high-passed at 100 Hz.
Detection is dual (RMS and peak), with a 6 dB soft knee.
Auto settings pick an amount per song: the average gain reduction on the loud parts (top 15%), 1.5 dB by default, 2 dB for songs with large section-to-section level changes and 1 dB for dense masters and ballads. The threshold is calibrated per song to hit that amount, so quiet parts pass almost untouched.
The ratio is 2:1 (1.5:1 for dense masters), the attack 30 ms, and the releases are synced to the BPM.
Colour: asymmetric tanh at 2× oversampling, normalised to unity small-signal gain.
Space: an 8-line FDN (Hadamard mixing, damped loop, pre-delay up to 250 ms), used at a few percent wet.
Stereo:
The side is high-passed (4th order) to make the lows mono.
Width is the side gain.
Presence adds a mid bell at 3 kHz and cuts the side there by half as much.
Limiter:
2 ms lookahead, with true-peak detection by 4× polyphase interpolation.
The required gain goes through a sliding-window minimum, release smoothing (plus a 6× slower second release) and a box filter of the same length, so the output never exceeds the ceiling.
05Analysis
Loudness: integrated LUFS, LRA, 10 s section loudness and crest factor.
Tone: low/high ratio (20–250 Hz vs 4–16 kHz) and the long-term spectrum.
Loud parts: bands that grow in the loudest 15 % of frames.
Resonances: persistent 2–5 kHz peaks.
Treble: the share above 5 kHz and at 9–10 kHz in loud parts.
Rhythm: BPM, folded into 70–180, and low-band onset rate.
Bass: the f0 distribution, used to detect 808s.
Stereo: side energy in the lows and highs.
06Auto prescription
Every source is taken to the same measured targets. There is no "already mastered" verdict.
Treble above 5 kHz: the 4.3 kHz shelf is solved so the loud-part share above 5 kHz hits the typical median of -16.9 dB. After every loud-only bell is in place, the master is measured again; if it falls short, the shelf is raised by the missing amount (at most +2.5 dB, raise only) and the loudness re-locked, which brings back the outline of the voice. Raising the shelf also lifts the source's codec swirl above 12 kHz, so whatever the loud-part level above 12 kHz exceeds the source by is taken back with a 12 kHz shelf (at most -4 dB, aiming 0.5 dB under the source). Ballads and very dark sources are skipped.
9–10 kHz:
The loudness-locked master is rendered and its loud parts are measured through an 8.5 kHz high-pass and 10.5 kHz low-pass (two stages each), in 2 ms chunks.
Amount (band share): if it is more than 0.5 dB above the upper end of typical masters (-26.6 dB), the 9.5 kHz bell is deepened by the excess (at most 3 dB) and the shelf is lowered by only 0.3 × the excess, so the bell does the work and the song does not get dull.
Spikes (loudest 2 ms chunk vs. the median): if they exceed the typical upper end of 11.1 dB, the 9.5 kHz bell is set to 3 dB and the shelf is left alone.
10.5–12.5 kHz: on the same master's loud parts (top 15 % of 100 ms blocks), the band's p95 over its median is measured. Above the typical 4.3 dB, 11.3 kHz (Q 1.5) is cut on loud moments by 6× the excess (1.5–4 dB). Not for ballads.
Hi-hat tamer: on for every song except ballads (up to 6 dB). The two measurements above are made without it; it is added afterwards, after the 11 kHz bell, and the loudness is solved again.
8 kHz bell: 3 dB (1.5 dB for bright sources), 200 ms release. The band's loudest 15 % is mostly crash cymbal ring, so it holds while the crash rings.
Resonances: persistent peaks ≥ +4 dB over their neighbourhood are cut narrowly (Q 8) on loud moments only, by the excess (prominence − 2.5 dB, 1–4 dB); peaks within 1/12 octave of each other share one cut. Deeper cuts took the gloss off the vocal, so only the excess is cut. Shallower for ballads (max 1.5 dB).
07Loudness lock
The pre-limiter render is cached, and the limiter drive is solved by the secant method to the target (±0.05 LU).
Edits are re-solved on eight 4 s excerpts plus the measured excerpt/full offset, which is about 5× faster.
The export re-measures the whole song.
08Genres, taste and learning
Genres are a layer on top of the auto settings. Their tone and width moves are sized from the diagnosis.
Taste: 8 axes (±3 steps) and 3 fixes (0–3). The applied deltas are recorded, so undo is exact.
Learning: an exponential average (rate 0.35) of your final-minus-auto offsets, applied to the next song.
09Export and QC
An offline render of the whole song, latency-compensated.
A LUFS correction, up to 2 passes.
A true-peak correction, up to 5 passes.
At 48 kHz, resampling followed by a peak re-check.
A 1 LSB TPDF dither for 16-bit, or lamejs at 320 kbps for MP3.
The measured kHz / LUFS / dBTP are shown.
10Requirements
A browser with AudioWorklet, module Web Workers and the Web Audio API.
All processing is local, and no audio is sent anywhere.
Settings, presets, learning and the language choice are stored in localStorage.
External loads: lamejs (jsDelivr) and Google Fonts.