ꘇ mod.drumkit
A kick, a snare and a hi-hat with no samples to download
- notes
- audio
ꘇ mod.drumkit is a drum machine built from oscillators and noise rather than samples. Kick, snare, hi-hat, three knobs, and a notes input that fires it from a step sequencer. The point of the node is that it's procedural: there is nothing to download, nothing to place in a models folder, and nothing to license.
What it is
Genereti's mod.* family is a live Web Audio patching layer that runs in the browser tab rather than in Comfy's Python queue, wired with GENERETI_AUDIO_BUS cables and named after TouchDesigner's top/chop/dat/mod convention. This is the percussion voice of that rig, and it pairs with mod.drumsequence - the sequencer emits note events, the kit makes the sound.
Worth saying plainly: this is not a drum sampler, and the pack's docs are explicit that there's no sampler in scope yet. If you need realistic acoustic drums, a sample library is still the answer. For a synthetic four-on-the-floor under a synth patch, this is two nodes.
How it works
Each incoming note is a trigger, and three note numbers are mapped in the browser:
- Kick (36) - a sine oscillator whose frequency sweeps exponentially downward (roughly 150 Hz to 45 Hz, scaled by
tone). That pitch drop is the entire trick behind a synthesised kick drum. - Snare (38) - filtered noise plus a triangle body around 180 Hz.
- Hi-hat (42) - high-passed noise with a much shorter envelope, so it ticks rather than thumps.
Because it's synthesis, decay and tone do real work. decay is how long the hit rings; tone scales the pitch and filter frequencies of all three voices at once - below 1 gets you a fatter, lower kit, above 1 a tighter, brighter one.
Note events arrive from the notes socket, where gate counts as on above 0.5 and velocity is 0–1. The sequencing and lookahead scheduling (up to 120 ms on a 25 ms timer) live upstream in mod.drumsequence, so the kit itself stays dumb and sample-accurate.
The inputs and outputs that matter
notes-GENERETI_CHOPblock with note/gate/velocity channels. Wire it frommod.drumsequence.level- 0 to 1, default 0.4.decay- 0.03 to 2 seconds, default 0.18. Long decays on a hat turn a tick into a hiss.tone- 0.25 to 2, default 1.
One output: audio, a GENERETI_AUDIO_BUS. Run it into mod.gain (for pan and level), mod.filter, mod.delay, mod.mixer, and finally mod.output. The bus is a live browser route - it will not connect to any node expecting Comfy's AUDIO tensor, and a queued run hands you silent note data rather than a waveform.
The node also has an audition strip - Kick, Snare, Hat - which fires single hits. Handy for dialling in decay, but the buttons are labelled "Audition · requires mod.output Start" and they mean it.
Install
Manager → search Genereti, or from your ComfyUI directory:
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 page so the node schemas register. This is one of the lighter installs you'll do: requirements.txt is a single line (comfyui-frontend-package>=1.53.6), the rest of the stack is already in ComfyUI, and there are no model downloads and no separate model server. Comfy ≥ 0.38.2, Python ≥ 3.11. Open Workflows → Genereti → ꘇ-Modular-Audio for a working kit already wired to a sequencer and a clock.
Common issues
Queue does nothing. That's the design. Playback starts when you press ▷ on a mod.output with the kit somewhere upstream of it.
Hits are silent but the meter moves. Check level - the kit's own gain is scaled down internally, so level at 0 is a real mute, not just quiet. Then check mod.output's level, which the demos deliberately set very low (0.12–0.15).
Notes fire but nothing sounds. The kit only responds to its drum pitches. If your sequencer is emitting note 60s - i.e. a melody pattern from mod.sequence - the kit will mostly ignore it or pick the hat branch. Use mod.drumsequence, which maps rows to 36/38/42 for you.
Two drums on the same step. That works; simultaneous events are supported and covered by the pack's own unit tests. Don't add hacks to stagger them.
Timing gets sloppy in a background tab. Known: browser throttling can affect event lookahead. Also be aware that pausing the transport stops the voices but a mod.delay tail will still decay audibly. And as with anything in this pack - a solo alpha by Liuboto (MIT, v0.1.4) whose README says "super alpha, back up your workflows" - expect the interface to move between updates.
Inputs (44)
| Name | Type | Default | Description |
|---|---|---|---|
| notes | GENERETI_CHOP | — | |
| level | FLOAT | 0.400–1 | — |
| decay | FLOAT | 0.180.03–2 | — |
| tone | FLOAT | 1.000.25–2 | — |
| kick_levelopt | FLOAT | 0–1 | kick level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| kick_decayopt | FLOAT | 0.03–2 | kick decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| kick_toneopt | FLOAT | 0.25–2 | kick tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| kick_gateopt | FLOAT | 0–1 | kick gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| rim_levelopt | FLOAT | 0–1 | rim level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| rim_decayopt | FLOAT | 0.03–2 | rim decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| rim_toneopt | FLOAT | 0.25–2 | rim tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| rim_gateopt | FLOAT | 0–1 | rim gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| snare_levelopt | FLOAT | 0–1 | snare level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| snare_decayopt | FLOAT | 0.03–2 | snare decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| snare_toneopt | FLOAT | 0.25–2 | snare tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| snare_gateopt | FLOAT | 0–1 | snare gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| clap_levelopt | FLOAT | 0–1 | clap level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| clap_decayopt | FLOAT | 0.03–2 | clap decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| clap_toneopt | FLOAT | 0.25–2 | clap tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| clap_gateopt | FLOAT | 0–1 | clap gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomlo_levelopt | FLOAT | 0–1 | tomlo level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomlo_decayopt | FLOAT | 0.03–2 | tomlo decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomlo_toneopt | FLOAT | 0.25–2 | tomlo tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomlo_gateopt | FLOAT | 0–1 | tomlo gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| hat_levelopt | FLOAT | 0–1 | hat level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| hat_decayopt | FLOAT | 0.03–2 | hat decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| hat_toneopt | FLOAT | 0.25–2 | hat tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| hat_gateopt | FLOAT | 0–1 | hat gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomhi_levelopt | FLOAT | 0–1 | tomhi level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomhi_decayopt | FLOAT | 0.03–2 | tomhi decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomhi_toneopt | FLOAT | 0.25–2 | tomhi tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| tomhi_gateopt | FLOAT | 0–1 | tomhi gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| openhat_levelopt | FLOAT | 0–1 | openhat level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| openhat_decayopt | FLOAT | 0.03–2 | openhat decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| openhat_toneopt | FLOAT | 0.25–2 | openhat tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| openhat_gateopt | FLOAT | 0–1 | openhat gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| ride_levelopt | FLOAT | 0–1 | ride level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| ride_decayopt | FLOAT | 0.03–2 | ride decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| ride_toneopt | FLOAT | 0.25–2 | ride tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| ride_gateopt | FLOAT | 0–1 | ride gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
| cowbell_levelopt | FLOAT | 0–1 | cowbell level; disconnected uses the kit controls. Gate triggers on a rising edge. |
| cowbell_decayopt | FLOAT | 0.03–2 | cowbell decay; disconnected uses the kit controls. Gate triggers on a rising edge. |
| cowbell_toneopt | FLOAT | 0.25–2 | cowbell tone; disconnected uses the kit controls. Gate triggers on a rising edge. |
| cowbell_gateopt | FLOAT | 0–1 | cowbell gate; disconnected uses the kit controls. Gate triggers on a rising edge. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | GENERETI_AUDIO_BUS | — |