Schedule Audio Framesync | Akatz
Turn loudness into a per-frame float schedule for your animation
- audio
- average_sum
- frame_count
- frame_rate
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,Nonefor 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.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| amp_control | FLOAT | 1.000.1–1024 | — |
| amp_offset | FLOAT | 0.000–1023 | — |
| frame_rate | INT | 81–244 | — |
| start_frame | INT | 0 | — |
| end_frame | INT | — | |
| curves_mode | COMBO | 19 options: None, linear, ease-in, ease-out, ease-in-out, bounce-in, +13 |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| average_sum | LIST | — |
| frame_count | INT | — |
| frame_rate | INT | — |