Number Easing
The easing node behind smooth camera moves
- value
- ARRAY
- NUMBER
- floats
- ints
- count
If Number Range hands you a flat list of values, Number Easing is what makes that list move like a real animation. Feed it a series and an easing curve, and it converts the numbers from one range to another while shaping how they accelerate. The classic demo: feed a camera or a denoise a linear 0-to-1 ramp and the motion feels mechanical; run the same ramp through ease_in_out and it eases in, holds, eases out - which reads as deliberate instead of robotic.
It also works in reverse of what you might expect. It isn't an animation-adjacent gimmick; it's a range remapper with taste. The linear curve is literally just a range conversion between input_min/input_max and output_min/output_max. Pick any other curve and the values get redistributed along the way.
How it works
Type numbers into the value box (one per line or comma-separated) or wire a list in - a wire is read instead of the box, so Number Range's ARRAY or NUMBER output feeds a whole series straight in. Every value comes out as a list, which is the point: the graph below runs once per number.
You set four bounds and one mood:
input_min/input_max- the range your source actually produces. 0 and 23 for a 24-frame counter, or whatever Number Range generated.output_min/output_max- what those become. Makeoutput_minlarger thanoutput_maxand the result runs backwards - the easy way to write a fade-out without touching the curve.easing-linear,ease_in,ease_out,ease_in_out, plus theback,elasticandbouncefamilies.clamp- holds every result inside the output range. Leave it on unless overshoot is the whole point.
The gotcha that bites everyone
back and elastic overshoot the output range on purpose - back overshoots about a tenth of the span, elastic almost a whole one. If that result feeds a hard limit, like a denoise that must stay between 0 and 1, your sampler will try to run at denoise 1.8 and do something stupid. Keep clamp on for those; turn it off only where the overshoot is the effect.
Two smaller traps: input_min equal to input_max stops with an error (a range with no width can't say where a value sits in it), and a value outside the input range is pulled to the nearest end first, because the curves are only defined between the bounds. For entries that aren't numbers at all, the unreadable dropdown picks whether to skip them, count them as zero, or stop and name the offender.
Outputs
Every converted value comes out four ways plus a count: ARRAY (whole list on one wire, for the list nodes), NUMBER (one per run - this is the socket that drives a series of renders), floats, and ints. The ints output cuts off rather than rounding, so 7.6 arrives as 7 - ideal for step counts and pixel sizes. count says how many values were converted, which is how many times the graph below runs.
Install and context
Part of WAS Node Suite v3 - ComfyUI Manager, search WAS Node Suite v3, or clone https://github.com/WASasquatch/was-node-suite-comfyui into custom_nodes and restart. Needs ComfyUI 0.14.0+ and Python 3.10+. v3 installs nothing extra: no pip packages, nothing downloaded, all computation on the torch device ComfyUI already runs. That's a deliberate break from v2, whose heavy dependency list caused the pack's historic import failures.
The natural partner is Number Range: generate the series there, then shape it here. Feed the result into anything that takes a NUMBER and you've got a hand-rolled denoise or strength schedule in two nodes. If the numbers look wrong, check the output with Number List Statistics - the mean and range will tell you instantly whether your curve is doing what you thought.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| value | STRING,NUMBER,FLOAT,INT,ARRAY | The numbers to convert, one to a line or separated by commas. A comma is a separator rather than a thousands mark, so 1,000 reads as two values. | |
| easing | COMBO | The curve applied to every value once it has been normalised. `linear` leaves it alone, which turns this node into a plain range conversion. `ease_in` starts slow, `ease_out` finishes slow, `ease_in_out` does both. The `back` and `elastic` families leave the output range on purpose, and `bounce` settles onto it in decreasing hops without ever leaving it. | |
| input_min | FLOAT | 0.00-1000000000–1000000000 | The value that counts as the start of the input range, and the same range is used for every value converted. Set this and input_max to the range the source actually produces, 0 and 23 for a 24-frame counter, or the start and stop of the Number Range feeding it. |
| input_max | FLOAT | 1.00-1000000000–1000000000 | The value that counts as the end of the input range. Equal to input_min stops with an error, since a range of no width cannot say where a value sits in it. |
| output_min | FLOAT | 0.00-1000000000–1000000000 | What the start of the input range becomes. Larger than output_max runs the result backwards, which is how a fade-out is written without touching the curve. |
| output_max | FLOAT | 1.00-1000000000–1000000000 | What the end of the input range becomes. |
| clamp | BOOLEAN | true | Whether each result is held inside the output range. On by default; turn it off where the overshoot of `back` or `elastic` is the point. |
| unreadable | COMBO | What an entry that is not a number does. `skip` leaves it out, `zero` puts 0 in its place, and `error` stops the prompt and names the entry. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| ARRAY | ARRAY | Every converted value on one wire, for Text List Get, Text List Length and the other list nodes. |
| NUMBER | NUMBER | One NUMBER per value. Because this is a list, a node reading it runs once for each. This is the socket that drives a series of renders. |
| floats | FLOAT | The same values as decimals, one per run. |
| ints | INT | The same values as whole numbers, one per run, for a step count or a pixel size. Cut off rather than rounded, so 7.6 arrives as 7. |
| count | INT | How many values were converted, which is how many times the graph below this node runs. |