Nodes/RyanOnTheInside/Feature Accumulate βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
ComfyUI Node

Feature Accumulate βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜

Turn bursty audio hits into a smooth building ramp

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
Feature Accumulate βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • feature
  • FEATURE
β—„start0.00β–Ί
β—„end1.00β–Ί
β—„threshold0.00β–Ί
β—„skip_thresholdedfalseβ–Ί
β—„invert_outputfalseβ–Ί
β—„frames_window0β–Ί
β—„deccumulatefalseβ–Ί

Some reactive signals are naturally bursty - an audio onset feature spikes on every beat and drops back to near-zero in between. That's great for a flash, bad for anything you want to feel like it's building. Feature Accumulate is how you turn "spike, spike, spike" into "climbing" - it runs a total across frames instead of reacting to each frame in isolation, so an effect can gradually intensify over the course of a song rather than jittering with every hit.

To orient yourself: this pack (RyanOnTheInside, by Ryan / u/ryanontheinside, also the person behind ComfyStream and Daydream's real-time reactive video work) treats a FEATURE as a per-frame value curve - the same idea as an audio envelope or a DAW automation lane. A handful of Feature Extraction nodes turn raw sources (audio, MIDI, motion, depth…) into that curve; Feature Modulator nodes like this one reshape it before it drives a Flex node's parameter (FlexImage, FlexMask, FlexParticles, and friends) or an external target.

How it works

The node walks the feature frame by frame, summing values as it goes, then remaps that running total into your start–end output range. threshold sets a floor below which a frame's value doesn't count toward the total; with skip_thresholded on, sub-threshold frames are skipped entirely rather than contributing a small amount. frames_window lets you accumulate in chunks instead of across the whole clip - set it above 0 and the accumulation resets every N frames instead of running for the full length. Turn on deccumulate and the direction alternates between windows, so instead of a sawtooth that snaps back to zero each reset, you get a bounce - up for one window, down for the next.

Inputs and outputs that matter

  • feature (required) - the curve you're accumulating.
  • start / end (0.0–1.0, default 0/1) - the range the accumulated output gets normalized into.
  • threshold (0.0–1.0, default 0) - the minimum per-frame value to count toward the running total.
  • skip_thresholded - whether sub-threshold frames are ignored outright rather than counted as a small contribution.
  • frames_window (default 0, meaning "all frames") - chunk size for a windowed, resetting accumulation.
  • deccumulate - alternates accumulation direction between windows for a bounce effect instead of a sawtooth reset.

Output is a single FEATURE - the accumulated curve, ready to plug into a Flex node's optional feature input or into another modulator downstream.

Installing it

ComfyUI Manager: search RyanOnTheInside. Manual install:

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

This node is pure numpy-style math on an already-extracted feature - it doesn't need the audio/MIDI/optical-flow dependencies itself, but they come along with the pack's single requirements file regardless.

Where people get tripped up

The README notes update problems going from v1 to v2 - if things break after an update, a full uninstall/reinstall is the documented fix, not a partial git pull.

Specific to this node: it's easy to leave frames_window at 0 without realizing that means "accumulate over the entire clip." On a long track, that produces a curve that barely moves for the first two-thirds of the video and only becomes interesting near the end, because the running total needs the whole clip to reach your end value. If you want the buildup to repeat - say, once per verse or once every 8 bars - set frames_window to that section's frame length instead of leaving it global. And if the output feels like it's climbing too smoothly and losing the beat's punch, check threshold: a value of 0 means every frame contributes, even quiet ones, which can wash out the accumulation's connection to the actual hits.

CategoryRyanOnTheInside/FlexFeatures/FeatureModulators

Inputs (8)

NameTypeDefaultDescription
featureFEATUREInput feature to accumulate
startFLOAT0.000–1Starting value for normalized output (0.0 to 1.0)
endFLOAT1.000–1Ending value for normalized output (0.0 to 1.0)
thresholdFLOAT0.000–1Minimum value to consider for accumulation (0.0 to 1.0)
skip_thresholdedBOOLEANfalseWhether to skip values below threshold
invert_outputBOOLEANfalseβ€”
frames_windowINT00–9999Number of frames to process at once (0 for all frames)
deccumulateBOOLEANfalseWhether to alternate accumulation direction between windows

Outputs (1)

NameTypeDescription
FEATUREFEATUREβ€”