Nodes/Akatz Custom Nodes/Schedule Audio Framesync | Akatz
ComfyUI Node

Schedule Audio Framesync | Akatz

Turn loudness into a per-frame float schedule for your animation

By akatz-ai·Created 2 years ago·Updated 9 months ago· 32
Schedule Audio Framesync | Akatz
  • audio
  • average_sum
  • frame_count
  • frame_rate
amp_control1.00
amp_offset0.00
frame_rate8
start_frame0
end_frame
curves_mode

Schedule Audio Framesync is the node that makes your animation dance: it reads an audio track, measures the loudness in each frame-sized chunk, and outputs one float per frame. Wire that list into a dilation, a speed change, a brightness ramp - anything that takes a per-frame value - and your visuals pulse with the music.

This is the beating heart of the pack's audioreactive side, and the pattern to understand is simple: audio in → one number per frame out. The number lands in a controlled range so downstream nodes can map it directly onto parameters. It's not the only audio-analysis node in ComfyUI, but it's the one Akatz's own mask-dilation nodes are built around, so the round trip is frictionless.

How it works

Under the hood it's pydub doing the work. The audio is split into chunks of 1000/frame_rate milliseconds, and each chunk's dBFS (decibel relative to full scale) is measured. The node then normalizes those readings against the track's own loudness floor and ceiling - this auto-scaling is the important part, because it means a quiet track and a loud track both map onto the full output range instead of hugging the bottom. amp_control scales the normalized value and amp_offset shifts it, so by default (control 1, offset 0) you get roughly 0–1.

The curves_mode menu (linear, ease-in, bounce, sinusoidal, exponential, and friends) applies an easing pass to smooth the per-frame values, which tames the jitter you'd otherwise get from raw loudness. The end_frame input lets you cut the analysis short - it's in frames, and a value ≤ 0 means "use the whole track."

Inputs and outputs

  • audio - an AUDIO input, straight from a video or audio loader.
  • amp_control / amp_offset - output scaling and floor. Defaults 1 and 0 give a 0–1 range.
  • frame_rate - the analysis frame rate, default 8. Match this to the frame rate of the animation you're driving (or a divisor of it).
  • start_frame / end_frame - trim the analysis window.
  • curves_mode - easing over time, None for raw.

Outputs: average_sum (the LIST of per-frame loudness values - this is the one you wire onward), plus frame_count and frame_rate for reference.

Installing it

Part of akatz-ai/ComfyUI-AKatz-Nodes. Install via ComfyUI Manager (search "AKatz") or:

cd ComfyUI/custom_nodes
git clone https://github.com/akatz-ai/ComfyUI-AKatz-Nodes
cd ComfyUI-AKatz-Nodes
pip install -r requirements.txt

Restart ComfyUI. pydub is in the requirements - that's the one dependency this node genuinely needs that you may not already have. No model downloads.

Common issues

Silence is the classic gotcha: a silent chunk measures dBFS as negative infinity and gets floored to amp_offset, so an empty intro just sits at the bottom of your range - that's expected, not a bug. frame_rate matters more than people think: an 8 fps schedule driving a 24 fps animation needs a resize or per-frame mapping somewhere, or the timing drifts. And if you're feeding this into a mask dilation node, remember it expects roughly 0–1 normalized values - keep amp_control at 1 and amp_offset at 0 unless you know why you're changing them.

Category💜Akatz Nodes/Audio

Inputs (7)

NameTypeDefaultDescription
audioAUDIO
amp_controlFLOAT1.000.1–1024
amp_offsetFLOAT0.000–1023
frame_rateINT81–244
start_frameINT0
end_frameINT
curves_modeCOMBO19 options: None, linear, ease-in, ease-out, ease-in-out, bounce-in, +13

Outputs (3)

NameTypeDescription
average_sumLIST
frame_countINT
frame_rateINT