Nodes/ꘇ Genereti/ꘇ mod.drumkit
ComfyUI Node

ꘇ mod.drumkit

A kick, a snare and a hi-hat with no samples to download

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ mod.drumkit
  • notes
  • audio
◄level0.40►
◄decay0.18►
◄tone1.00►
◄kick_level—►
◄kick_decay—►
◄kick_tone—►
◄kick_gate—►
◄rim_level—►
◄rim_decay—►
◄rim_tone—►
◄rim_gate—►
◄snare_level—►
◄snare_decay—►
◄snare_tone—►
◄snare_gate—►
◄clap_level—►
◄clap_decay—►
◄clap_tone—►
◄clap_gate—►
◄tomlo_level—►
◄tomlo_decay—►
◄tomlo_tone—►
◄tomlo_gate—►
◄hat_level—►
◄hat_decay—►
◄hat_tone—►
◄hat_gate—►
◄tomhi_level—►
◄tomhi_decay—►
◄tomhi_tone—►
◄tomhi_gate—►
◄openhat_level—►
◄openhat_decay—►
◄openhat_tone—►
◄openhat_gate—►
◄ride_level—►
◄ride_decay—►
◄ride_tone—►
◄ride_gate—►
◄cowbell_level—►
◄cowbell_decay—►
◄cowbell_tone—►
◄cowbell_gate—►

ꘇ 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_CHOP block with note/gate/velocity channels. Wire it from mod.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.

CategoryGenereti / Modular audio

Inputs (44)

NameTypeDefaultDescription
notesGENERETI_CHOP—
levelFLOAT0.400–1—
decayFLOAT0.180.03–2—
toneFLOAT1.000.25–2—
kick_leveloptFLOAT0–1kick level; disconnected uses the kit controls. Gate triggers on a rising edge.
kick_decayoptFLOAT0.03–2kick decay; disconnected uses the kit controls. Gate triggers on a rising edge.
kick_toneoptFLOAT0.25–2kick tone; disconnected uses the kit controls. Gate triggers on a rising edge.
kick_gateoptFLOAT0–1kick gate; disconnected uses the kit controls. Gate triggers on a rising edge.
rim_leveloptFLOAT0–1rim level; disconnected uses the kit controls. Gate triggers on a rising edge.
rim_decayoptFLOAT0.03–2rim decay; disconnected uses the kit controls. Gate triggers on a rising edge.
rim_toneoptFLOAT0.25–2rim tone; disconnected uses the kit controls. Gate triggers on a rising edge.
rim_gateoptFLOAT0–1rim gate; disconnected uses the kit controls. Gate triggers on a rising edge.
snare_leveloptFLOAT0–1snare level; disconnected uses the kit controls. Gate triggers on a rising edge.
snare_decayoptFLOAT0.03–2snare decay; disconnected uses the kit controls. Gate triggers on a rising edge.
snare_toneoptFLOAT0.25–2snare tone; disconnected uses the kit controls. Gate triggers on a rising edge.
snare_gateoptFLOAT0–1snare gate; disconnected uses the kit controls. Gate triggers on a rising edge.
clap_leveloptFLOAT0–1clap level; disconnected uses the kit controls. Gate triggers on a rising edge.
clap_decayoptFLOAT0.03–2clap decay; disconnected uses the kit controls. Gate triggers on a rising edge.
clap_toneoptFLOAT0.25–2clap tone; disconnected uses the kit controls. Gate triggers on a rising edge.
clap_gateoptFLOAT0–1clap gate; disconnected uses the kit controls. Gate triggers on a rising edge.
tomlo_leveloptFLOAT0–1tomlo level; disconnected uses the kit controls. Gate triggers on a rising edge.
tomlo_decayoptFLOAT0.03–2tomlo decay; disconnected uses the kit controls. Gate triggers on a rising edge.
tomlo_toneoptFLOAT0.25–2tomlo tone; disconnected uses the kit controls. Gate triggers on a rising edge.
tomlo_gateoptFLOAT0–1tomlo gate; disconnected uses the kit controls. Gate triggers on a rising edge.
hat_leveloptFLOAT0–1hat level; disconnected uses the kit controls. Gate triggers on a rising edge.
hat_decayoptFLOAT0.03–2hat decay; disconnected uses the kit controls. Gate triggers on a rising edge.
hat_toneoptFLOAT0.25–2hat tone; disconnected uses the kit controls. Gate triggers on a rising edge.
hat_gateoptFLOAT0–1hat gate; disconnected uses the kit controls. Gate triggers on a rising edge.
tomhi_leveloptFLOAT0–1tomhi level; disconnected uses the kit controls. Gate triggers on a rising edge.
tomhi_decayoptFLOAT0.03–2tomhi decay; disconnected uses the kit controls. Gate triggers on a rising edge.
tomhi_toneoptFLOAT0.25–2tomhi tone; disconnected uses the kit controls. Gate triggers on a rising edge.
tomhi_gateoptFLOAT0–1tomhi gate; disconnected uses the kit controls. Gate triggers on a rising edge.
openhat_leveloptFLOAT0–1openhat level; disconnected uses the kit controls. Gate triggers on a rising edge.
openhat_decayoptFLOAT0.03–2openhat decay; disconnected uses the kit controls. Gate triggers on a rising edge.
openhat_toneoptFLOAT0.25–2openhat tone; disconnected uses the kit controls. Gate triggers on a rising edge.
openhat_gateoptFLOAT0–1openhat gate; disconnected uses the kit controls. Gate triggers on a rising edge.
ride_leveloptFLOAT0–1ride level; disconnected uses the kit controls. Gate triggers on a rising edge.
ride_decayoptFLOAT0.03–2ride decay; disconnected uses the kit controls. Gate triggers on a rising edge.
ride_toneoptFLOAT0.25–2ride tone; disconnected uses the kit controls. Gate triggers on a rising edge.
ride_gateoptFLOAT0–1ride gate; disconnected uses the kit controls. Gate triggers on a rising edge.
cowbell_leveloptFLOAT0–1cowbell level; disconnected uses the kit controls. Gate triggers on a rising edge.
cowbell_decayoptFLOAT0.03–2cowbell decay; disconnected uses the kit controls. Gate triggers on a rising edge.
cowbell_toneoptFLOAT0.25–2cowbell tone; disconnected uses the kit controls. Gate triggers on a rising edge.
cowbell_gateoptFLOAT0–1cowbell gate; disconnected uses the kit controls. Gate triggers on a rising edge.

Outputs (1)

NameTypeDescription
audioGENERETI_AUDIO_BUS—