Curve to Numbers
Bend a curve by hand, then drive a denoise ramp or camera move with it
- minimum
- maximum
- step
- values
- positions
- value
- count
- text
Samplers, blend factors and denoise amounts take plain numbers. Animators think in curves - ease in, ease out, a strength that stays low through the middle and spikes at the end. This node is the bridge: you draw a curve, and it walks the range and reads the curve at every step, spitting the values out as numbers. A straight line gives you an even ramp; a bent one redistributes the same range, which is exactly what gives a strength ramp, a denoise schedule or a camera move its shape.
You'll reach for it any time a value needs to change across a sequence rather than staying fixed - video frame runs, batch generations that step a denoise or a blend down over time, a move that eases rather than lurches.
How it works
The curve lives in curve_points, written as 0,0;128,200;255,255 on a 0–255 scale, lowest input first. Two ways to fill it: type the shorthand, or - much nicer - drag the plot drawn on the node itself to bend the curve by hand. You can also paste the curve_points a WAS Image Curves node holds; its composite RGB curve is the one that gets read. Empty means the straight line, which walks the range evenly.
Then three numbers decide the sweep:
minimum- the bottom of the output range, and what the curve reads at its lowest.0.0for a strength or denoise,-1.0with a maximum of1.0for a move either side of centre.maximum- the top of the range. Belowminimumand it stops with an error.step- the increment between positions, which is what decides how many values you get: over 0.0 to 1.0 at0.1that's eleven of them. Maximum is only included when the step divides the range exactly, so a step of0.3stops at0.9- worth knowing before you wonder where your last value went.decimals- rounding, so0.30000000000000004never reaches a filename or log.6is the default;0gives whole numbers.
What comes out
values(ARRAY) - the curve's reading at each position, minimum-to-maximum scale, on one wire for Number List Statistics, Text List Get or a list consumer.positions(ARRAY) - where each value sits along the range, in the same order, so you can plot the pair.value(FLOAT, list wire) - the same values one per run. Wire this into a sampler's denoise or a blend factor and the graph below runs once for each value, rendering the whole curve as a series. This is the output that makes Curve to Numbers a sequencing tool rather than a calculator.count(INT) - how many values exist, which is also how many times the graph undervalueruns.text(STRING) - the values comma-separated on one line (0, 0.5, 1) for Text to Console, a file, or a text input that takes a list of weights.
It's marked an output node, so it executes even if nothing is wired after it - fine when you're just reading values off the panel.
Installing it
Part of WAS Node Suite v3: ComfyUI Manager → search WAS Node Suite v3, or clone into custom_nodes. Nothing else to fetch - no weights, no pip packages. The curve drawing is the pack's own UI on the node.
Fastest way to see it click: set minimum 0, maximum 1, step 0.1, leave the curve straight, and watch values answer 0, 0.1, 0.2 … 1. Then bend the plot and watch the same range redistribute. That's the whole trick.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| curve_points | STRING | The curve, written as '0,0;128,200;255,255' on a 0-255 scale, lowest input first. Drag the plot below to write it by hand, or paste the curve_points an Image Curves node holds, whose composite RGB curve is the one read. Empty is the straight line, which walks the range evenly. | |
| minimum | FLOAT,NUMBER,INT | 0-1000000000–1000000000 | The bottom of the range, and the value the curve reads out at its lowest. 0.0 for a strength or a denoise, -1.0 with a maximum of 1.0 for a move either side of centre. |
| maximum | FLOAT,NUMBER,INT | 1-1000000000–1000000000 | The top of the range, and the value the curve reads out at its highest. 1.0 for a blend factor, 255 for a colour level. Below minimum stops with an error. |
| step | FLOAT,NUMBER,INT | 0.10.000001–1000000000 | The increment from one position to the next, which is what decides how many values there are. 0.1 over 0.0 to 1.0 gives 11 of them. Maximum is included only where the step divides the range exactly, so a step of 0.3 stops at 0.9. |
| decimals | INT | 60–12 | How many decimal places each number is rounded to. This is what keeps 0.30000000000000004 out of a filename or a log line. 0 rounds to whole numbers. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| values | ARRAY | What the curve reads at each position, on one wire and on the minimum to maximum scale, for Number List Statistics, Text List Get and Text List Length. The straight line answers the positions back. |
| positions | ARRAY | Where each value sits along the range, on one wire and in the same order: 0, 0.1, 0.2 and so on for 0.0 to 1.0 by 0.1. Entry 3 here is the position of value 3, which is what plots the pair. |
| value | FLOAT | The same values one per run, so the graph below runs once for each: wire it into a sampler's denoise or a blend factor to render the whole curve as a series. |
| count | INT | How many values there are, which is how many times the graph below the 'value' output runs. 11 for a range of 0.0 to 1.0 by 0.1. |
| text | STRING | The values on one line, separated by commas, as '0, 0.5, 1'. Wire it into Text to Console or Save Text File to keep the numbers a curve produced, or into a text input that takes a list of weights. |