ControlNetHadamard (manual)
ControlNetHadamard, when your images come one at a time
- conds
- control_net
- CONDITIONING
ControlNetHadamard pairs a list of conditionings with a list of images - but the image list has to exist as a list. If you're not building image lists, if your controls are individual images from separate nodes, the list version forces you into extra plumbing. ControlNetHadamard (manual) is the same one-to-one pairing with the images fed through individual input sockets instead of one list slot. You wire image #1, image #2, image #3 each into its own port, and the node builds the list for you.
Same math, same per-pair ControlNet application, just a different way of getting the images in.
How it works
Same subclass of the core ControlNetApply as its sibling. The difference:
- conds - the
CONDITIONINGlist (still a list here). - control_net - one ControlNet model.
- strength - float 0–10, default 1.
- inputs_len - INT, 0–32, default 9. Controls how many image sockets you get.
- The image inputs - named
image_1,image_2, ... up toinputs_len. They don't exist until you right-click → "update Inputs" (the pack's ❔ convention).
It still asserts len(images) == len(conds) internally - the manual node just collects your per-socket images into a list and hands them to the same pairing loop. Output is a CONDITIONING list, one per input conditioning, each with the ControlNet applied to its paired image.
When this beats the list version
You have a fixed, small number of controls wired individually - say a 2×2 grid where each cell has its own reference image. Rather than forcing every cell through an image-list constructor, you drop each image straight into image_1 through image_4. It's also nicer when some images are themselves outputs of bespoke pipelines (a depth map here, a pose skeleton there) rather than one batch.
The flip side: it shares the sibling's constraints. One strength for the whole batch, and the socket count must match the conditioning count or the assert fires. Change inputs_len → right-click "update Inputs" → rewire.
Gotchas
Same misalignment risk as the list version - the node checks lengths, not intent. And if you bump inputs_len and forget to run "update Inputs," you'll be staring at a node whose sockets don't match the widget. Set the count, right-click, wire, go.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/bmad4ever/comfyui_bmad_nodes
cd comfyui_bmad_nodes
pip install -r requirements.txt
or install "comfyui_bmad_nodes" via ComfyUI Manager and restart. No extra dependencies beyond the pack's shared set. Pick the list version when your controls arrive as a batch; pick this one when they're individually wired - the ControlNet math is identical.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| conds | CONDITIONING | — | |
| control_net | CONTROL_NET | — | |
| strength | FLOAT | 1.000–10 | — |
| inputs_len | INT | 90–32 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |