ferraus master
Automatic master of a finished mix to a delivery target
Synopsis
ferraus master <input> [options] [-o <output>]
What it does
Runs the automatic mastering chain and writes a release-ready master. Pre-flight: dc-remove, head/tail silence trim at -70 dB, analyze problems (clipping means declip runs first). Corrective EQ: match-eq toward --reference or the genre curve at --match-amount (1/3-octave bands, at most 4 dB per band), static cuts on persistent narrow resonances, 20 Hz high-pass. Dynamics: four-band multiband compression at 1.5:1 to 2:1 with tempo-dependent release, plus glue compression (1.5:1, 30 ms) when the crest factor is above the genre target. Stereo: widen with mono bass below --bass-mono, never letting broadband correlation drop below 0.3. Color: tape saturation and an exciter layer at --warmth. Loudness: gain to the target, then a 4x-oversampled true-peak limiter whose gain reduction is bounded by --intensity; if the target cannot be reached within the bound the master lands as close as possible and the report says so. Output: TPDF dither when writing 16-bit, master verify, the before/after report (--report), and a loudness-matched before/after pair (--ab). Every stage is an ordinary ferraus command; 'master plan' shows the exact chain and 'master --plan' runs an edited one. --stems (best-effort) separates the mix first and treats vocals, drums, bass, and other separately.
Examples
Master for streaming (-14 LUFS, -1 dBTP) with every default
ferraus master mix.wav -o master.wav
Run an edited plan and write the before/after report
ferraus master mix.wav --plan plan.json -o master_v1.wav --report r1.json
Move toward a reference's tonal balance and write an A/B pair
ferraus master mix.wav --reference ref.wav --match-amount 75% --ab -o master.wav
A loud club master
ferraus master mix.wav --target club --genre edm --intensity heavy -o club.wav
Options
| Flag | Type | Default | Meaning |
|---|---|---|---|
--target | streaming | apple | youtube | club | cd | broadcast | podcast | custom | streaming | Delivery target: streaming -14 LUFS/-1 dBTP, apple -16/-1, youtube -14/-1, club -8/-0.3, cd -10/-0.3 (16-bit 44.1 kHz), broadcast -23/-1 (EBU R128), podcast -16 stereo or -19 mono/-1, custom (--lufs, --true-peak) |
--lufs | gain | — | Integrated loudness for --target custom (e.g. -12LUFS); overrides a named target's loudness |
--true-peak | gain | — | True-peak ceiling for --target custom (e.g. -1dBTP, default -1dBTP); overrides a named target's ceiling |
--standard | ebu | atsc | ebu | Broadcast standard for --target broadcast: ebu (-23 LUFS, -1 dBTP) or atsc (-24 LKFS, -2 dBTP) |
--reference | path | — | Reference track whose tonal balance the corrective EQ moves toward (replaces the genre curve) |
--match-amount | percent | 50% | How much of the measured tonal difference the corrective EQ corrects (each band is capped at 4 dB) |
--genre | auto | pop | hiphop | edm | rock | acoustic | classical | jazz | podcast | auto | Genre for the tonal curve and dynamics targets; auto guesses from tempo, spectral tilt, low-end share, and crest factor |
--intensity | light | medium | heavy | medium | How hard to push: bounds limiter gain reduction (light 2 dB, medium 4 dB, heavy 6 dB) and sets compression ratios; an input that already looks mastered defaults to light |
--width | percent | 100% | Stereo width of the side signal (100% unchanged); never narrower than mono bass or wider than broadband correlation 0.3 allows |
--bass-mono | frequency | 120Hz | Side signal below this frequency is collapsed to mono |
--warmth | percent | 15% | Tape saturation and exciter amount (0% skips the color stage) |
--no-eq | flag | — | Skip the corrective EQ |
--no-widen | flag | — | Skip the stereo stage |
--trim-silence | text | -70dB | Trim head and tail silence below this level (dBFS), or 'off' |
--report | path | — | Write the before/after report (JSON) here |
--ab | flag | — | Also write a loudness-matched before/after pair (within 0.2 LU) for listening: <output>.ab-before.wav and <output>.ab-after.wav |
--plan | path | — | Run this (edited) plan instead of planning: the JSON from 'master plan' |
--stems | flag | — | Best-effort stem-aware mastering: separate (best verified tier), per-stem chains, then sum and master |
Global options
Every command also accepts the global options (-o, --json, --dry-run, --overwrite, --progress, ...). See Global options.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Processing failed |
| 2 | Usage or parameter error |
| 3 | Input missing or unreadable |
| 4 | Unsupported format or codec |
| 5 | Model not cached and downloads disabled |
| 6 | Model download or verification failed |
| 8 | Cancelled |
| 10 | Network error |
| 70 | Internal error (bug) |
Common mistakes
- Forgetting that outputs are never overwritten: pass
--overwriteor a new-opath when re-running. - Percentages accept
80%or the fraction0.8; a bare80means 80x, not 80%. - Gains need a unit when not in dB:
0.5xis a factor,-6and-6dBare decibels.
For models
- MCP tool:
ferraus_master - Schema:
ferraus schema master - Pipeline:
{ op: master, args: { ... } }(flag names with_instead of-) - fx stage: no
{"command": "master", "defaults": {"target": "streaming", "standard": "ebu", "match_amount": "50%", "genre": "auto", "intensity": "medium", "width": "100%", "bass_mono": "120Hz", "warmth": "15%", "trim_silence": "-70dB"}}