A plugin for Slopsmith that turns multi-stem .sloppak songs into a live mixing board. Toggle guitar, bass, drums, vocals, piano, or "other" on the fly during playback, tweak each stem's volume, and the plugin remembers your mix per song.
PSARC songs are untouched — the plugin only activates when a song's song_info payload contains a non-empty stems[] array.
- Per-stem mute toggles injected into the player control bar
- Volume sliders — shift+click any stem button to open a volume popover
- Per-song memory — muted stems and volumes are saved to
localStoragekeyed by filename, so each song reopens with your last mix - Mute on load — pick which stems start silenced when a song opens (e.g. always start with vocals off)
- Karaoke mode — one-click preset that always mutes vocals by default
- Tight sync — stems slave their
currentTimeto the core<audio>element on play/seek events, with a 50 ms drift threshold correction - Inert on PSARC — core audio works normally when there are no stems to mix
cd /path/to/slopsmith/plugins
git clone https://github.com/topkoa/slopsmith-plugin-stems.git stems
docker compose restart- Convert a PSARC to a
.sloppakwith the Sloppak Converter plugin (which runs Demucs to split the single mixed track into per-instrument stems), or hand-craft a sloppak directory with multiple stems listed inmanifest.yaml. - Play the song. The stem mixer bar appears in
#player-controlswith one labeled button per stem. - Click a stem to toggle it on/off. Shift+click to adjust its volume.
- Your mute state and volumes are remembered the next time you open the same song.
Open Settings → Stems Toggle to configure:
- Karaoke mode — start every new song with vocals muted
- Mute on load — tick the stems that should default to off (e.g. vocals + piano for a guitar practice preset)
Per-song toggles always override defaults.
The plugin wraps the core <audio id="audio"> element as a silent timing master. For each stem in the song's manifest it:
- Creates a new
<audio>element pointed at the stem URL - Wires it through a
MediaElementAudioSourceNode→GainNode→AudioContext.destination - Hooks the core audio's
play/pause/seeking/ratechangeevents to fan out to every stem - Corrects any drift > 50 ms on
playevents by snapping the stem back tocore.currentTime
Toggling a stem is a pure GainNode.gain.value change — no element pause/unpause, no glitching. Teardown restores the core <audio> element cleanly when you leave the player or load a non-sloppak song.
Requires Slopsmith with .sloppak format support and a song_info payload that includes a stems[] array (available on the feature/sloppak-format branch and its merged descendants).
- Sloppak Converter — convert PSARCs into
.sloppakfiles in-app, with optional Demucs stem splitting
MIT