Nodes/ComfyUI_Fill-Nodes/FL Audio Reactive Scale
ComfyUI Node

FL Audio Reactive Scale

Make your frames pulse and zoom in time with the music

By filliptm·Created 3 years ago·Updated about 22 hours ago· 630
FL Audio Reactive Scale
  • frames
  • mask
  • frames
envelope_json
base_scale1.00
scale_intensity0.20
interpolationbilinear
maintain_aspecttrue

That satisfying "punch in on every kick drum" effect you see in music-visualizer edits? This is the node that does it. FL_Audio_Reactive_Scale takes a batch of frames and an audio envelope, and scales each frame up and down over time so the image breathes with the beat. Zoom in when the bass hits, settle back between hits. It's one of the more immediately fun nodes in Fill-Nodes' audio-reactive suite because the result is obvious the moment you preview it.

The key thing to understand is that it doesn't listen to audio itself - it reads an envelope, a per-frame curve of "how loud/active is the audio right now." You generate that envelope upstream (from drum detection, typically) and this node just maps its values onto zoom amounts. That separation is deliberate: the same envelope can drive scale, brightness, saturation, edge glow, and speed nodes all at once, so everything pulses together in sync.

How it works

For each frame, the node looks up the matching envelope value, turns it into a scale factor around your base scale, and resizes the frame by that amount. Because zooming changes dimensions, it center-crops or pads back to the original size so the output batch stays uniform. A quiet moment sits at base scale; a loud transient pushes the zoom out (or in) by up to your intensity setting. String those per-frame scales together across the batch and you get motion locked to the sound.

The inputs and outputs that matter

Two required inputs:

  • frames (IMAGE) - the image batch to animate. Your generated video frames.
  • envelope_json (STRING) - the per-frame audio curve, as JSON. This comes from FL_Audio_Reactive_Envelope, which builds ADSR envelopes from detected kicks, snares, and hi-hats.

The optional inputs are where you dial in the feel:

  • scale_intensity (FLOAT, default 0.2) - how hard it pulses. This is the knob you'll actually move. 0.2 is a gentle throb; crank it for aggressive punch-ins.
  • base_scale (FLOAT, default 1.0) - the resting zoom the pulse happens around.
  • interpolation (bilinear / bicubic / nearest) and maintain_aspect (default true) - resampling quality and whether to keep proportions. There's also an optional mask (IMAGE) to confine the effect.

Output is frames (IMAGE) - the scaled batch, ready for your video save node.

When you'd reach for it

Music videos, audio visualizers, any clip where you want the visuals to feel driven by the track rather than just laid over it. It shines stacked with its siblings - reactive brightness and saturation on the same envelope - so the whole frame reacts as one.

Installing it

ComfyUI ManagerComfyUI_Fill-Nodes → install → restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes

then restart. It's part of the audio suite, so the pack's audio dependencies (librosa/torchaudio) come along on first launch.

Common issues & troubleshooting

The envelope has to match the frames. envelope_json is a per-frame curve; if it was built for a different frame count than the batch you're feeding, the pulse will drift out of sync or run out early. Generate the envelope for the same clip length you're animating.

No motion at all. Either scale_intensity is at zero, or the envelope_json is empty/malformed. Confirm the upstream envelope node actually produced values - feed it real drum detection, not silence.

Edges creeping in on zoom-out. When it scales below base and pads, you can see the frame border. Bias your base scale slightly above 1.0 so the pulse mostly zooms in from a padded baseline, or keep intensity modest.

Category🏵️Fill Nodes/Audio

Inputs (7)

NameTypeDefaultDescription
framesIMAGE
envelope_jsonSTRING
maskoptIMAGE
base_scaleoptFLOAT1.000.1–5
scale_intensityoptFLOAT0.200–2
interpolationoptCOMBObilinear3 options: bilinear, bicubic, nearest
maintain_aspectoptBOOLEANtrue

Outputs (1)

NameTypeDescription
framesIMAGE