Dynamic Animated Weights
The node that choreographs your whole animation — black frames first, then the wipe
- transitions
- qr_mode
- edge_fx
- edge_fx_fade
- total_frames
If you've downloaded a prompt-travel workflow and stared at a node spitting out rows of black-and-white frames, this is probably that node. Dynamic Animated Weights is the flagship of mgfxer's ComfyUI-FrameFX pack, and it's the piece that actually choreographs an animation. Everything else in the pack - the mask helpers, the travel helpers - exists to feed or read the same language: hold frames, transition frames, end padding. This node is where that language meets a drawing engine.
What it actually does
Think of it as a machine that renders a weight sequence frame by frame. For each cycle it draws a solid black hold, then a transition animation over the next N frames - a wipe sweeping left to right, a circle growing, venetian blinds opening, a square spinning, a fade. White is the "this is where the transition is happening right now" zone. Hook that sequence into the mask/weight input of your animation stack and you've told it exactly when and where each prompt gets replaced. No hand-timing keyframes in a spreadsheet.
It's all done with PIL in pure Python, so there's nothing to download and nothing to tune on the GPU side. The work is in the timeline, not the math.
The inputs that matter
The node is a wall of options; you'll mostly touch these:
animation_type_1throughanimation_type_12- your transition slots. Only the first few you set get used; if you need more than 12 cycles, the list loops in order.RandomandRandomNoVenetianpick per slot, seeded byrandom_seed.hold_frames,transition_frames,padding_frames- the timing skeleton. Defaults are 8 / 20 / 6, which is a decent starting cadence.input_frames- how many cycles to generate. This is your overall animation length.transition_easing-ease_in,ease_out,ease_in_out, orfalsefor linear. This is where a wipe goes from "stiff" to "actually looks like motion."generation_mode-Only Transitions,Generate QR,Generate Edge-FX, orGenerate All.
A note on generation_mode: "QR" and "Edge-FX" aren't gimmicks. QR mode alternates inverted cycles so the batch reads like a scannable QR pattern - that's how the QR-animation workflows you've seen get their trigger. qr_greyness keeps the "black" cells light enough for a phone to read. Edge-FX mode computes the difference between adjacent frames and emits white-on-black edge masks, which is the input an Edge-FX / ipadapter workflow wants. "Generate All" gives you both plus a faded edge_fx_fade version.
The outputs
transitions- the main weight sequence (IMAGE). Wire this into the mask/weight input of your animation stack.qr_mode- QR-pattern version.edge_fxandedge_fx_fade- edge masks, raw and fade-weighted.total_frames- the count, useful for setting your sampler's frame total so nothing drifts.
Installing it
Same install for every node in this pack - ComfyUI Manager, search ComfyUI-FrameFX, install, restart. Or the old-fashioned way:
cd ComfyUI/custom_nodes
git clone https://github.com/mgfxer/ComfyUI-FrameFX
Then restart ComfyUI. There's no requirements.txt and no model download - the pack only needs torch, PIL and numpy, which ComfyUI already ships.
Where people get burned
Keep hold_frames, transition_frames and padding_frames in lockstep with whatever FrameFX node you're pairing this with - the pack's whole design is that these values agree across nodes, and the moment you change them in one place but not the other, your transitions drift off the timeline. Also: the blur and fade sliders are amplified in the code (gaussian_blur_amount gets scaled ×20), so small values go a lot further than the widget suggests. Start near zero. And random_seed is a float slider from 0–10, scaled internally - not the integer seed you're used to.
It's a fiddly node, no argument. But it's the one that makes the rest of the animation workflow tick, and once the hold/transition/padding pattern clicks, the whole pack clicks with it.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| animation_type_1 | COMBO | RightToLeft | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_2 | COMBO | SqSpinCCW | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_3 | COMBO | VenetianBlindsVertical | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_4 | COMBO | SqSpinCCW | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_5 | COMBO | GrowingCircle | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_6 | COMBO | DiagonalVenetianBlinds2 | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_7 | COMBO | DiagonalBottomRight-TopLeft | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_8 | COMBO | DiagonalBottomLeft-TopRight | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_9 | COMBO | TopDown | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_10 | COMBO | BottomToTop | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_11 | COMBO | ShrinkingCircle | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| animation_type_12 | COMBO | VenetianBlindsHorizontal | 19 options: LeftToRight, RightToLeft, TopDown, BottomToTop, GrowingCircle, ShrinkingCircle, +13 |
| transition_easing | COMBO | false | 4 options: ease_in, ease_out, ease_in_out, false |
| blur_easing | COMBO | false | 4 options: ease_in, ease_out, ease_in_out, false |
| frame_width | INT | 512 | — |
| frame_height | INT | 512 | — |
| hold_frames | INT | 8 | — |
| transition_frames | INT | 20 | — |
| padding_frames | INT | 6 | — |
| input_frames | INT | 5 | — |
| gaussian_blur_amount | FLOAT | 0.00–10 | — |
| edge_fx_thickness | INT | 11–10 | — |
| push_fx | INT | 00–30 | — |
| retract_fx | INT | 00–30 | — |
| fx_cull_white_frames | FLOAT | 10.00–100 | — |
| qr_greyness | FLOAT | 0.500–1 | — |
| random_seed | FLOAT | 0.00–10 | — |
| edgeFade_contrast | FLOAT | 1.00.5–6 | — |
| edgeFade_blur | FLOAT | 0.00–10 | — |
| generation_mode | COMBO | Only Transitions | 4 options: Only Transitions, Generate QR, Generate Edge-FX, Generate All |
| edge_fx_fade_balance | FLOAT | 0.500.1–0.9 | — |
| venetian_bars | INT | 4 | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| transitions | IMAGE | — |
| qr_mode | IMAGE | — |
| edge_fx | IMAGE | — |
| edge_fx_fade | IMAGE | — |
| total_frames | INT | — |