Time Feature β‘π ‘π π £π
A built-in curve generator for when you want a Flex signal but don't have audio
- FEATURE
Every Flex target node in this pack (FlexImageWarp, FlexImageDepthWarp, FlexImageParallax, and others) wants an optional FEATURE input to modulate itself with. Usually that comes from analyzing something - audio, motion, color. This node skips analysis entirely and just generates a repeating curve over time, no external signal required. It's the pack's own built-in LFO: pick a shape, a period, and it hands you a FEATURE you can wire straight into any target's opt_feature.
The shapes
extraction_method picks the curve: smooth is a linear ramp; accelerate ramps at an increasing rate; pulse oscillates periodically; sawtooth rises steadily then drops sharply back to start; bounce emulates a bouncing, springy motion; square switches cleanly between two states each cycle rather than ramping. These map directly onto how the underlying parameter will move once wired into a target node - a bounce curve driving warp_strength on FlexImageWarp will bounce, not ramp.
Inputs and outputs that matter
extraction_method- the curve shape, as above.frame_rateandframe_count- the total length and rate the curve is generated over, matched to your video.frames_per_cycle- how many frames one full repeat of the pattern takes.offset(0.0-1.0) - shifts the starting phase of the cycle, useful if you're layering multiple Time Features and don't want them all peaking at the same frame.width/height- sizes the internalFEATUREtensor; keep this consistent with the resolution of whatever you're driving downstream.
Output is a single FEATURE.
Why you'd use this over an audio-driven feature
Two real reasons. First, when you genuinely don't have or want audio driving the effect - a deterministic, reproducible pulse or drift that doesn't depend on a track. Second, and underrated: while you're dialing in a Flex target node's strength/feature_threshold/feature_mode settings, a Time Feature gives you a predictable, repeatable test signal instead of whatever your source audio happens to be doing at that moment - much easier to reason about what's actually changing.
Installing it
ComfyUI Manager: search RyanOnTheInside, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt
Pure math, no model downloads or extra dependencies beyond the base pack install.
Where people get burned
If frames_per_cycle doesn't evenly divide frame_count, you get a partial, cut-off cycle at the end - harmless for most one-shot clips, but a problem if you need the output to loop cleanly (a looping GIF or seamless video background). Pick values that divide evenly if a perfect loop matters. And width/height here aren't a visual setting - they just size the internal feature tensor - but a mismatch against your actual image dimensions downstream can cause a target node to complain or silently resample, so keep them matched to your pipeline's resolution rather than treating them as arbitrary.
Inputs (7)
| 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) |
| frames_per_cycle | INT | 301β1000 | β |
| offset | FLOAT | 0.000β1 | Shifts the starting point of the effect (0.0 to 1.0) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |