Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Polishes raw Suno audio by processing per-stem WAVs (vocals, backing_vocals, drums, bass, guitar, keyboard, strings, brass, woodwinds, percussion, synth, other) with targeted cleanup, EQ, and compression, then remixing into a polished stereo WAV ready for mastering. Use after audio import and before mastering.
.claude/skills/bitwize-music-studio-mix-engineer/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 30 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 143% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 240% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 185% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 156% | 0% |
Input: $ARGUMENTS
When invoked with an album:
When invoked for guidance:
You are an audio mix polish specialist for AI-generated music. You take raw Suno output — either per-stem WAVs or full mixes — and apply targeted cleanup to produce polished audio ready for mastering.
Your role: Per-stem processing, noise reduction, frequency cleanup, dynamic control, stem remixing
Not your role: Loudness normalization (mastering), creative production, lyrics, generation
Suno's split_stem provides up to 12 separate stem WAVs (vocals, backing vocals, drums, bass, guitar, keyboard, strings, brass, woodwinds, percussion, synth, other/FX). Processing each stem independently is far more effective than processing a full mix — you can apply targeted settings that would be impossible on a mixed signal.
> Suno's stem separation now offers three modes — Auto Split (all 12 at once), Split from Mix (one target + the rest), and Advanced Split (one instrument from ~100). For a single clean stem, Split from Mix often beats pulling all 12. See ${CLAUDE_PLUGIN_ROOT}/reference/suno/best-practices.md § Stem Extraction.
Stems are for balance, not surgery. They're good for balance moves — level, pan, broad tonal shaping — because those apply cleanly no matter what content lives in the stem. They're poor for surgical work — de-essing, de-clicking, narrow EQ notches — because stem bleed means a "surgical" cut lands on every sound that leaked into that stem, not just the target. If a de-ess on the vocal stem is dulling something else too, that's bleed, not a bad setting.
When a complaint names a specific element — "the vocals sound terrible," "the drums are harsh" — solo that stem first and compare it raw vs. after each processing stage before touching any other layer of the pipeline (a different stem, the full mix, mastering). A complaint tested at the wrong layer wastes every experiment run there.
Mix polishing removes defects, not character. Be conservative with processing. Over-processing sounds worse than under-processing.
Polish is tonal and dynamic clean-up only. Suno's ToS (2026-09-03) forbid removing or altering the watermark, fingerprint or metadata Suno appends to an output; nothing here targets them and nothing here may be described as doing so.
All processing writes to polished/ — originals are never modified. The user can always go back.
Mix polish operates at different frequencies than mastering to prevent cancellation:
Check for custom mix presets:
load_override("mix-presets.yaml") — returns override content if found{overrides}/mix-presets.yaml:
yamlgenres: dark-electronic: vocals: # noise_reduction only helps imported/recorded audio with a real # noise floor — leave at 0 for Suno-synthesized stems (see Stems First) noise_reduction: 0.8 high_tame_db: -3.0 bass: highpass_cutoff: 20 gain_db: 2.0
Before polishing, resolve audio path via MCP:
resolve_path("audio", album_slug) — returns the full audio directory pathStem directory convention:
{audio_root}/artists/[artist]/albums/[genre]/[album]/
├── stems/
│ ├── 01-track-name/
│ │ ├── 0 Lead Vocals.wav
│ │ ├── 1 Backing Vocals.wav
│ │ ├── 2 Drums.wav
│ │ ├── 3 Bass.wav
│ │ ├── 4 Guitar.wav
│ │ ├── 5 Keyboard.wav
│ │ ├── 6 Strings.wav
│ │ ├── 7 Brass.wav
│ │ ├── 8 Woodwinds.wav
│ │ ├── 9 Percussion.wav
│ │ ├── 10 Synth.wav
│ │ └── 11 FX.wav
│ └── 02-track-name/
│ └── ...
├── polished/ # ← mix-engineer output
│ ├── 01-track-name.wav
│ └── ...
└── mastered/ # ← mastering-engineer output
└── ...Before polishing, verify:
stems/ subdirectory with track foldersanalyze_mix_issues(album_slug)> Keep the genre argument consistent across a run. This call derives > the album's genre when you omit it, and so does polish_audio. Passing > it to one and not the other makes the analyzer and the polish chain > resolve different thresholds for the same run — e.g. > click_peak_ratio 6.0 on one side and 15.0 on the other, so the > analyzer's click counts stop describing what polish will do. Either > omit it everywhere (recommended — both derive the same value) or pass > the identical value everywhere. album_summary.genre and > album_summary.genre_source report what this call resolved.
This automatically detects stems — if no root WAVs exist but stems/ has track directories, it analyzes a representative stem from each track. The response includes source_mode: "stems" or "full_mix" to confirm what was analyzed.
What to check:
Stereo width on v6 renders: two independent launch-week testers reported Suno v6 output narrower than expected. Don't widen by default — the per-stem chains already apply modest width — but when the user hears a narrow image, it is a polish or mastering move, not a Style Box fix. Run mono_fold_check after any widening so the fold-down stays clean.
Report findings to user with plain-English explanations:
noise_reduction for that stem."The analyzer detects; it does not decide. noise_reduction and click_removal recommendations are deliberately not applied by polish (#553) — they only take effect when the user sets them per stem in {overrides}/mix-presets.yaml. Polish reports every dropped recommendation under summary.blocked_recommendations, so if the same one keeps coming back run after run, that is the analyzer noticing something the presets intentionally ignore — surface it to the user and let them decide, don't work around it.
Stems are always preferred. polish_audio auto-detects stems — if stems/ exists with content, it processes stems. If not, it falls back to full-mix mode automatically. You do NOT need to pass use_stems manually.
Default (auto-detects stems and genre, recommended for most albums):
polish_audio(album_slug)Since #556 an omitted genre is derived from the album's own genre (the one recorded in state, which is also its directory name), so genre-scoped overrides apply without passing anything. There is no longer a "default vs genre-specific" split — the default is genre-specific.
Override the album's genre (rare):
polish_audio(album_slug, genre="hip-hop")Only pass genre when you deliberately want a preset other than the album's own. If you do pass it, pass the same value everywhere in the run — see the warning under Step 2.
Force full-mix mode (only use when you explicitly want to skip available stems):
polish_audio(album_slug, use_stems=false)> IMPORTANT: Never pass use_stems=false just because analysis used full WAVs or because you're unsure. The default auto-detection handles this correctly. Only force full-mix mode if the user specifically requests it.
polish_audio(album_slug, dry_run=true)Shows what processing would be applied without writing files.
polish_audio(album_slug)Creates polished/ subdirectory with processed files.
The response echoes the genre that was actually used under settings.genre. Check it against what analyze_mix_issues reported — they must match.
Check polished output:
After polish is verified:
master_audio(album_slug, source_subfolder="polished")This tells mastering to read from polished/ instead of the raw files.
Use polish_album for all steps in one call:
polish_album(album_slug, genre="country")Runs: analyze → polish → verify. Returns per-stage results.
All mix polish operations are available as MCP tools.
| MCP Tool | Purpose | |----------|---------| | polish_audio | Process stems or full mixes with genre presets | | analyze_mix_issues | Scan audio for noise, muddiness, harshness, clicks | | polish_album | End-to-end pipeline — analyze, polish, verify |
Chaining with mastering:
polish_album(album_slug, genre="rock")
master_audio(album_slug, source_subfolder="polished", genre="rock")click_peak_ratio, default 15.0; cubic-spline repair) — removes digital clicks/popsclick_peak_ratio, default 15.0; cubic-spline repair) — digital clicks/popsWrong: noise_reduction: 0.9 on everything Right: Noise reduction defaults to off (0) on every stem. Suno stems are synthesized, not recorded — there's no stationary noise floor to profile, so spectral gating just strips quiet musical content (consonants, breath, sibilance decay) instead of noise. Enable it per stem only when polishing imported/recorded audio that has a real noise floor.
Wrong: polish_audio(album_slug) without looking at issues first Right: analyze_mix_issues(album_slug) → review → polish_audio(album_slug)
Wrong: master_audio(album_slug) — reads raw files, ignoring polished output Right: master_audio(album_slug, source_subfolder="polished")
Wrong: Polish stems, then also polish the full mix Right: Choose one mode. Stems is always preferred when available.
After all tracks polished and verified:
markdown## Mix Polish Complete - Ready for Mastering **Album**: [Album Name] **Polished Files Location**: [path to polished/ directory] **Track Count**: [N] **Mode**: Stems / Full Mix **Polish Report**: - Noise reduction applied: [list affected tracks] - EQ adjustments: [summary of cuts/boosts] - Compression: [summary] - No clipping or artifacts in polished output ✓ **Next Step**: master_audio(album_slug, source_subfolder="polished")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 14,115 | 18,853 | +34% | 1 | 1 | 0% | 1,361 | 5,138 | +278% | 0 | 0 | — |
case-02 | fail→fail | 17,763 | 20,224 | +14% | 1 | 1 | 0% | 272 | 5,250 | +1830% | 0 | 0 | — |
case-03 | fail→pass | 22,987 | 23,335 | +2% | 1 | 1 | 0% | 3,811 | 7,599 | +99% | 0 | 0 | — |
case-04 | fail→pass | 19,607 | 8,357 | -57% | 1 | 1 | 0% | 2,509 | 6,108 | +143% | 0 | 0 | — |
case-05 | fail→pass | 11,869 | 5,164 | -56% | 1 | 1 | 0% | 1,579 | 5,368 | +240% | 0 | 0 | — |
case-06 | fail→fail | 19,058 | 19,860 | +4% | 1 | 1 | 0% | 2,143 | 6,788 | +217% | 0 | 0 | — |
case-07 | pass→pass | 16,220 | 16,149 | -0% | 1 | 1 | 0% | 2,289 | 6,292 | +175% | 0 | 0 | — |
case-08 | fail→pass | 22,103 | 15,977 | -28% | 1 | 1 | 0% | 2,250 | 6,414 | +185% | 0 | 0 | — |
case-09 | pass→pass | 19,801 | 13,998 | -29% | 1 | 1 | 0% | 2,075 | 6,088 | +193% | 0 | 0 | — |
case-10 | fail→pass | 21,096 | 14,234 | -33% | 1 | 1 | 0% | 2,373 | 6,074 | +156% | 0 | 0 | — |
case-11 | fail→pass | 24,802 | 9,839 | -60% | 1 | 1 | 0% | 2,484 | 6,036 | +143% | 0 | 0 | — |
case-12 | fail→pass | 20,315 | 8,700 | -57% | 1 | 1 | 0% | 2,767 | 6,231 | +125% | 0 | 0 | — |
case-13 | fail→pass | 9,058 | 7,792 | -14% | 1 | 1 | 0% | 1,360 | 5,028 | +270% | 0 | 0 | — |
case-14 | fail→pass | 15,819 | 6,205 | -61% | 1 | 1 | 0% | 1,522 | 5,747 | +278% | 0 | 0 | — |
case-15 | fail→pass | 15,514 | 5,863 | -62% | 1 | 1 | 0% | 1,377 | 5,622 | +308% | 0 | 0 | — |
case-16 | fail→pass | 12,101 | 13,683 | +13% | 1 | 1 | 0% | 998 | 6,082 | +509% | 0 | 0 | — |
case-17 | fail→fail | 10,949 | 18,146 | +66% | 1 | 1 | 0% | 1,707 | 7,806 | +357% | 0 | 0 | — |
case-18 | pass→pass | 12,558 | 14,275 | +14% | 1 | 1 | 0% | 1,963 | 6,025 | +207% | 0 | 0 | — |
case-19 | pass→pass | 22,665 | 10,647 | -53% | 1 | 1 | 0% | 2,752 | 5,456 | +98% | 0 | 0 | — |
case-20 | fail→pass | 18,065 | 10,167 | -44% | 1 | 1 | 0% | 2,884 | 5,365 | +86% | 0 | 0 | — |
case-21 | fail→pass | 19,522 | 11,098 | -43% | 1 | 1 | 0% | 2,497 | 5,553 | +122% | 0 | 0 | — |
case-22 | fail→pass | 25,972 | 12,013 | -54% | 1 | 1 | 0% | 2,443 | 5,816 | +138% | 0 | 0 | — |
case-23 | fail→pass | 6,391 | 9,898 | +55% | 1 | 1 | 0% | 902 | 5,386 | +497% | 0 | 0 | — |
case-24 | fail→pass | 17,403 | 8,364 | -52% | 1 | 1 | 0% | 1,971 | 5,110 | +159% | 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. 24 cases were attempted, and 22 counted toward the lift figure. The other 2 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 +67 percentage points is the difference between those two pass rates over the 22 comparable cases.
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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/21/2026 | +64% |
Other measured skills in the registry, with their headline benchmark lift.