Nodes/ꘇ Genereti/ꘇ mod.sequence
ComfyUI Node

ꘇ mod.sequence

A 16-step melody you edit by typing digits

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ mod.sequence
  • clock
  • notes
  • image
◄pattern60 64 67 72 67 64 - 55 60 - 67 - 72 67 64 -►
◄division4►
◄gate0.55►
◄velocity0.65►
◄ratchet1►

ꘇ mod.sequence is the step sequencer of the Genereti audio family: a text box full of MIDI note numbers, a clock input, and a stream of note/gate/velocity events that drives a synth. If you want a melody in your ComfyUI workflow without training a model or loading somebody's ACE-Step checkpoint, this is the shortcut.

What it is

The mod.* nodes are a live Web Audio patching layer that runs in the browser, not in Comfy's Python graph - the naming is straight out of TouchDesigner (top.* textures, chop.* control signals, dat.* data, mod.* audio). A sequence node is a control generator: it emits note events, and a downstream mod.synth turns those into sound. Nothing here generates audio as a file; it plays.

The kicker is that melody is typed. mod.sequence takes a string of pitches and dashes, so a 16-step bassline fits on one line and you can diff it, copy it, and paste it between workflows.

How it works

The clock input comes from mod.transport, which gives the browser a BPM-and-meter timeline. The sequencer then walks your pattern: division sets how many steps land per beat (default 4 = sixteenth notes at the transport's tempo), and note timing is scheduled against the AudioContext clock rather than being driven by graph redraws - the pack schedules up to 120 ms ahead on a 25 ms timer precisely so UI hitches don't wreck your rhythm.

Pitches are raw MIDI numbers, 0–127, fractional allowed. A - (or .) is a rest. The default pattern is a little pentatonic noodle, 60 64 67 72 67 64 - 55 60 - 67 - 72 67 64 -, which is a decent thing to edit rather than start from scratch.

gate is the important listening parameter: it's how much of each step the note actually holds. At 0.55 you get a staccato pluck; push it near 0.9 and steps run into each other.

The inputs and outputs that matter

  • clock - GENERETI_AUDIO_CLOCK from mod.transport. Without it there's no musical position to sequence against.
  • pattern - the note string. Rests are -. Spaces or commas both work as separators.
  • division - 1 to 16, default 4. Higher = faster subdivision.
  • gate - 0.05 to 0.95, default 0.55. Note length within the step.
  • velocity - 0 to 1, default 0.65.

The single notes output is a GENERETI_CHOP block, not a bus - wire it into mod.synth or mod.drumkit's notes socket and nothing else. Its channels are note, gate, velocity and step. Gate is treated as on above 0.5 by the instruments, which is why fractional velocities are fine but fractional gates aren't really a thing.

One design consequence worth internalising: the CHOP output only reports the currently playing step while an instrument is actually consuming it through a running output. A sequencer with no reachable audio endpoint reports nothing interesting.

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 tab. requirements.txt is a single line (comfyui-frontend-package>=1.53.6) - no audio libraries, no model weights, no downloads. Comfy ≥ 0.38.2, Python ≥ 3.11, modern browser. There's a ready-made ꘇ-Modular-Audio workflow under Workflows → Genereti that wires transport → sequence → synth → gain → output, and opening it first will save you a lot of guessing.

Common issues

Silence. Two usual causes: no mod.output downstream with its Start button pressed (the graph never plays anything the browser hasn't been given permission to play), or a synth whose notes socket is unwired. The mod.* nodes return route descriptions on queue; they don't push PCM anywhere.

Your pattern does nothing. Check division and whether the clock is actually connected - the sequence has no internal tempo of its own. If a note refuses to sound, look at the transport: pausing stops instrument voices, and transport or pattern changes cancel pending notes, which can feel like a dropped beat when you're editing live.

Notes cut off unexpectedly. Changing the pattern keeps musical position, but seek, reset and loop discontinuities cancel pending notes. That's deliberate scheduling hygiene, not a bug - delay tails left over from mod.delay may still be decaying when you hit stop.

Finally: this pack is a solo alpha (Liuboto, MIT, v0.1.4) with the README's own warning - "super alpha, early classroom testing; back up your workflows before updating."

CategoryGenereti / Modular audio

Inputs (6)

NameTypeDefaultDescription
clockGENERETI_AUDIO_CLOCK—
patternSTRING60 64 67 72 67 64 - 55 60 - 67 - 72 67 64 -—
divisionINT41–16—
gateFLOAT0.550.05–0.95—
velocityFLOAT0.650–1—
ratchetoptINT11–8—

Outputs (2)

NameTypeDescription
notesGENERETI_CHOP—
imageIMAGE—