Separate Stems
Four stems and the leftover everyone else throws away
- audio
- model
- stems
- report
Separate Stems splits a finished song into vocals, drums, bass and other - the standard stem-separation move, the one every "just a demucs wrapper" node on the block does. What makes this one worth a look is the fifth thing it hands to the mixer: the residual. Not a leftover to be swept up, but a real strip, and the reason a neutral mix gives you your input back unchanged.
Where it sits
… Render (or Load Audio) ─► Separate Stems ─► Stem Mixer ─► Plenio · Master ─► Export
It's an optional block in all five Plenio templates, bypassed until you select it and press Ctrl+B. It sits before mastering on purpose: the master then hears your mix, not the raw render. In the templates the block is a collapsed subgraph - open it with the icon at the top right of the node to get at the mixer.
The mechanism, and the one idea that matters
The model is BS-RoFormer (527 MB, models/audio_separation), working at 44.1 kHz stereo with the checkpoint's own chunk size and crossfades between chunks; the node resamples your input in and the stems back out, so a 48 kHz render stays 48 kHz. A mono input is fed to the model twice rather than guessed at.
Then the part that isn't standard:
rest = input − (vocals + drums + bass + other)
A separation model yields at most four stems - room tone, reverb tails and everything it couldn't place would simply vanish, and your mix would sound like a cheaper version of the song. Plenio computes the difference explicitly and hands it over as a fifth strip. Which gets you the guarantee the whole block is built on: with every gain at 0 dB, nothing muted or soloed, no compression and no sends, Stem Mixer returns the input sample for sample. Separation errors can then only ever affect the stems you deliberately touched.
Inputs and outputs
- audio (required) - the song before mastering. Feed it the render, not the exported master.
- model (required) - the output of Load Audio Model with kind
separation. It's a required input, so this node can't run half-configured. - stems (output,
PLENIO_STEMS) - the four stems plus the residual, straight into Stem Mixer. - report (output) - the stem names and how much energy the residual holds, so you can see how much the model left behind.
Installing it
The pack first (Manager → Plenio Music Production System → install → restart, or clone it by hand):
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System
No Python packages - the MSST inference code is vendored in the repo, which is also why this doesn't drag a torchaudio pin into your environment and start a fight with anything else. The one file you need:
mkdir -p ComfyUI/models/audio_separation
# model_bs_roformer_ep_17_sdr_9.6568.ckpt (527 MB) → ComfyUI/models/audio_separation
The checkpoint carries its own config, so there's no second file and no YAML to fix. ComfyUI's missing-model dialog offers it when you switch the block on; Plenio downloads nothing itself.
Common issues
The wrong model was connected. Separate Stems asks Load Audio Model for a separation model by name. A super-resolution file gets refused with a message rather than run into a shape error - put UniverSR back in audio_sr and this file in audio_separation.
You changed the mixer and nothing re-ran. That's ComfyUI's cache working in your favour: the separation is cached, so tweaking gains is instant. If you want a fresh separation, change something on the audio side or bypass/refresh the node.
Quality isn't what you hoped. That's the checkpoint's, not the node's. The authors report MUSDB18-HQ SDR 9.66; Plenio hasn't re-measured it. Dense mixes with wide stereo vocals are the hard case, and "other" is by definition whatever didn't fit the three named stems.
The residual doesn't fix your mix, it preserves it. It keeps a neutral mix exact. Once you pull a fader, you're in normal stem-mixing territory - including the artefacts you just made audible.
Long songs cost VRAM. It's a real chunked inference run, not a preview. If a 5-minute track is struggling on a 16 GB card, work with a shorter excerpt first.
Like Refine, the block is labelled experimental: the contracts (neutral equals input, rate and length preserved) are covered by tests, but how the stems sound is waiting on the owner's listening check (L2). For what it's worth, that's a more precise definition of "experimental" than most packs manage - they told you exactly which half is unverified.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The song to split, before mastering (the residual keeps what the stems miss). | |
| model | PLENIO_AUDIO_MODEL | Load Audio Model (separation). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| stems | PLENIO_STEMS | The stems and the residual, for Stem Mixer. |
| report | PLENIO_REPORT | Stem names and how much the residual holds. |