Audio Reactive
Audio Reactive — turn your track's kick drum into video parameters
- audio
- video
- keyframes
This is the node that makes your video visibly dance. Audio Reactive listens to a track, measures its energy in a chosen frequency band, and spits out keyframes - time-stamped values you can drive into video FX parameters. Bass thump, glow pulses with the kick, scale bounces on the snare: that's this stage's whole job, and it does it without any AI, just a band-passed envelope detector.
The controls are the important part, so here's the short list of what to touch:
- band - pick
bass(20–160 Hz),mid(160 Hz–2 kHz),high(2–8 kHz),full, orcustom. Bass is the classic reactive band; it's where the kick lives. - freq_lo / freq_hi - only used when band is
custom. Set the exact range if you want, say, just the kick at 50–80 Hz. - attack / release - how fast the envelope reacts. Snappy attack (0.01–0.02s) for punchy hits; longer release (0.2–0.3s) so values ease back down instead of slamming to zero between beats.
- rate - the keyframe sample rate in Hz (default 10), how often values are written.
- min_value / max_value / gain - map the raw envelope into your target range. If the video parameter wants 0–1 and your track peaks hard, set max_value accordingly.
- field - which parameter the keyframes target:
v(volume/level),scale,opacity,x,y, orrotation.
The output is a single COMFYTV_TEXT keyframes payload - that's data, not audio, so this node terminates the audio path and hands values to whatever video stage you wire it into. You feed it audio or video (it reads the video's soundtrack), and you get automation back.
The mechanism: a band envelope is computed over the whole track with attack/release smoothing, sampled at rate, then mapped through min/max/gain and written as keyframes. It's cheap and deterministic - no GPU, instant re-runs, and because it's a ComfyTV stage it re-runs on its own without dragging the generation chain along.
Where people get burned: if you map the envelope into a parameter range that's too wide (min_value/max_value far apart) with a low release, the motion looks like seizure footage instead of music. Start with a small range, then widen it. Also, remember the output is keyframes, not audio - don't wire it into a Mix or a player expecting sound. If you want a visible meter burned into the picture instead of parameters, the companion Audio Meter Overlay (AudioMeterStage) is the sibling node for that job.
Install is the pack-wide story: ComfyUI Manager → "ComfyTV", or git clone https://github.com/jtydhr88/ComfyTV into custom_nodes/, then a full backend restart. On Desktop/macOS with multiple ComfyUI installs, use the running instance's absolute path or the pack silently won't register. Zero extra pip dependencies, no models, works on CPU.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| band | COMBO | bass | 5 options: bass, mid, high, full, custom |
| freq_lo | FLOAT | 4010–16000 | — |
| freq_hi | FLOAT | 20020–16000 | — |
| attack | FLOAT | 0.0200.001–1 | — |
| release | FLOAT | 0.250.01–2 | — |
| rate | FLOAT | 101–60 | — |
| min_value | FLOAT | 0.00-1000–1000 | — |
| max_value | FLOAT | 1.00-1000–1000 | — |
| gain | FLOAT | 1.000.1–8 | — |
| field | COMBO | v | 6 options: v, scale, opacity, x, y, rotation |
| audioopt | COMFYTV_AUDIO | — | |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| keyframes | COMFYTV_TEXT | — |