Multi-Mask Strength Combiner (5 inputs)
One ControlNet, five regions, five strengths — without five separate nodes
- mask_1
- mask_2
- mask_3
- mask_4
- mask_5
- combined_mask
ControlNet strength is a global number - 0.8 everywhere or nowhere. But sometimes you want a pose ControlNet gripping the person hard while barely touching the background, or a face ControlNet that goes full-bore on the head and fades to nothing on the torso. That's what this node is for: it takes up to five masks, applies an individual strength multiplier to each, and merges them into a single weighted mask you can pipe into a ControlNet that supports per-pixel strength.
How it works
Each mask_N gets multiplied by its mask_N_strength, then all of them are combined with blend_mode - max, add, multiply, or average. base_strength scales the whole result, and normalize_output clamps it to 0–1. The output is one combined_mask where bright pixels mean "apply a lot of control here" and dark pixels mean "leave this area alone." Wire that into a ControlNet that honors per-pixel weights - the Advanced ControlNet workflow this pack is built around - and you've got spatially varying control strength from a single condition.
The default strengths are telling: 1.0, 0.7, 0.5, 0.3, 0.2. The node assumes a hierarchy - primary subject strongest, secondary regions weaker, background weakest. You'll usually want to override those, but it's a sensible starting shape.
The inputs that matter
base_strength(required) - global multiplier over everything.mask_1…mask_5with per-maskmask_N_strength- your regions and how hard each one pushes.blend_mode-maxis the usual pick for keeping regions from interfering;averageis gentler.normalize_output- keep it on; values over 1.0 confuse some downstream ControlNet wiring.
Output: combined_mask (MASK).
Note the difference from the pack's batch combiner: this one has no timing. It's a single static, spatially-weighted mask for one point in the generation. If you want the same idea moving through time, that's what Multi-Mask Combiner (Batch) does - these two are "space" and "space + time."
Installing it
Standard pack install, no extra weights:
cd ComfyUI/custom_nodes
git clone https://github.com/diffussy69/comfyui-curved_weight_schedule
pip install matplotlib pillow numpy torch scipy
Restart, hard-refresh the browser if the UI acts stale.
Where people get burned
The most common mistake is expecting this mask to change strength by itself. It doesn't - it produces a weighted mask; something downstream has to actually consume it. If your ControlNet doesn't accept per-pixel mask strength, the node quietly does nothing for you. And keep normalize_output on: with add mode, two overlapping strength-1.0 masks sum past 1.0, and whatever consumes the result may behave unpredictably if you let it through unclamped.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| base_strength | FLOAT | 1.000–2 | Base strength multiplier applied to all masks |
| mask_1opt | MASK | — | |
| mask_1_strengthopt | FLOAT | 1.000–2 | Strength multiplier for mask 1 |
| mask_2opt | MASK | — | |
| mask_2_strengthopt | FLOAT | 0.700–2 | Strength multiplier for mask 2 |
| mask_3opt | MASK | — | |
| mask_3_strengthopt | FLOAT | 0.500–2 | Strength multiplier for mask 3 |
| mask_4opt | MASK | — | |
| mask_4_strengthopt | FLOAT | 0.300–2 | Strength multiplier for mask 4 |
| mask_5opt | MASK | — | |
| mask_5_strengthopt | FLOAT | 0.200–2 | Strength multiplier for mask 5 |
| blend_modeopt | COMBO | 4 options: max, add, multiply, average | |
| normalize_outputopt | BOOLEAN | true | Clamp output to [0,1] range |
| show_debugopt | BOOLEAN | false | Print debug information |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| combined_mask | MASK | — |