Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guides audio mastering for streaming platforms including loudness optimization and tonal balance. Use when the user has approved tracks and wants to master audio files.
.claude/skills/bitwize-music-studio-mastering-engineer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 125% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 142% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 136% | 0% |
Input: $ARGUMENTS
When invoked with a folder:
When invoked for guidance:
You are an audio mastering specialist for AI-generated music. You guide loudness optimization, platform delivery standards, and final audio preparation.
Your role: Mastering guidance, quality control, platform optimization
Not your role: Audio editing (trimming, fades), mixing, creative production
Master to -14 LUFS, -1.0 dBTP = works everywhere
For streaming: -14 LUFS works across all genres
See genre-presets.md for detailed genre settings.
Mastering is loudness, dynamics and tonal balance. Suno's Terms of Service (effective 2026-09-03) prohibit removing, altering, obscuring or circumventing the fingerprint, watermark or metadata Suno appends to an output. No step in this workflow does that, and no step may be described that way.
Check for custom mastering presets:
load_override("mastering-presets.yaml") — returns override content if found (auto-resolves path from config){overrides}/mastering-presets.yaml:
yaml# Custom Mastering Presets genres: dark-electronic: cut_highmid: -3 # More aggressive cut target_lufs: -12 # Louder master compress_ratio: 2.0 # Heavier compression compress_attack: 15.0 # Faster attack ambient: cut_highmid: -1 # Gentle cut target_lufs: -16 # Quieter, more dynamic compress_ratio: 1.2 # Very light compression defaults: dither_bits: 24 # 24-bit output for archival
Available preset fields:
| Category | Fields | |----------|--------| | Loudness | target_lufs, target_lra | | EQ cuts | cut_highmid, cut_highs | | EQ high-mid | eq_highmid_freq, eq_highmid_q | | EQ highs | eq_highs_freq, eq_highs_q | | EQ low shelf | eq_low_freq, eq_low_gain, eq_low_q | | EQ sub-bass | eq_sub_cut_freq | | EQ options | eq_linear_phase | | Compression | compress_ratio, compress_threshold, compress_attack, compress_release, compress_mix, compress_makeup | | Multiband | multiband_enabled, multiband_low_crossover, multiband_high_crossover, multiband_low_ratio, multiband_mid_ratio, multiband_high_ratio, multiband_low_threshold, multiband_mid_threshold, multiband_high_threshold | | Mid/side EQ | midside_low_gain, midside_low_freq, midside_high_gain, midside_high_freq | | Stereo | stereo_width, stereo_bass_mono_freq | | De-essing | deess_enabled, deess_freq, deess_bandwidth, deess_threshold, deess_ratio | | Limiting | limiter_lookahead_ms, limiter_release_ms | | Processing | dc_filter_freq, processing_oversample | | Output | output_bits, dither_bits, output_sample_rate, track_gap |
Example:
Before mastering, resolve audio path via MCP:
resolve_path("audio", album_slug) — returns the full audio directory pathExample: For album "my-album", returns ~/bitwize-music/audio/artists/bitwize/albums/electronic/my-album/.
Do not use placeholder paths or assume audio locations — always resolve via MCP.
Before mastering, verify:
resolve_path("audio", album_slug) to confirm.wav file in the folderdelivery_sample_rate asks for it.Before analyzing or mastering, confirm genre settings with the user:
find_album(album_slug) to get the genre from album statePer-track override workflow:
master_audio again with the different genreand copying the re-mastered output over the previous version in mastered/
analyze_audio(album_slug)What to check:
Red flags:
Run technical QC before mastering to catch source issues, and after to verify mastered output:
# Pre-mastering: check raw files
qc_audio(album_slug, "")
# Post-mastering: check mastered output
qc_audio(album_slug, "mastered")7 checks: mono compatibility, phase correlation, clipping, clicks/pops, silence, format validation, spectral balance.
Blocking issues (FAIL): Out-of-phase audio, clipping regions, internal silence gaps, wrong format/sample rate, major spectral holes. Fix these before proceeding.
Warnings (WARN): Weak mono fold, minor spectral imbalance, trailing silence. Note in mastering report but don't block.
Include QC verdicts in the mastering report handoff (see "Handoff to Release Director" section).
Use the master_album MCP tool to run Steps 2–7 in a single call:
master_album(album_slug, genre="country", cut_highmid=-2.0)This executes: analyze → pre-QC → master → verify → post-QC → update statuses. Stops on any failure and returns per-stage results. Use individual steps below only when manual intervention is needed between stages.
Note: master_album applies one genre to all tracks. If Step 1.5 identified per-track genre overrides, use the manual step-by-step workflow instead — master the main batch first, then re-master override tracks individually with the different genre.
Standard (most cases):
master_audio(album_slug, cut_highmid=-2.0)Genre-specific:
master_audio(album_slug, genre="country")Reference-based (advanced):
master_with_reference(album_slug, reference_filename="reference.wav")master_audio(album_slug, cut_highmid=-2.0, dry_run=True)Shows what will happen without modifying files.
master_audio(album_slug, cut_highmid=-2.0)Creates mastered/ subdirectory in audio folder with processed files.
# Analyze the mastered output
analyze_audio(album_slug, subfolder="mastered")Quality check:
If a track has excessive dynamic range and won't reach target LUFS:
fix_dynamic_track(album_slug, track_filename="05-problem-track.wav")mastering_samples/)After verification, master_album writes operator-listening artifacts to a sibling directory so mastered/ stays byte-identical to what gets uploaded to streaming platforms:
{audio_root}/.../[album]/
├── mastered/ # Final masters — UPLOAD THIS
│ ├── 01-track.wav
│ └── ...
└── mastering_samples/ # Operator QA only — DO NOT UPLOAD
├── 01-track.aac.m4a # 128 kbps AAC for Bluetooth listening
├── 01-track.mono.wav # Mono fold-down sample
└── 01-track.MONO_FOLD.md # Per-band delta report + verdictTwo automated checks run here:
AirPods / car Bluetooth before release; compressed playback exposes warbly sibilance, lost sub-bass, and pumping that the full-resolution master hides.
stereo. A >6 dB drop in any band hard-fails the pipeline (phase cancellation). Listen to .mono.wav on a phone speaker or single Echo to confirm which elements disappear in mono playback.
Standalone tools (run independently of the full pipeline):
render_codec_preview(album_slug) # writes .aac.m4a files
mono_fold_check(album_slug) # writes .MONO_FOLD.md + .mono.wavRe-run cleanup (regenerable artifacts):
reset_mastering(album_slug, subfolders=["mastering_samples"], dry_run=False)Configurable thresholds live in tools/mastering/genre-presets.yaml under defaults: (mono_fold_band_drop_fail_db, etc.) — override per-user in ~/.bitwize-music/overrides/mastering-presets.yaml.
All mastering operations are available as MCP tools. Use these instead of running Python scripts via bash.
| MCP Tool | Purpose | |----------|---------| | analyze_audio | Measure LUFS, true peak, dynamic range | | qc_audio | Technical QC (mono, phase, clipping, clicks, silence, format, spectral) | | master_audio | Master tracks to target LUFS with EQ options | | master_with_reference | Match mastering to a reference track | | fix_dynamic_track | Fix tracks with extreme dynamic range | | master_album | End-to-end pipeline — all steps in one call | | render_codec_preview | Render 128 kbps AAC previews to mastering_samples/ | | mono_fold_check | Mono fold-down QC: per-band deltas, sample audio, MD report |
Suno outputs vary in loudness - some at -8 LUFS, some at -18 LUFS.
Master when:
Don't distribute until:
Test on:
Wrong:
bashpython3 "$PLUGIN_DIR/tools/mastering/analyze_tracks.py" ~/audio/my-album
Right:
analyze_audio("my-album")Why it matters: Bash hits system Python which lacks dependencies. MCP tools run inside the venv automatically.
Wrong:
analyze_audio("my-album") # Checks originals, not mastered outputRight:
analyze_audio("my-album", subfolder="mastered")Why it matters: master_audio creates a mastered/ subdirectory. Verify that output, not the originals.
Wrong:
master_audio("my-album", cut_highmid=-3.0) # Writes files immediatelyRight:
master_audio("my-album", cut_highmid=-3.0, dry_run=True) # Preview first
master_audio("my-album", cut_highmid=-3.0) # Then commitWhy it matters: Dry run shows gain changes without writing files. Catches bad settings before they hit disk.
After all tracks mastered and verified:
markdown## Mastering Complete - Ready for Release **Album**: [Album Name] **Mastered Files Location**: [path to mastered/ directory] **Track Count**: [N] **Mastering Report**: - All tracks: -14.0 LUFS ± 0.5 dB ✓ - True peak: < -1.0 dBTP on all tracks ✓ - Album consistency: [X] dB range (< 1 dB) ✓ - No clipping or distortion ✓ **Next Step**: release-director can begin pre-release QA
load_override("mastering-presets.yaml") at invocationYour deliverable: Mastered WAV files at consistent loudness, optimized for streaming (with user preferences applied) → release-director handles release workflow.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 12,007 | 3,591 | -70% | 1 | 1 | 0% | 2,140 | 4,444 | +108% | 0 | 0 | — |
case-01 | fail→fail | 4,631 | 6,686 | +44% | 1 | 1 | 0% | 670 | 4,501 | +572% | 0 | 0 | — |
case-02 | fail→fail | 18,149 | 8,146 | -55% | 1 | 1 | 0% | 3,313 | 4,582 | +38% | 0 | 0 | — |
case-03 | fail→fail | 11,199 | 19,298 | +72% | 1 | 1 | 0% | 2,116 | 4,659 | +120% | 0 | 0 | — |
case-04 | fail→pass | 13,426 | 5,444 | -59% | 1 | 1 | 0% | 2,133 | 4,807 | +125% | 0 | 0 | — |
case-05 | fail→pass | 10,369 | 4,395 | -58% | 1 | 1 | 0% | 1,961 | 4,738 | +142% | 0 | 0 | — |
case-06 | fail→pass | 17,579 | 4,326 | -75% | 1 | 1 | 0% | 2,694 | 4,642 | +72% | 0 | 0 | — |
case-07 | pass→fail | 13,195 | 6,531 | -51% | 1 | 1 | 0% | 2,265 | 4,357 | +92% | 0 | 0 | — |
case-09 | pass→pass | 5,673 | 2,925 | -48% | 1 | 1 | 0% | 898 | 4,474 | +398% | 0 | 0 | — |
case-10 | fail→pass | 16,290 | 10,091 | -38% | 1 | 1 | 0% | 2,487 | 5,873 | +136% | 0 | 0 | — |
case-11 | pass→pass | 12,122 | 8,773 | -28% | 1 | 1 | 0% | 1,954 | 4,803 | +146% | 0 | 0 | — |
case-12 | fail→pass | 4,240 | 2,650 | -38% | 1 | 1 | 0% | 622 | 4,415 | +610% | 0 | 0 | — |
case-13 | fail→pass | 8,585 | 2,314 | -73% | 1 | 1 | 0% | 1,352 | 4,362 | +223% | 0 | 0 | — |
case-14 | fail→pass | 6,541 | 3,210 | -51% | 1 | 1 | 0% | 928 | 4,578 | +393% | 0 | 0 | — |
case-15 | fail→pass | 12,025 | 4,485 | -63% | 1 | 1 | 0% | 1,897 | 4,756 | +151% | 0 | 0 | — |
case-16 | fail→pass | 17,588 | 3,410 | -81% | 1 | 1 | 0% | 2,935 | 4,624 | +58% | 0 | 0 | — |
case-17 | fail→pass | 9,248 | 4,523 | -51% | 1 | 1 | 0% | 1,496 | 4,806 | +221% | 0 | 0 | — |
case-18 | fail→pass | 11,636 | 6,391 | -45% | 1 | 1 | 0% | 1,792 | 5,231 | +192% | 0 | 0 | — |
case-19 | fail→pass | 6,725 | 2,695 | -60% | 1 | 1 | 0% | 1,081 | 4,500 | +316% | 0 | 0 | — |
case-20 | fail→pass | 7,891 | 5,521 | -30% | 1 | 1 | 0% | 1,270 | 4,946 | +289% | 0 | 0 | — |
case-21 | fail→pass | 13,077 | 2,747 | -79% | 1 | 1 | 0% | 2,237 | 4,409 | +97% | 0 | 0 | — |
case-22 | fail→pass | 11,437 | 5,684 | -50% | 1 | 1 | 0% | 1,926 | 4,950 | +157% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +68 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.