--- name: expocut-audio-post description: Mixes and post-produces audio in ExpoCut through the MCP server — on-device stem separation, vocal removal and isolation, sidechain music ducking under voice, beat-synced cuts detected from the drum stem, audio-reactive animation, dialogue cleanup, silence removal, and loudness targets for TikTok/Reels/Shorts. Use when the user mentions stems, karaoke, remove vocals, instrumental, duck the music, beat sync, cut on the beat, clean up audio, denoise, mix voice and music, LUFS/loudness, or wants a layer to pulse with the music. Do NOT use for generating a spoken voiceover or captions (use expocut-voice-narration). license: Free to use and redistribute with attribution to expocut.com. compatibility: Works standalone as guidance; becomes hands-on when paired with the ExpoCut in-app MCP server (private/loopback network only). metadata: author: ExpoCut (expotechin.com) version: "1.0.0" homepage: https://expocut.com/skill.html --- # Audio post-production You are the mix engineer. Everything below is non-destructive: stems, mixes and ducking live on layers and can be re-tuned at any time. ## Level targets (2026 platform numbers) - Voice sits around **-14 LUFS integrated**; true peak ≤ -1 dBTP. - Music under active speech: **18–25 dB below the voice** — that is what auto_duck's `duckDb: -18` means in practice (use -12 for light beds, -22 for dense music). - Platform masters: YouTube/Shorts and Reels ≈ -14 LUFS; TikTok runs hotter (≈ -10). Mix once at -14 and let TikTok's limiter do the rest. ## Ducking (one call, do this on every voice-over-music project) auto_duck { musicLayerId, vocalSourceLayerId, duckDb: -15 } It detects speech activity and writes volume keyframes with a fast attack and slow release, so the music breathes instead of pumping. Inspect or hand-tune afterwards with set_layer_volume_keyframes. ## Stems (separation unlocks everything) 1. separate_audio { layerId, tier: "fast" } — quick; use "studio" for final quality. 2. Then any of: - remove_vocals { layerId, tier } → instant instrumental / karaoke. - isolate_voice { layerId, boostDb: 6 } → talking-head dialogue on top. - set_stem_mix { sourceLayerId, mix: [ { stem:"drums", volume:1 }, { stem:"vocals", volume:0.25 } ] } - swap_music { sourceLayerId, includeDrums: false } → keep the vocal, replace the bed (copyright-safe re-scores). Trick worth offering: mute every stem except drums for one bar before the payoff — the "silence drop" — then slam everything back on the beat. ## Beat-synced editing 1. separate_audio { layerId: MUSIC, tier: "fast" } 2. beat_cut_from_drums { sourceLayerId: MUSIC, maxCuts: 8 } → returns cut times (ms). 3. Use them: split_layer { layerId: VIDEO, atSec } per cut, or align set_layer_transition / zoom-punch keyframes exactly on those times. Cut on downbeats; save the drop for the reveal. Text pops and punch-ins land ON the beat, never near it. ## Audio-reactive motion set_audio_reactive { targetLayerId, stemLayerId, stem: "bass", presetId: "bass-zoom-pulse", intensity: 1 } Binds a layer property to a stem's loudness envelope — titles that pulse with the bass, logos that kick with the drums. Separate first; point at the stem layer. ## Cleanup - clean_audio { layerId, strength } → on-device denoise / dialogue cleanup. - auto_remove_silence { layerId, thresholdDb, minSilenceMs, paddingMs } → tighten talking-heads. - set_layer_audio_effects { layerId, effects: [ { effectId, intensity } ] } — list_audio_effects for ids. ## SFX layering conventions Dialogue always on top. At most 2–3 ambience/SFX layers. Whoosh on transitions and zoom punches; a soft "pop" synced to every text overlay appearing; a riser into the payoff; one audio spike inside second 0–1 as part of the hook. ## Verify loop 1. list_layers → confirm stem layers / duck keyframes exist where expected. 2. play + playback_status around a spoken section — voice clearly on top? 3. If the mix pumps: re-run auto_duck with a smaller |duckDb| or thin the music with set_stem_mix.