Multi-Mask Combiner (Batch, 10 layers)
The temporal mask combiner, expanded to ten layers
- mask_1
- mask_2
- mask_3
- mask_4
- mask_5
- mask_6
- mask_7
- mask_8
- mask_9
- mask_10
- mask_batch
- schedule_graph
- schedule_info
Same engine, more lanes. The pack's 5-layer Multi-Mask Combiner (Batch) generates a batch of masks where each keyframe represents a different time window of generation - the "face first, then hands, then background" trick. This is the ten-layer version, for schedules with more moving parts than five regions can express. If you've ever wanted a mask schedule that cycles through regions sequentially like a storyboard - left, center, right, then everything - ten layers is where that stops feeling cramped.
What's different
The mechanism is identical: each of ten layers gets a mask_N, strength_N, start_percent_N, and end_percent_N, and the node samples num_keyframes snapshots across the timeline, combining active layers per snapshot with combine_method (max, add, multiply, or average), plus the shared fade_in_percent / fade_out_percent for soft ramps and normalize to clamp. The batch-level num_keyframes, start_percent, and end_percent behave the same.
The one thing to keep in mind: combine_method in this pack's batch combiners is max/add/multiply/average - the README's example workflow talks about max being recommended, and that still holds here. max keeps overlapping layers from stacking past 1.0 and is the safest start.
Outputs are the same trio as the five-layer version: mask_batch (into the Advanced Curved ControlNet Scheduler's batch_masks), schedule_graph (the IMAGE timeline preview - use it, it catches mistakes before you spend a generation), and schedule_info (text).
The use case that justifies ten layers
The README's sequential focus example - left third of the frame for 0–25%, middle for 25–50%, right for 50–75%, full image to finish - really does want more than five slots once you add fades and overlap. Ten layers lets you keep that whole choreography in one node instead of chaining two five-layer combiners.
Installing it
Same pack:
cd ComfyUI/custom_nodes
git clone https://github.com/diffussy69/comfyui-curved_weight_schedule
pip install matplotlib pillow numpy torch scipy
Temporal masking downstream means the modified Advanced ControlNet fork is required for the full pipeline (per-keyframe image support), and you'll get the Could not import TimestepKeyframe error without Advanced ControlNet present at all.
Where people get burned
Ten layers means ten chances for a default 0–1 time window to silently make a mask active for the whole generation - the "all keyframes look the same" failure. Set genuinely different start_percent/end_percent per layer, and pair with the pack's Redistribute Keyframe Percents node so the scheduler's keyframes actually spread across the timeline. The schedule_graph is your early-warning system; if it shows everything overlapping, fix the windows before generating.
Inputs (61)
| Name | Type | Default | Description |
|---|---|---|---|
| num_keyframes | INT | 102–200 | — |
| start_percent | FLOAT | 0.0000–1 | — |
| end_percent | FLOAT | 1.0000–1 | — |
| layer_1_separator | COMBO | ━━━━━━━━━━ LAYER 1 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 1 ━━━━━━━━━━ |
| mask_1 | MASK | — | |
| strength_1 | FLOAT | 1.000–2 | — |
| start_percent_1 | FLOAT | 0.000–1 | — |
| end_percent_1 | FLOAT | 1.000–1 | — |
| layer_2_separatoropt | COMBO | ━━━━━━━━━━ LAYER 2 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 2 ━━━━━━━━━━ |
| mask_2opt | MASK | — | |
| strength_2opt | FLOAT | 1.000–2 | — |
| start_percent_2opt | FLOAT | 0.000–1 | — |
| end_percent_2opt | FLOAT | 1.000–1 | — |
| layer_3_separatoropt | COMBO | ━━━━━━━━━━ LAYER 3 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 3 ━━━━━━━━━━ |
| mask_3opt | MASK | — | |
| strength_3opt | FLOAT | 1.000–2 | — |
| start_percent_3opt | FLOAT | 0.000–1 | — |
| end_percent_3opt | FLOAT | 1.000–1 | — |
| layer_4_separatoropt | COMBO | ━━━━━━━━━━ LAYER 4 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 4 ━━━━━━━━━━ |
| mask_4opt | MASK | — | |
| strength_4opt | FLOAT | 1.000–2 | — |
| start_percent_4opt | FLOAT | 0.000–1 | — |
| end_percent_4opt | FLOAT | 1.000–1 | — |
| layer_5_separatoropt | COMBO | ━━━━━━━━━━ LAYER 5 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 5 ━━━━━━━━━━ |
| mask_5opt | MASK | — | |
| strength_5opt | FLOAT | 1.000–2 | — |
| start_percent_5opt | FLOAT | 0.000–1 | — |
| end_percent_5opt | FLOAT | 1.000–1 | — |
| layer_6_separatoropt | COMBO | ━━━━━━━━━━ LAYER 6 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 6 ━━━━━━━━━━ |
| mask_6opt | MASK | — | |
| strength_6opt | FLOAT | 1.000–2 | — |
| start_percent_6opt | FLOAT | 0.000–1 | — |
| end_percent_6opt | FLOAT | 1.000–1 | — |
| layer_7_separatoropt | COMBO | ━━━━━━━━━━ LAYER 7 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 7 ━━━━━━━━━━ |
| mask_7opt | MASK | — | |
| strength_7opt | FLOAT | 1.000–2 | — |
| start_percent_7opt | FLOAT | 0.000–1 | — |
| end_percent_7opt | FLOAT | 1.000–1 | — |
| layer_8_separatoropt | COMBO | ━━━━━━━━━━ LAYER 8 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 8 ━━━━━━━━━━ |
| mask_8opt | MASK | — | |
| strength_8opt | FLOAT | 1.000–2 | — |
| start_percent_8opt | FLOAT | 0.000–1 | — |
| end_percent_8opt | FLOAT | 1.000–1 | — |
| layer_9_separatoropt | COMBO | ━━━━━━━━━━ LAYER 9 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 9 ━━━━━━━━━━ |
| mask_9opt | MASK | — | |
| strength_9opt | FLOAT | 1.000–2 | — |
| start_percent_9opt | FLOAT | 0.000–1 | — |
| end_percent_9opt | FLOAT | 1.000–1 | — |
| layer_10_separatoropt | COMBO | ━━━━━━━━━━ LAYER 10 ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ LAYER 10 ━━━━━━━━━━ |
| mask_10opt | MASK | — | |
| strength_10opt | FLOAT | 1.000–2 | — |
| start_percent_10opt | FLOAT | 0.000–1 | — |
| end_percent_10opt | FLOAT | 1.000–1 | — |
| combine_separatoropt | COMBO | ━━━━━━━━━━ COMBINE ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ COMBINE ━━━━━━━━━━ |
| combine_methodopt | COMBO | max | 4 options: max, add, multiply, average |
| normalizeopt | BOOLEAN | true | — |
| fade_in_percentopt | FLOAT | 0.000–0.5 | — |
| fade_out_percentopt | FLOAT | 0.000–0.5 | — |
| display_separatoropt | COMBO | ━━━━━━━━━━ DISPLAY ━━━━━━━━━━ | 1 options: ━━━━━━━━━━ DISPLAY ━━━━━━━━━━ |
| show_graphopt | BOOLEAN | true | — |
| print_scheduleopt | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| mask_batch | MASK | — |
| schedule_graph | IMAGE | — |
| schedule_info | STRING | — |