Nodes/ComfyUI-curved_weight_schedule/Multi-ControlNet Curve Coordinator
ComfyUI Node

Multi-ControlNet Curve Coordinator

Four ControlNets, four independent schedules, one graph

By diffussy69·Created 11 months ago·Updated 9 months ago· 2
Multi-ControlNet Curve Coordinator
    • SLOT_A
    • SLOT_B
    • SLOT_C
    • SLOT_D
    • combined_graph
    • info
    num_keyframes10
    divider_a━━━━━━━ SLOT A ━━━━━━━
    enable_slot_atrue
    start_percent_a0.000
    end_percent_a1.000
    preset_aFade Out
    curve_type_aease_out
    start_strength_a1.00
    end_strength_a0.00
    curve_param_a2.0
    divider_b━━━━━━━ SLOT B ━━━━━━━
    enable_slot_btrue
    start_percent_b0.000
    end_percent_b1.000
    preset_bFade In
    curve_type_bease_in
    start_strength_b0.00
    end_strength_b1.00
    curve_param_b2.0
    divider_c━━━━━━━ SLOT C ━━━━━━━
    enable_slot_cfalse
    start_percent_c0.000
    end_percent_c1.000
    preset_cPeak Control
    curve_type_cbell_curve
    start_strength_c0.50
    end_strength_c0.50
    curve_param_c2.0
    divider_d━━━━━━━ SLOT D ━━━━━━━
    enable_slot_dfalse
    start_percent_d0.000
    end_percent_d1.000
    preset_dCustom
    curve_type_dlinear
    start_strength_d1.00
    end_strength_d0.50
    curve_param_d2.0

    Most multi-ControlNet workflows have a subtle problem: you stack a pose net and a depth net, give both a start and end percent, and hope they don't trip over each other. This node attacks that directly - up to four ControlNet slots, each with its own timing window, its own strength curve, and its own preset, all generated in one place and visualized on a single combined graph so you can see the handoffs. It's the pack's answer to "when does each ControlNet get to talk?"

    How it works

    Each slot (A through D) is a complete mini-scheduler: enable_slot_X turns it on, start_percent_X / end_percent_X define when in the generation that ControlNet is active, preset_X or the manual trio (start_strength_X, end_strength_X, curve_type_X, curve_param_X) define how strong it is across that window. num_keyframes applies to all slots at once so the four streams line up. The node builds a TimestepKeyframeGroup per enabled slot and returns them as four separate outputs - SLOT_A through SLOT_D - each wired into its own Apply Advanced ControlNet instance.

    The feature that earns the name "coordinator" is combined_graph: one chart plotting all four strength curves, with the active windows shaded, so a "smooth handoff" is something you can verify at a glance instead of trusting. The info output is the text summary.

    The shapes of a good schedule

    The README's use cases are worth internalizing because they're the actual reasons this node exists:

    • Sequential control - pose guides 0–40%, then depth takes over 40–100%. No overlap, no argument.
    • Overlapping transitions - give the two curves overlapping windows and opposite directions (pose fading out while depth fades in) for a smooth handoff instead of a cut.
    • Targeted bursts - a slot enabled only for a 20% window where a specific structure problem lives.

    Installing it

    Same pack, same Advanced ControlNet dependency:

    cd ComfyUI/custom_nodes
    git clone https://github.com/diffussy69/comfyui-curved_weight_schedule
    pip install matplotlib pillow numpy torch scipy
    

    The outputs are TimestepKeyframes, so Kosinkadink's ComfyUI-Advanced-ControlNet must be installed or you'll get the familiar import error. Restart, hard-refresh.

    Where people get burned

    The divider inputs (divider_a etc.) are just visual separators - they do nothing, which is easy to forget when a workflow insists on them. Bigger trap: four slots all with default 0–1 windows is four ControlNets fighting for the whole generation, which is how you get mush. The whole point is giving each slot a different window. Start with two slots and hand-check the combined graph before adding more - the graph is the feature; use it.

    Categoryconditioning/controlnet

    Inputs (37)

    NameTypeDefaultDescription
    num_keyframesINT102–100Number of keyframes (applies to all slots)
    divider_aSTRING━━━━━━━ SLOT A ━━━━━━━
    enable_slot_aBOOLEANtrueEnable ControlNet Slot A
    start_percent_aFLOAT0.0000–1Start point for Slot A
    end_percent_aFLOAT1.0000–1End point for Slot A
    preset_aCOMBOFade OutPreset for Slot A (overrides settings below)
    curve_type_aCOMBOease_outCurve type for Slot A
    start_strength_aFLOAT1.000–10Start strength for Slot A
    end_strength_aFLOAT0.000–10End strength for Slot A
    curve_param_aFLOAT2.00.1–10Curve parameter for Slot A
    divider_bSTRING━━━━━━━ SLOT B ━━━━━━━
    enable_slot_bBOOLEANtrueEnable ControlNet Slot B
    start_percent_bFLOAT0.0000–1Start point for Slot B
    end_percent_bFLOAT1.0000–1End point for Slot B
    preset_bCOMBOFade InPreset for Slot B
    curve_type_bCOMBOease_inCurve type for Slot B
    start_strength_bFLOAT0.000–10Start strength for Slot B
    end_strength_bFLOAT1.000–10End strength for Slot B
    curve_param_bFLOAT2.00.1–10Curve parameter for Slot B
    divider_cSTRING━━━━━━━ SLOT C ━━━━━━━
    enable_slot_cBOOLEANfalseEnable ControlNet Slot C
    start_percent_cFLOAT0.0000–1Start point for Slot C
    end_percent_cFLOAT1.0000–1End point for Slot C
    preset_cCOMBOPeak ControlPreset for Slot C
    curve_type_cCOMBObell_curveCurve type for Slot C
    start_strength_cFLOAT0.500–10Start strength for Slot C
    end_strength_cFLOAT0.500–10End strength for Slot C
    curve_param_cFLOAT2.00.1–10Curve parameter for Slot C
    divider_dSTRING━━━━━━━ SLOT D ━━━━━━━
    enable_slot_dBOOLEANfalseEnable ControlNet Slot D
    start_percent_dFLOAT0.0000–1Start point for Slot D
    end_percent_dFLOAT1.0000–1End point for Slot D
    preset_dCOMBOCustomPreset for Slot D
    curve_type_dCOMBOlinearCurve type for Slot D
    start_strength_dFLOAT1.000–10Start strength for Slot D
    end_strength_dFLOAT0.500–10End strength for Slot D
    curve_param_dFLOAT2.00.1–10Curve parameter for Slot D

    Outputs (6)

    NameTypeDescription
    SLOT_ATIMESTEP_KEYFRAME
    SLOT_BTIMESTEP_KEYFRAME
    SLOT_CTIMESTEP_KEYFRAME
    SLOT_DTIMESTEP_KEYFRAME
    combined_graphIMAGE
    infoSTRING