ComfyUI Node

Stem Mixer

The mixer that only changes what you change

By jplenio·Created 29 days ago·Updated about 17 hours ago· 89
Stem Mixer
  • stems
  • audio
  • report
◄mix►

Stem Mixer puts the stems from Separate Stems back together with your own balance - a fader, mute/solo, a compression knob and two sends per strip, drawn as a channel strip under the node with the strip's waveform in it. Boring description. The interesting part is the contract: don't touch anything and you get your input back, sample for sample.

Why that matters more than the features

Every creative tool that reshapes audio has the same problem: it can only be as good as the model it wraps. Rebalance a song with a separation model and anything the model got wrong is now your mix's problem - a hat bleeding into the vocal strip, a bassline smeared across "other". Plenio's answer is that the residual comes along as a fifth strip called rest, so a neutral pass is mathematically the input. You only ever hear the separation's errors in the places you deliberately moved. That's a better deal than "trust the model", and it's the reason this node is worth using even if you're not chasing a remix.

The strip, feature by feature

Each strip - vocals, drums, bass, other, and rest - gets:

  • gain, −60 dB to +12 dB (bottomed out shows as -∞)
  • M / S, where solo beats mute: any solo silences every other strip, including the residual
  • compression, one knob 0 … 1 mapping to threshold −12 … −30 dB and ratio 1 … 6, with 10 ms attack, 120 ms release and no make-up gain - so it won't secretly get louder on you
  • reverb and delay sends into one shared bus each
  • muted time ranges: drag on the strip's waveform to mute a stretch, click a range to remove it. Muting fades in 10 ms, ranges merge and clip to the song, and the song keeps its length - cutting time out of the middle isn't offered, because it would misalign the stems
  • save: writes that strip as its own 24-bit FLAC

The buses are deterministic, which is the right call for something you'll re-run: reverb is convolution against a synthesised, seeded stereo impulse response (room 1.2 s, plate 1.6 s, hall 2.4 s), and delay is a stereo feedback delay with time in ms or a note value at 120 BPM.

Inputs and outputs

  • stems (required) - from Separate Stems.
  • mix (required, multiline string, default empty) - the settings as plenio.stem_mix/1 JSON. Empty means neutral. You'll normally never type in it: the widget under the node writes exactly the same value into this field, so there is one source of truth, not a widget setting plus a hidden JSON blob that disagree.
  • audio (output) - the mixdown at the input's rate and length, into Plenio · Master.
  • report (output) - per strip: whether it was audible, its gain, its gain reduction and muted time, plus any files written.

Two contracts to know: float64 inside, no normalisation ever (the mixer doesn't touch your loudness; Master does, afterwards), and effect tails get cut at the song end with a 50 ms fade.

The save switch

Flip it on a strip and the next run writes that stem to ComfyUI/output/plenio/stems/ as a 24-bit FLAC named after the stem - drums.flac. Run it again and you get drums (2).flac; nothing is overwritten. The file contains that strip's own signal: its gain, its compression and its muted ranges. Mute/solo decisions and the shared reverb/delay tails belong to the mixdown and don't go into the file. It's the clean way to hand a stem to someone else - or to keep a drum part you liked before the next take overwrites it.

Installing it

You need the pack and the separation checkpoint, nothing else:

cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System
mkdir -p ComfyUI/models/audio_separation
# model_bs_roformer_ep_17_sdr_9.6568.ckpt  (527 MB) → ComfyUI/models/audio_separation

Manager search is Plenio Music Production System; restart afterwards. No Python packages are installed - the stem separation inference code is vendored in the repo. The mixer itself needs no GPU time worth mentioning; the separation feeding it is the expensive half.

Common issues

"A send without its bus is refused." If you raise a reverb or delay send on a strip but the bus isn't configured, the node stops with a message instead of silently ignoring your send. The widget writes the documented default bus settings along with the first raise, so in practice this only bites hand-edited JSON.

The strips appear before the first run, with empty waveforms. Deliberate - you get vocals, drums, bass, other and rest up front so you can set the balance for the run you're about to start. The waveform fills in after a run (240 peak buckets per strip from the separation, not a live analyser).

The mixdown sounds quieter or louder than the render. At neutral settings it should be identical. If it isn't, check solo and mutes first: solo overrides mute, and a leftover solo on one strip silences everything else including rest.

It's experimental, and honestly labelled as such. The guarantees (neutral equals input, the solo/mute rules, range merging, deterministic buses, lengths and rates) are tested without the model. How the stems sound on real songs is waiting on the pack owner's listening check, so treat it as a tool you audition rather than one you trust blind. Same as Refine.

One last thing: reach for this when you actually need balance - vocal up a touch, drums down, a bar of bass dropped out. If what you want is a better-sounding song, that's the EQ and loudness half of the pack, and the mixer is not a substitute for it.

CategoryPlenio/Audio

Inputs (2)

NameTypeDefaultDescription
stemsPLENIO_STEMSThe stems and the residual 'rest' from Separate Stems.
mixSTRINGThe mixer settings (plenio.stem_mix/1 JSON); empty: neutral. The widget under the node writes the same value (a 'save' flag per strip included).

Outputs (2)

NameTypeDescription
audioAUDIOThe mixdown at the input's rate and length.
reportPLENIO_REPORTPer strip: audible, gain, gain reduction, muted time. Into Export Release: it also carries the strips marked 'save', which the export writes next to the song ('<name>-stems'; bass and vocals also as .mid).