Nodes/RyanOnTheInside/***BETA*** Spline Feature Modulator βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
ComfyUI Node

***BETA*** Spline Feature Modulator βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜

Make a dot race along a hand-drawn path, speed set by audio or motion

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
***BETA*** Spline Feature Modulator βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • feature
  • mask
  • coord_str
  • float
  • count
  • normalized_str
β—„coordinatesβ€”β–Ί
β—„mask_width512β–Ί
β—„mask_height512β–Ί
β—„min_speed0.1β–Ί
β—„max_speed1.0β–Ί
β—„float_output_typelistβ–Ί
β—„min_value0.00β–Ί
β—„max_value1.00β–Ί

This one lives in the "Spline" corner of RyanOnTheInside's Flex Features system, and it's marked BETA in the node picker - worth knowing going in, since it means the exact behavior may shift under you across updates. What it does, though, is a genuinely useful idea: you draw a path, feed it a FEATURE (audio loudness, motion, MIDI velocity, whatever this pack's audio-reactive nodes hand you), and a point travels along that path faster or slower depending on how strong the feature is right now. Loud part of the song, the dot sprints; quiet part, it crawls. Out comes a mask you can composite, plus the raw numbers if you need them elsewhere.

RyanOnTheInside is a well-known name in the ComfyUI audio/motion-reactive space - the whole pack's pitch is "everything reacts to everything," and this node is a literal example of that: turn any measurable signal into physical motion along a path you drew.

How it works

coordinates is a JSON string of spline control points - in practice you get this from the pack's own spline-drawing interface rather than typing coordinates by hand (the README calls out "Manual Feature Creation" as one of its bigger V2 additions). feature is your driving signal. The node maps the feature's current value onto a travel speed somewhere between min_speed and max_speed, and a marker moves along the spline accordingly - this is the "feature" modulator, as opposed to its sibling SplineRhythmModulator, which maps the feature to position and rhythm instead of raw speed.

The inputs and outputs that matter

The knobs you'll actually touch: min_speed and max_speed (0–10, defaults 0.1 and 1) set the floor and ceiling of how fast the dot can move - widen the gap for more dramatic reactivity, narrow it for something subtle. mask_width/mask_height (default 512, up to 4096) just set the resolution of the output mask canvas - match your actual render size. float_output_type picks the shape of the raw numeric output: list, pandas series, or tensor - most Flex-compatible nodes downstream want tensor, so leave it there unless something specifically asks for the others. The optional min_value/max_value rescale the output float and its string form into whatever range you actually need (default 0–1), handy if a downstream node expects, say, -1 to 1.

Five outputs come out: mask is the position marker rendered onto a blank canvas - feed this into something like TranslucentComposite to actually paint a moving glow or light onto a real image. float is the raw driving value. coord_str and normalized_str are string forms of the coordinate/position data (the normalized one respects your min_value/max_value). count tells you how many points/samples got generated.

How to install it

Via ComfyUI Manager, search "RyanOnTheInside." Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside.git
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt

Restart ComfyUI after. This node itself needs nothing exotic beyond what the pack pulls in generally (opencv, scipy, matplotlib and friends) - no model downloads, it's all math.

Common issues & troubleshooting

Don't hand-write the coordinates JSON - it needs to match the exact structure the spline editor emits, and typos here tend to fail silently or produce a mask that's just wrong rather than a clear error. Use the pack's drawing interface.

If you don't have a real audio or motion feature wired up yet and just want to test the mechanics, feed it one of the pack's Time features instead (Pulse or Sawtooth work well for an obviously visible test) - cheaper than debugging your audio pipeline and this node's plumbing at the same time.

And remember it's beta: if an update changes a default or a tooltip's wording out from under you, that's expected here more than elsewhere in the pack - check the node's ? docs icon after pulling updates before assuming your workflow broke.

CategoryRyanOnTheInside/FlexFeatures/Targets/ExternalTargets/Spline

Inputs (9)

NameTypeDefaultDescription
coordinatesSTRINGJSON string containing spline control points
featureFEATUREInput feature for modulation
mask_widthINT5128–4096Width of the output mask (8 to 4096)
mask_heightINT5128–4096Height of the output mask (8 to 4096)
min_speedFLOAT0.10–10Minimum speed of movement along the spline (0.0 to 10.0)
max_speedFLOAT1.00–10Maximum speed of movement along the spline (0.0 to 10.0)
float_output_typeCOMBOlistType of float output ('list', 'pandas series', 'tensor')
min_valueoptFLOAT0.00-10000–10000Optional minimum value for normalization
max_valueoptFLOAT1.00-10000–10000Optional maximum value for normalization

Outputs (5)

NameTypeDescription
maskMASKβ€”
coord_strSTRINGβ€”
floatFLOATβ€”
countINTβ€”
normalized_strSTRINGβ€”