AD Per Block Floats (SDXL) ππ π
Scripting all 16 SDXL motion blocks from two lists of numbers
- effect_16_floats
- scale_16_floats
- PER_BLOCK
The SDXL sibling of ADE_PerBlock_SD15_FromFloats, and the same idea: instead of wiring up individual AD_BLOCK nodes one per block, you hand this node two flat lists of numbers - one for effect, one for scale - covering SDXL's 16 motion blocks in one go, no per-block builder nodes required.
Where this sits, and a caveat worth having up front
This pack's per-block system has four granularity levels: AD Per Block (down/mid/up, three knobs, shared across SD1.5 and SDXL), AD Per Block+ (SDXL) (seven knobs, one per stage), AD Per Block++ (SDXL) (16 knobs, every sub-block individually), and this node - the same 16-slot coverage as ++, but as raw floats instead of AD_BLOCK objects.
Worth knowing before you invest time here: AnimateDiff's SDXL motion module never left beta. It shipped with fewer native frames (8 vs SD 1.5's 16), needed more VRAM, and - per our knowledge base - "never got the ecosystem development SD 1.5 did." Per-block tuning this granular is being applied on top of a motion module that was already rougher than its SD 1.5 counterpart. It can still be worth doing, but go in with the expectation that you're compensating for a less mature module, not polishing a fully baked one - and that SD 1.5 AnimateDiff, if it's an option for your project, will likely get you further with less tuning effort.
The mechanics
SDXL's UNet has three down stages, one mid block, and three up stages - fewer than SD 1.5's four-and-four, which is why the block count comes out to 16 rather than 21: six down sub-blocks (two per stage across three stages), one mid, and nine up sub-blocks (three per stage across three stages). The order your two lists need to follow matches ADE_PerBlock_SDXL_LowLevel's own field order: down_0__0, down_0__1, down_1__0, down_1__1, down_2__0, down_2__1, mid, then up_0__0 through up_2__2.
As with the SD1.5 version, this trades away masking: the low-level AD_BLOCK builder nodes take MULTIVAL inputs (maskable, schedulable), while this node's two float lists are flat numbers, one per block. Use ADE_ValueScheduling or ADE_FloatToFloats if you're generating the 16 numbers programmatically rather than hand-typing them.
Inputs and output
Both optional and independent - drive just effect, just scale, or both:
effect_16_floats(FLOATS) - 16 values, order above.scale_16_floats(FLOATS) - same order, motion intensity.
Output is a single PER_BLOCK, feeding an Apply node's per_block input or a keyframe's per_block_replace.
How to install it
ComfyUI Manager: search AnimateDiff Evolved, confirm author Kosinkadink, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved
You'll need an SDXL-compatible motion module loaded elsewhere in the graph - per the README, use autoselect or linear (AnimateDiff-SDXL) beta_schedule on your loader for it to behave as intended.
Common issues & troubleshooting
List isn't exactly 16 entries. Both lists need to match the block count precisely - this is SDXL's count, not SD 1.5's 21, so double-check you haven't copied a list sized for the wrong architecture.
Base motion quality is inconsistent before you even start tuning. That's a known characteristic of the SDXL motion module rather than something this node introduces - it never left beta and the community investment in it was much lighter than SD 1.5's. Confirm your beta_schedule and checkpoint are correctly matched before assuming per-block values are the problem.
16 numbers feels excessive. Try ADE_PerBlock_SDXL_MidLevel (seven knobs) or the plain AD Per Block (three knobs) first - most motion issues per-block tuning actually fixes trace to one or two structural regions, not the full set.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| effect_16_floatsopt | FLOATS | β | |
| scale_16_floatsopt | FLOATS | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PER_BLOCK | PER_BLOCK | β |