Nodes/AnimateDiff Evolved/AD Per Block++ (SDXL) πŸŽ­πŸ…πŸ…“
ComfyUI Node Runs on cloud

AD Per Block++ (SDXL) πŸŽ­πŸ…πŸ…“

Every one of SDXL's 16 motion blocks, individually addressable

By KosinkadinkΒ·Created 3 years agoΒ·Updated 8 days agoΒ· 3,519
AD Per Block++ (SDXL) πŸŽ­πŸ…πŸ…“
  • down_0__0
  • down_0__1
  • down_1__0
  • down_1__1
  • down_2__0
  • down_2__1
  • mid
  • up_0__0
  • up_0__1
  • up_0__2
  • up_1__0
  • up_1__1
  • up_1__2
  • up_2__0
  • up_2__1
  • up_2__2
  • PER_BLOCK

Displayed as AD Per Block++ (SDXL), this is the deepest tuning level for an SDXL motion module: 16 individually named sockets, one per structural sub-block. It's the SDXL sibling of ADE_PerBlock_SD15_LowLevel, sized differently because SDXL's UNet is structured differently - three down stages and three up stages rather than SD 1.5's four and four.

What it's for

Every one of the 16 sockets takes an AD_BLOCK value, built with ADE_ADBlockCombo (effect plus one scale) or ADE_ADBlockIndiv (effect plus split scale_0/scale_1). Because those builders take MULTIVAL inputs, each of the 16 blocks here can be masked spatially or scheduled independently - the reason to reach for this over the flatter ADE_PerBlock_SDXL_FromFloats, which takes plain numbers instead.

Reach for this once you've isolated a motion problem to one specific structural region and a global scale_multival/effect_multival on your Apply node hasn't resolved it. One thing worth being honest about going in: AnimateDiff's SDXL motion module never left beta - fewer native frames than SD 1.5 (8 vs 16), heavier VRAM, and per our knowledge base, it "never got the ecosystem development SD 1.5 did." You may be spending real tuning effort compensating for a rougher base module rather than polishing an already-solid one. Confirm your beta_schedule is set to autoselect or linear (AnimateDiff-SDXL) and your checkpoint is genuinely SDXL before assuming a block-level fix is what you need.

Inputs and output

All 16 optional and independent, type AD_BLOCK:

down_0__0, down_0__1, down_1__0, down_1__1, down_2__0, down_2__1, mid, up_0__0, up_0__1, up_0__2, up_1__0, up_1__1, up_1__2, up_2__0, up_2__1, up_2__2.

Leave any unwired and that block keeps default, unmodified behavior. Output is a single PER_BLOCK, feeding an Apply node's per_block input or a keyframe's per_block_replace for scheduling the configuration to change mid-clip.

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

Needs an SDXL motion module and matching checkpoint loaded elsewhere in the graph - the README is explicit that beta_schedule needs to be autoselect or linear (AnimateDiff-SDXL) for it to behave correctly.

Common issues & troubleshooting

Wired several blocks and nothing looks different. Confirm PER_BLOCK actually reaches the Apply node's per_block input or a keyframe's per_block_replace - an unconnected configuration has no effect regardless of how many of the 16 sockets are filled.

Motion looks rough or inconsistent even before per-block tuning. That may be the SDXL motion module's inherent beta-quality baseline rather than something to fix at the block level - double-check beta_schedule and checkpoint match SDXL first.

No documented mapping from symptom to block. True of this entire family, on both architectures - down blocks tend toward broader structure, up blocks toward finer detail, mid in between, but that's a starting intuition to test against your own renders, not a rule either the README or the community has written down.

This feels like overkill. It likely is for most problems. Try ADE_PerBlock_SDXL_MidLevel (seven knobs) or plain AD Per Block (three) before descending to all 16 - and if you want to script values instead of clicking through builder nodes, ADE_PerBlock_SDXL_FromFloats gives the same 16-slot coverage from two flat lists, at the cost of losing per-block masking.

CategoryAnimate Diff πŸŽ­πŸ…πŸ…“/per block

Inputs (16)

NameTypeDefaultDescription
down_0__0optAD_BLOCKβ€”
down_0__1optAD_BLOCKβ€”
down_1__0optAD_BLOCKβ€”
down_1__1optAD_BLOCKβ€”
down_2__0optAD_BLOCKβ€”
down_2__1optAD_BLOCKβ€”
midoptAD_BLOCKβ€”
up_0__0optAD_BLOCKβ€”
up_0__1optAD_BLOCKβ€”
up_0__2optAD_BLOCKβ€”
up_1__0optAD_BLOCKβ€”
up_1__1optAD_BLOCKβ€”
up_1__2optAD_BLOCKβ€”
up_2__0optAD_BLOCKβ€”
up_2__1optAD_BLOCKβ€”
up_2__2optAD_BLOCKβ€”

Outputs (1)

NameTypeDescription
PER_BLOCKPER_BLOCKβ€”