AD Per Block++ (SD1.5) ππ π
Every one of SD1.5's 21 motion blocks, individually addressable
- down_0__0
- down_0__1
- down_1__0
- down_1__1
- down_2__0
- down_2__1
- down_3__0
- down_3__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
- up_3__0
- up_3__1
- up_3__2
- PER_BLOCK
Displayed as AD Per Block++ (SD1.5), this is the deepest end of this pack's per-block tuning system: 21 individually named sockets, one for every structural sub-block in SD 1.5's UNet. If the plain AD Per Block node (down/mid/up, three knobs) is the coarse version and AD Per Block+ (nine knobs, one per stage) is the middle ground, this is the version with nothing left grouped together.
What it's for
A motion module doesn't attach to a UNet uniformly - it injects temporal layers at every stage: four down (encoder) stages, one mid (bottleneck) block, four up (decoder) stages, and within the down/up stages, multiple sub-blocks each. This node exposes every one of those 21 individually: down_0__0 through down_3__1 (eight sockets, two sub-blocks per each of four down stages), mid (one), and up_0__0 through up_3__2 (twelve, three sub-blocks per each of four up stages). Each socket takes an AD_BLOCK value, built by ADE_ADBlockCombo (one effect plus one scale) or ADE_ADBlockIndiv (effect plus two independent scale_0/scale_1 values) elsewhere in your graph - and because those builder nodes take MULTIVAL inputs, each one of these 21 blocks can be masked spatially or scheduled on its own, which is the real reason to reach for this level over the flatter FromFloats sibling.
This is genuinely advanced tuning, not a first stop. Reach for it when you've isolated a motion artifact - flicker, over-strong movement, a structural glitch - to one specific part of the network and a global scale_multival/effect_multival adjustment hasn't fixed it. Down blocks tend to affect broader, lower-resolution structure; up blocks tend to affect finer detail; mid sits in between - treat that as a starting intuition to test against your own renders, not a guarantee, since neither the README nor the wider community documents a clean symptom-to-block mapping.
Inputs and output
All 21 are optional and independent - leave any unwired and that block keeps its default, unmodified behavior. Every socket is type AD_BLOCK:
down_0__0, down_0__1, down_1__0, down_1__1, down_2__0, down_2__1, down_3__0, down_3__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, up_3__0, up_3__1, up_3__2.
Output is a single PER_BLOCK, which feeds an Apply node's per_block input or a keyframe's per_block_replace if you want this configuration to change partway through your clip.
How to install it
ComfyUI Manager: search AnimateDiff Evolved, confirm the author is Kosinkadink, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved
No model download for this node itself - it's a configuration layer on top of a motion module you've already loaded into your graph.
Common issues & troubleshooting
Wired several blocks and nothing looks different. Confirm the PER_BLOCK output actually reaches the Apply node's per_block input, or a keyframe's per_block_replace - an unconnected configuration has no effect no matter how many of the 21 sockets you've filled in.
Lost track of which of the 21 you've actually wired. A common trap at this granularity - the node canvas gets busy fast with 21 potential connections. Keep a note of which blocks you're deliberately touching and leave everything else genuinely disconnected rather than filling sockets with neutral values out of habit; unwired defaults are the whole point of the optional inputs.
This feels like overkill for what you're trying to fix. It very likely is. Most motion issues that per-block tuning solves are traceable to one or two blocks, not 21 - try ADE_PerBlock_SD15_MidLevel first, or drop the whole system and start with global scale_multival/effect_multival on your Apply node, which covers the large majority of "more or less motion" requests.
Want to script a full configuration instead of clicking 21 nodes. That's exactly what ADE_PerBlock_SD15_FromFloats is for - same 21-slot granularity, but driven by two flat lists of numbers instead of 21 AD_BLOCK builders. The trade-off is you lose per-block masking; use LowLevel specifically when you need that.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| down_0__0opt | AD_BLOCK | β | |
| down_0__1opt | AD_BLOCK | β | |
| down_1__0opt | AD_BLOCK | β | |
| down_1__1opt | AD_BLOCK | β | |
| down_2__0opt | AD_BLOCK | β | |
| down_2__1opt | AD_BLOCK | β | |
| down_3__0opt | AD_BLOCK | β | |
| down_3__1opt | AD_BLOCK | β | |
| midopt | AD_BLOCK | β | |
| up_0__0opt | AD_BLOCK | β | |
| up_0__1opt | AD_BLOCK | β | |
| up_0__2opt | AD_BLOCK | β | |
| up_1__0opt | AD_BLOCK | β | |
| up_1__1opt | AD_BLOCK | β | |
| up_1__2opt | AD_BLOCK | β | |
| up_2__0opt | AD_BLOCK | β | |
| up_2__1opt | AD_BLOCK | β | |
| up_2__2opt | AD_BLOCK | β | |
| up_3__0opt | AD_BLOCK | β | |
| up_3__1opt | AD_BLOCK | β | |
| up_3__2opt | AD_BLOCK | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PER_BLOCK | PER_BLOCK | β |