Nodes/ꘇ Genereti/ꘇ mod.mixer
ComfyUI Node

ꘇ mod.mixer

Four buses, solo buttons, one master

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ mod.mixer
  • input_1
  • input_2
  • input_3
  • input_4
  • input_5
  • input_6
  • input_7
  • input_8
  • audio
◄level_10.70►
◄pan_10.00►
◄mute_1false►
◄solo_1false►
◄level_20.70►
◄pan_20.00►
◄mute_2false►
◄solo_2false►
◄level_30.70►
◄pan_30.00►
◄mute_3false►
◄solo_3false►
◄level_40.70►
◄pan_40.00►
◄mute_4false►
◄solo_4false►
◄level_50.70►
◄pan_50.00►
◄mute_5false►
◄solo_5false►
◄level_60.70►
◄pan_60.00►
◄mute_6false►
◄solo_6false►
◄level_70.70►
◄pan_70.00►
◄mute_7false►
◄solo_7false►
◄level_80.70►
◄pan_80.00►
◄mute_8false►
◄solo_8false►
◄master0.70►

ꘇ mod.mixer is a four-channel mixer: per-channel level, pan, mute and solo, plus one master fader. It's the node you reach for once a patch has more than two sound sources and you're tired of balancing them by hand-editing every gain node.

What it is

Genereti's mod.* family is a live Web Audio patching layer that runs in the browser tab, not in Comfy's Python queue. GENERETI_AUDIO_BUS cables carry routes between browser-native audio nodes, and the whole pack is named after TouchDesigner's top/chop/dat convention - so if you've built audio-reactive patches in TouchDesigner and wished you could do it next to your image graph, this is the shape you'd expect.

The practical difference between the mixer and chaining mod.gain nodes: solo. Auditioning a drum layer against a synth is the single most common thing you do while building a patch, and doing it by muting three other gain nodes is friction.

How it works

Each of the four inputs gets its own gain → stereo panner pair, and all four feed the module's single output. Parameter changes ramp over about 15 ms instead of stepping, so dragging a fader while audio runs doesn't click.

The solo logic is the part worth understanding, because it's implemented the way a hardware desk behaves: if any channel's solo is on, every channel that isn't soloed gets its gain forced to zero - including channels that are already muted, and regardless of their level. Multiple solos therefore stack: solo 1 and 3 and you hear both. Turn them all off and the normal levels come back. This is verified by the pack's own unit tests for mixer mute/solo, so it's the intended reading rather than an accident.

master is applied after the per-channel summing, so it's a global trim - the place to set safe listening level across the whole patch rather than the place to fix one loud channel. Note it's 0 to 1, not 0 to 2: unlike mod.gain, master can't boost.

The inputs and outputs that matter

Four optional bus inputs - input_1 through input_4 - each with its own level_n (0–2, default 0.7), pan_n (−1 to 1, default 0), mute_n and solo_n booleans. Then master, 0 to 1, default 0.7.

Every input is optional, so a two-source patch just leaves the other two empty; nothing errors. Typical use: mod.synth into input 1 through a mod.filter, mod.drumkit into input 2, two more effects or instruments on 3 and 4.

One output, audio, feeding mod.output (and from there, your speakers after you press Start). Don't expect a separate bus per channel - the mixer is a summing point by definition.

Why four and not eight? Nothing in the docs suggests a reason beyond scope. If you need more, chain two mixers: mixer one's output into mixer two's input_1, and use the second mixer's master as the final trim. The browser reuses the same shared AudioContext, so this doesn't spawn a second audio engine.

Install

Manager, search Genereti - or:

git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt

Restart ComfyUI, then refresh the browser page so the schemas register. No models and no heavy libraries: requirements.txt is a single line (comfyui-frontend-package>=1.53.6), and the audio family needs nothing else. Comfy ≥ 0.38.2, Python ≥ 3.11, modern browser. The ꘇ-Modular-Audio workflow under Workflows → Genereti shows the intended wiring, including mod.output's deliberately low level.

Common issues

No sound at all. The mixer is not an output. Nothing plays until mod.output's Start button is pressed; that's the browser's user-gesture rule, and it applies to every node in this family. Queueing returns a route description rather than audio, so a "queue and listen" loop will never work here.

Solo leaves one channel audible when it shouldn't. Check for a second path: if a source reaches an output without passing through the mixer, solo can't mute it. The graph only builds modules reachable from an output, and it happily builds two parallel chains.

Everything is quiet. You're probably fighting two gains - the instrument's own level, the channel's level_n, then master, then mod.output's level. The bundled demos set output levels around 0.12–0.15 for a reason; if you've raised everything else, drop the source level rather than cranking master, which caps at 1 anyway.

Fader drags click or pop. They shouldn't - parameters ramp. If you hear hard jumps, you're probably changing instrument parameters (cutoff, envelope) rather than mixer values, and those apply per-voice.

A channel keeps playing after you disconnect it. It shouldn't: modules unreachable from an output are disposed. If sound persists, look for a started mod.delay upstream whose tail is still decaying - the docs flag that specific case.

As always with this pack: solo MIT alpha by Liuboto, v0.1.4, README's own words "super alpha - early classroom testing", with a warning to back up workflows before updating.

CategoryGenereti / Modular audio

Inputs (41)

NameTypeDefaultDescription
level_1FLOAT0.700–2—
pan_1FLOAT0.00-1–1—
mute_1BOOLEANfalse—
solo_1BOOLEANfalse—
level_2FLOAT0.700–2—
pan_2FLOAT0.00-1–1—
mute_2BOOLEANfalse—
solo_2BOOLEANfalse—
level_3FLOAT0.700–2—
pan_3FLOAT0.00-1–1—
mute_3BOOLEANfalse—
solo_3BOOLEANfalse—
level_4FLOAT0.700–2—
pan_4FLOAT0.00-1–1—
mute_4BOOLEANfalse—
solo_4BOOLEANfalse—
level_5FLOAT0.700–2—
pan_5FLOAT0.00-1–1—
mute_5BOOLEANfalse—
solo_5BOOLEANfalse—
level_6FLOAT0.700–2—
pan_6FLOAT0.00-1–1—
mute_6BOOLEANfalse—
solo_6BOOLEANfalse—
level_7FLOAT0.700–2—
pan_7FLOAT0.00-1–1—
mute_7BOOLEANfalse—
solo_7BOOLEANfalse—
level_8FLOAT0.700–2—
pan_8FLOAT0.00-1–1—
mute_8BOOLEANfalse—
solo_8BOOLEANfalse—
masterFLOAT0.700–1—
input_1optGENERETI_AUDIO_BUS—
input_2optGENERETI_AUDIO_BUS—
input_3optGENERETI_AUDIO_BUS—
input_4optGENERETI_AUDIO_BUS—
input_5optGENERETI_AUDIO_BUS—
input_6optGENERETI_AUDIO_BUS—
input_7optGENERETI_AUDIO_BUS—
input_8optGENERETI_AUDIO_BUS—

Outputs (1)

NameTypeDescription
audioGENERETI_AUDIO_BUS—