ꘇ chop.sequencer
Type a melody as text, get control channels out
- notes
- value
The whiff of TouchDesigner in this pack is strongest here: a text field, some numbers, and a melody comes out the other side. chop.sequencer takes a space-separated list of MIDI pitches and steps through it, emitting note, gate, velocity and a step channel as it goes. Wire it into chop.synth, mod.synth, or anything that consumes a GENERETI_CHOP, and you have a pattern you can also use to drive visuals.
Genereti (languel/genereti, by Liuboto, MIT) is a realtime performance layer for ComfyUI rather than an image generator - think TOP/CHOP/DAT operators plus browser Web Audio, a timeline, and optional MediaPipe perception. The sequencer is one of the "musical control" nodes.
How the stepping works
The math is refreshingly plain. Take the current time, add your time offset, multiply by bpm/60 × division and you get a continuous phase. Floor it and you have the step index; the pitch is pitches[step % len(pitches)]. The gate is on while the phase's fractional part is under gate, so gate behaves like note length - 0.5 means the note occupies half the step. Velocity is zero unless the gate is up.
Rests are the - or . token. A rest becomes pitch -1, which is clamped to note 0 on output with the gate off, so a rest is silence rather than a note at C-1. At least one token is required - up to 256 - and pitches must be 0–127 or the node raises. Commas work as separators too, which is handy if you're pasting from somewhere else.
Note that the sequence is a loop, not a one-shot: there's no "play once and stop" here, and no swing. If you want swing, or per-row drum patterns, that's the Web Audio mod.* side of the pack rather than this classic CHOP family.
Inputs and outputs worth setting
The ones you'll actually touch: notes (the text pattern, default 60 64 67 72 67 64 - 60 - a little major arpeggio), bpm (120), division (steps per beat, default 2), gate (0.5), velocity (0.7). samples (1), sample_rate (60) and time (0) are the evaluation window: how many samples, at what control rate, starting when. Leave them at defaults for live use - one sample per tick.
Outputs are the same pair as the rest of the family: notes as a GENERETI_CHOP with the channel block, and value as a plain FLOAT. value is the last sample of the first channel, which in practice is where the pattern ended up at that moment - useful for shoving a number into a normal Comfy parameter, less useful as an event.
The notes string widget is a multiline field with the pack's own editor styling, so you can format the pattern across lines without breaking it; whitespace is the separator, and newlines count as whitespace.
Install
ComfyUI Manager → search "Genereti" → install ꘇ Genereti → restart → refresh the browser. Git route:
git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
Only comfyui-frontend-package>=1.53.6 is pinned; ComfyUI itself provides torch/numpy/Pillow. Targets ComfyUI 0.38.2+, Python 3.11+, and a browser with WebGPU for the live paths. Bundled examples show up under Workflows → Genereti; open ꘇ-Modular-Audio if you want a working patch to poke at.
Gotchas
Queue never makes sound. The sequencer evaluates its pattern for whatever time it's handed and passes the channels through; audio only starts when you press Start on an endpoint (chop.synth, chop.drumkit, mod.output). The pause control on this node pauses the browser-side control generation, which is not the same thing.
Second: this is not sample-accurate sequencing, and the pack says so. Pattern output is a control-rate signal - the docs describe a 25 Hz control update with roughly 120 ms of Web Audio scheduling lookahead on the modular side. If you're chasing tight rhythmic accuracy, that's where the timing actually gets scheduled; treat the CHOP values as control data.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| notes | STRING | 60 64 67 72 67 64 - 60 | — |
| bpm | FLOAT | 120.001–400 | — |
| division | INT | 21–16 | — |
| gate | FLOAT | 0.500.01–0.99 | — |
| velocity | FLOAT | 0.700–1 | — |
| samples | INT | 11–4096 | — |
| sample_rate | FLOAT | 60.001–1000 | — |
| time | FLOAT | 0.000–100000 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| notes | GENERETI_CHOP | — |
| value | FLOAT | — |