Nodes/comfyui_bmad_nodes/ControlNetHadamard (manual)
ComfyUI Node Runs on cloud

ControlNetHadamard (manual)

ControlNetHadamard, when your images come one at a time

By bmad4ever·Created 3 years ago·Updated 9 months ago· 70
ControlNetHadamard (manual)
  • conds
  • control_net
  • CONDITIONING
strength1.00
inputs_len9

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 CONDITIONING list (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 to inputs_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.

CategoryBmad/conditioning

Inputs (4)

NameTypeDefaultDescription
condsCONDITIONING
control_netCONTROL_NET
strengthFLOAT1.000–10
inputs_lenINT90–32

Outputs (1)

NameTypeDescription
CONDITIONINGCONDITIONING