Nodes/SigmaWaveFormNodes/Sigma Waveform Node
ComfyUI Node

Sigma Waveform Node

Your scheduler is a shape — this node lets you draw your own

By BenNarum·Created 2 years ago·Updated 2 years ago· 6
Sigma Waveform Node
    • sigmas
    steps60
    amplitude3.0
    frequency0.10
    waveform_typesine
    damping_factor0.030
    enable_dampingtrue
    min_sigma0.0
    apply_fourierfalse
    horizontal_length0.10
    enable_unidirectionaltrue

    A noise schedule is just a list of sigmas - numbers saying how much noise is left at each denoising step. ComfyUI hands you Karras, beta, normal and a dozen more, but every one of them is a fixed shape baked into a dropdown. The Sigma Waveform Node from the SigmaWaveFormNodes pack throws the dropdown away and turns the schedule into a waveform generator: pick a shape, set an amplitude and frequency, and out comes a SIGMAS sequence you can feed to a sampler. Same idea that drove the A1111 "Detail Daemon" crowd - the people who wanted to sculpt how denoising effort gets spent instead of accepting whatever the scheduler ships.

    Honest framing first: this is a tinkerer's node from mid-2024, one commit, never touched since. It's a toy with a genuinely interesting mechanism, not a daily driver. If your workflow is healthy, it won't help you. If you've ever wondered what an image looks like when denoising effort is distributed as a square wave, it's the only sane way to find out.

    How it works

    Under the hood it's embarrassingly simple, and that's the charm. It samples steps points along a normalized time axis (linspace(0, 1, steps)) and evaluates your chosen waveform there. Then, in order:

    1. Unidirectional shift - subtracts the minimum so nothing goes negative, then adds min_sigma.
    2. Damping - multiplies the whole curve by exp(-damping_factor * t), an exponential decay across the schedule.
    3. Fourier (optional) - a blunt lowpass that keeps the first handful of frequency bins and zeroes the rest.

    The result comes back as a float64 tensor that ComfyUI accepts as a SIGMAS input.

    The inputs that matter

    • waveform_type - seven choices: sine (default), sawtooth, square, triangle, rectangular, random, stepped. This is the whole personality of the node.
    • amplitude and frequency - how big and how many cycles. Defaults of 3.0 and 0.1 are a sane starting point.
    • steps - length of the sequence (default 60). Match it to the step count you'll actually sample at.
    • enable_unidirectional - keep this on. A schedule with negative noise levels is not a schedule, it's a dare.
    • damping_factor with enable_damping - the knob that makes output usable. A decaying sine starts hot and fades, which is the closest this node gets to a real schedule. Crank damping and even the weirdest wave becomes vaguely schedulish.
    • min_sigma - floor for the unidirectional shift.
    • apply_fourier - turns on the blunt built-in lowpass. Fine for smoothing, but see the dedicated Fourier Filter Node if you want actual control.
    • horizontal_length - only does anything for stepped; it sets the width of each flat segment.

    The single output, sigmas, plugs straight into ComfyUI's native SamplerCustom node, which is the stock node that accepts an arbitrary SIGMAS schedule.

    Installing it

    Install once and all six nodes in the pack appear. Either way, restart ComfyUI after.

    cd ComfyUI/custom_nodes
    git clone https://github.com/BenNarum/SigmaWaveFormNode
    

    Or use ComfyUI Manager - search "SigmaWaveFormNodes" and install from there; the pack is published to the Comfy registry.

    Good news on dependencies: requirements.txt is just numpy and torch, which every ComfyUI install already has. No model downloads, no CUDA surprises, no transformers-pinning hell. This is one of the rare packs that can't break your environment.

    Where people get burned

    The big one: this is not a real schedule. A proper sigma list descends - lots of noise early, little late. A sine wave goes up and down, and "unidirectional" only shifts the curve up, it doesn't sort it. Feed a raw, undamped sine into SamplerCustom and it will add noise on the way up and remove it on the way down, alternately. Expect chaotic output; that's the feature, not a bug. Keep enable_damping on and apply_fourier if you want anything resembling normal results.

    The random waveform also has no seed, so identical settings give you a different schedule on every run. If you need to compare two generations, that's your confound - pin a seed elsewhere or pick a deterministic shape.

    Categorysampling/custom_sampling/schedulers

    Inputs (10)

    NameTypeDefaultDescription
    stepsINT601–1000
    amplitudeFLOAT3.00.1–100
    frequencyFLOAT0.100.01–10
    waveform_typeCOMBOsine7 options: sine, sawtooth, stepped, square, random, triangle, +1
    damping_factorFLOAT0.0300–0.1
    enable_dampingBOOLEANtrue
    min_sigmaFLOAT0.00–10
    apply_fourierBOOLEANfalse
    horizontal_lengthFLOAT0.100–1
    enable_unidirectionalBOOLEANtrue

    Outputs (1)

    NameTypeDescription
    sigmasSIGMAS