Nodes/FizzNodes/Value Schedule πŸ“…πŸ…•πŸ…
ComfyUI Node Runs on cloud

Value Schedule πŸ“…πŸ…•πŸ…

Animate any number in your graph, from CFG to camera position

By FizzleDorfΒ·Created 3 years agoΒ·Updated 2 years agoΒ· 479
Value Schedule πŸ“…πŸ…•πŸ…
    • FLOAT
    • INT
    β—„text0:(0), 11:(0), 23:(0), 35:(0), 47:(0), 59:(0), 71:(0), 83:(0), 95:(0), 107:(0), 119:(0) β–Ί
    β—„max_frames120β–Ί
    β—„current_frame0β–Ί
    β—„print_outputfalseβ–Ί

    The scheduled-prompt nodes get the glory, but Value Schedule is the workhorse. Where the prompt nodes animate text, this one animates a number: you give it a set of keyframes and it interpolates smoothly between them, returning a FLOAT (and an INT twin) for the current frame. Wire that float into anything that takes a number - CFG, denoise strength, an IPAdapter weight, a composite node's x-position - and suddenly that parameter is a moving part in your animation.

    The README's own example does exactly this: it schedules a latent composite's x position with Value Schedule, so the subject slides across the frame while a batch of prompts plays. It's the node that turns "animate prompts" into "animate everything."

    How it works

    The text input is a keyframe list in Deforum's value format:

    0:(0.5),
    30:(0.2),
    60:(0.9),
    120:(0.5)
    

    Each entry is frame:(value). The node parses those points, builds a pandas series across all max_frames, and interpolates between keyframes (linear by default; the engine also supports quadratic/cubic when more than a couple of keyframes exist). The values themselves go through numexpr, so 0:(1 + t % 5) or 30:(sin(t/10)) are fair game - t is the frame. current_frame rolls over modulo max_frames for seamless loops. The INT output is just the float truncated, which is handy when the downstream input wants whole numbers.

    The inputs you'll set: text, max_frames, current_frame. That's genuinely it. print_output shows the value at the current frame in the console.

    Wiring it in

    current_frame is a forced input in the source, which is a hint: in a batch animation you drive it from the same per-frame counter that feeds your prompt scheduler. The float output plugs into any numeric input port; if the target wants an INT, use the second output instead of rounding yourself.

    Two practical notes. First, this node is why the framesync.xyz audio-reactivity tool exists - it exports keyframe strings that drop straight into the text field, so you can sync a value to the beat of a track. Second, if you only ever set one keyframe, you get a constant - a schedule needs at least two points to do anything.

    Install and gotchas

    Same pack as the rest - ComfyUI Manager, search FizzNodes, install, restart. Manual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/FizzleDorf/ComfyUI_FizzNodes
    cd ComfyUI_FizzNodes && pip install -r requirements.txt
    

    Requirements are numpy, pandas, numexpr; no model files. Under FizzNodes πŸ“…πŸ…•πŸ… β†’ ScheduleNodes.

    Where people trip: a trailing comma after the last keyframe (0:(0.5),) produces an empty entry that breaks parsing, so keep the list clean; and remember the value is computed at one frame - leave current_frame unwired in a non-batch graph and the float never changes, which confuses people into thinking interpolation is broken. It's not. It's doing exactly what you asked, at a frame you never advanced.

    CategoryFizzNodes πŸ“…πŸ…•πŸ…/ScheduleNodes

    Inputs (4)

    NameTypeDefaultDescription
    textSTRING0:(0), 11:(0), 23:(0), 35:(0), 47:(0), 59:(0), 71:(0), 83:(0), 95:(0), 107:(0), 119:(0) β€”
    max_framesINT1201–999999β€”
    current_frameINT00–999999β€”
    print_outputBOOLEANfalseβ€”

    Outputs (2)

    NameTypeDescription
    FLOATFLOATβ€”
    INTINTβ€”