Manual Feature Node β‘π ‘π π £π
Hand-keyframe a Flex Feature curve
- FEATURE
Not every Flex Feature curve needs to come from audio analysis or motion detection - sometimes you just want to type in "at frame 0 it's 0, at frame 10 it's 0.5, at frame 20 it's 1" and get a smooth curve out. That's exactly what this node is: manual, hand-keyframed feature creation, no upstream analysis required. It's the simplest, most self-contained way to get a FEATURE flowing into any of the pack's feature-driven nodes.
Why you'd reach for it
Two situations, mainly. First, testing: before you wire up a full audio-analysis pipeline, drop this in with a rough guess at the curve shape you want, and you can validate the rest of your graph reacts the way you expect. Second, deliberate manual control: sometimes you know exactly when you want an effect to ramp up - not because the audio hits a beat there, but because that's when the story beat lands - and typing keyframes directly is more precise than fighting an automated feature extractor into producing the timing you already have in your head.
This node is the all-in-one version: it bundles its own frame rate, frame count, and resolution, so you don't need a separate pipe node feeding it. If you're already working with a shared FEATURE_PIPE elsewhere in your graph (so frame rate/count/size stay consistent across several feature sources), the sibling node ManualFeatureFromPipe does the same keyframing job but reads those dimensions from the pipe instead of duplicating them here.
The inputs that matter
frame_rate(default 30, 1β120) andframe_count(default 30, up to 999999) - how long the curve is and how it's timed.width/height(default 512, 64β4096) - the feature's associated resolution; match these to your actual output if the feature is meant to represent something spatial.frame_numbers(default"0,10,20") - comma-separated keyframe positions.values(default"0.0,0.5,1.0") - the value at each of those keyframes, matched by position toframe_numbers.last_value(default 1) - what the curve does after your last explicit keyframe, out toframe_count.interpolation_method(none/linear/ease_in/ease_out) - how the curve moves between keyframes.nonegives you a stepped curve (hard jumps at each keyframe);linearis a straight ramp; the ease variants give it a soft start or soft landing.extraction_method- locked tomanual, since this node doesn't extract anything, it's purely hand-defined.
Output is a single FEATURE - wire it into LocationTransform, InstantFloatPreview to sanity-check it, or any other Flex-Feature-consuming node in the pack.
How to install it
The pack's README came back empty when I checked for install specifics, so the standard path applies:
ComfyUI Manager: search "RyanOnTheInside", install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
Restart ComfyUI afterward.
Troubleshooting
The most common trip-up is a length mismatch: frame_numbers and values need the same number of comma-separated entries, or the keyframes won't line up the way you expect. If a keyframe past frame_count never seems to matter, that's expected - the curve only runs out to frame_count, and anything beyond your last real keyframe just holds at last_value. And if your curve looks blocky when you wanted it smooth, check interpolation_method first - it defaults to none, which is a stepped curve, not a ramp; switch to linear or one of the ease modes for anything continuous.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| extraction_method | COMBO | Method used to extract features | |
| frame_rate | FLOAT | 30.01β120 | Frame rate of the video (1.0 to 120.0 fps) |
| frame_count | INT | 301β999999 | Total number of frames (minimum: 1) |
| width | INT | 51264β4096 | Width of the output feature (64 to 4096) |
| height | INT | 51264β4096 | Height of the output feature (64 to 4096) |
| frame_numbers | STRING | 0,10,20 | Comma-separated list of frame numbers (e.g., "0,10,20") |
| values | STRING | 0.0,0.5,1.0 | Comma-separated list of values (e.g., "0.0,0.5,1.0") |
| last_value | FLOAT | 1.00 | Value for the last frame (default: 1.0) |
| interpolation_method | COMBO | none | Method for interpolating between values ('none', 'linear', 'ease_in', 'ease_out') |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |