Nodes/ComfyUI-Stem-Mixer/Audio Stem Mixer ๐ŸŽš๏ธ
ComfyUI Node

Audio Stem Mixer ๐ŸŽš๏ธ

A tiny DAW inside ComfyUI for mixing separated stems

By tritantยทCreated 4 months agoยทUpdated 3 months agoยท 3
Audio Stem Mixer ๐ŸŽš๏ธ
    • audio
    โ—„state[]โ–บ

    Audio is ComfyUI's unloved stepchild. You can generate a vocal stem, an instrumental, a drum line - but stitching them into one listenable track usually means exporting, firing up a real DAW, and going back and forth. AudioStemMixer from the ComfyUI-Stem-Mixer pack is a genuinely polished answer to that: a full multitrack mixer that lives inside the node graph, with faders, pan, mute/solo, a 3-band EQ per track, eight effects, VU meters, and a real-time waveform preview. You mix with your ears, hit Run, and get a standard AUDIO output ready to save. For a niche pack with no community lore behind it yet, the README is unusually professional - and the code backs it up.

    How it works

    Here's the mental-model shift that trips everyone up: the node has no audio input ports. You don't wire an audio-generating node into it. Instead, you load files inside the node - a ๐Ÿ“‚ Load button per track, or just drag and drop one or more WAV/FLAC/MP3/OGG/M4A/AIFF files straight onto it. They get copied into ComfyUI/input/stem_mixer/ and referenced by path in the workflow JSON.

    All that mixer state - tracks, gains, pan, EQ, loop region - lives in a single hidden state string widget that the frontend writes behind the scenes. Your fader tweaks are just edits to that JSON, which is why a saved workflow reopens with everything intact.

    When the workflow runs, mix() parses that state, loads each non-muted stem with torchaudio (forcing stereo and resampling everything to a common sample rate), then applies per-track EQ, the effects chain, gain, equal-power panning, and mute/solo logic - if any track is soloed, only the soloed ones contribute. Stems are padded to the longest and summed, the master fader is applied, and a soft-limiter catches peaks above 0.95 dBFS instead of hard-clipping. The preview you hear in the browser (a WaveSurfer UI) matches the rendered mix closely - the Python EQ even scales its gain by 0.7 to line up with the Web Audio preview.

    One detail worth knowing: the node hashes its state plus the mtime of every referenced file, so moving a fader or swapping a file on disk triggers a re-render. No stale mixes.

    Inputs and outputs

    The info_schema is delightfully small because the UI does the heavy lifting:

    • state (STRING, multiline, default []) - the only input, and you never touch it directly. It's the serialized mixer session the JS writes.
    • audio (AUDIO) - the mixed result, a standard ComfyUI AUDIO dict. Wire it into PreviewAudio to listen, SaveAudio to write a file, or any downstream audio node.

    That's it. The complexity is in the widget, not the ports.

    Installing it

    The painless part: there are no extra Python dependencies (torch and torchaudio already ship with ComfyUI) and no model downloads. Install via ComfyUI Manager (search "ComfyUI-Stem-Mixer"), or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/tritant/ComfyUI_Stem_Mixer
    

    Restart ComfyUI and you'll find Audio Stem Mixer ๐ŸŽš๏ธ under audio/mixer. That's the whole install story - a rare relief in a world of dependency hell.

    Where people get burned

    • The files don't travel with the workflow. Share the .json and the recipient opens an empty mixer, because the audio lives in their input/stem_mixer/ folder. You're sharing a recipe, not the ingredients.
    • Silence isn't a crash. If a referenced file is missing on execution, the node logs [StemMixer] Failed to load and skips it; if nothing loads, you get a silent audio output. Watch the console when a mix comes back empty.
    • It's load-from-disk only. If you hoped to wire in an in-memory AUDIO-producing node, you can't - pair this with anything that writes stems to disk instead.
    • Uploads are capped at 500 MB per file, and solo is exclusive (one soloed track at a time).

    Use it when you've already separated your stems and want to batch-render a mix without leaving ComfyUI. For that job, nothing else in the ecosystem does it half as well.

    Categoryaudio/mixer

    Inputs (1)

    NameTypeDefaultDescription
    stateSTRING[]โ€”

    Outputs (1)

    NameTypeDescription
    audioAUDIOโ€”