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

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

An audio-compressor-style channel strip for your reactive curve

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
Feature Mixer βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • feature
  • FEATURE
β—„base_gain1.00β–Ί
β—„floor0.00β–Ί
β—„ceiling1.00β–Ί
β—„peak_sharpness1.0β–Ί
β—„valley_sharpness1.0β–Ί
β—„attack1.00β–Ί
β—„release1.00β–Ί
β—„smoothing0.00β–Ί
β—„feature_threshold0.00β–Ί
β—„rise_detection_threshold1.00β–Ί
β—„rise_smoothing_factor0.50β–Ί
β—„invert_outputfalseβ–Ί

If you only learn one Feature Modulator node in this pack, make it this one. Feature Mixer rolls gain, range clamping, curve reshaping, and attack/release envelope smoothing into a single node - the same vocabulary you'd find on an audio compressor or a synth's envelope generator, applied to a reactive curve instead of a waveform. Where a lot of the other modulator nodes each do one thing, this one is the whole channel strip.

If you're new to the RyanOnTheInside pack (Ryan / u/ryanontheinside, also behind ComfyStream and Daydream's real-time reactive video work): a FEATURE is a per-frame value curve, produced by a Feature Extraction node from a source like audio or motion, then reshaped by Feature Modulator nodes before it drives a Flex node's parameter (FlexImage, FlexMask, FlexParticles) or an external target.

How it works

The signal path runs roughly gain β†’ clamp β†’ curve shape β†’ envelope β†’ smooth. base_gain amplifies the whole feature first. floor and ceiling clamp the result into a range (and note ceiling can go up to 10, well past the usual 0–1 you'd expect - useful if you deliberately want to push values past 1 for a downstream node that expects a wider range). peak_sharpness and valley_sharpness reshape the extremes of the curve independently - crank peak_sharpness and the tops of the curve get punchier and more defined; do the same to valley_sharpness and the troughs get more pronounced.

Then comes the envelope follower: attack controls how fast the output responds when the feature is rising (fast attack snaps to a hit immediately; slow attack softens the onset), and release controls how fast it falls back down once the feature drops (slow release leaves a lingering decay after a spike, exactly like a reverb tail or a synth's envelope release stage). smoothing applies a final pass of smoothing on top of everything. Three more parameters - feature_threshold, rise_detection_threshold, and rise_smoothing_factor - refine what counts as a genuine "rise" worth reacting to and how that specific rising edge gets smoothed; the pack doesn't document their exact internals beyond the parameter names, so the practical approach is to nudge them and watch the result with a Feature Info Node on the output rather than assume a precise formula.

Inputs and outputs that matter

The ones you'll actually touch first: base_gain (0–10, default 1) for overall sensitivity, floor/ceiling (0–1 / 0–10, defaults 0/1) to clamp the range, and attack/release (0.01–1 each, default 1) for how snappy versus lingering the response feels. Beyond those: peak_sharpness/valley_sharpness (0.1–10, default 1) for extreme-value shaping, smoothing (0–1, default 0) for a final denoise pass, and feature_threshold/rise_detection_threshold/rise_smoothing_factor for finer control over rise behavior. invert_output flips everything at the end.

Output is a single FEATURE - the fully shaped curve, ready for a Flex node's optional feature input.

Installing it

Via 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

Pure math on an already-extracted feature - no models or GPU work of its own, though it ships with the pack's full dependency set.

Where people get tripped up

If a v1-to-v2 update leaves the pack broken, the README's fix is a full uninstall and reinstall, not a git pull.

With this many parameters, the most common mistake is changing several at once and losing track of which one caused the result to look wrong. Start from the defaults, adjust base_gain and attack/release first - those three account for most of the character difference you're chasing - and only bring in peak_sharpness/valley_sharpness/smoothing once the basic response feels right. If the output feels flat no matter what you do, check ceiling: because it can go past 1, it's easy to leave it too low relative to base_gain, silently clamping away exactly the range you just amplified.

CategoryRyanOnTheInside/FlexFeatures/FeatureModulators

Inputs (13)

NameTypeDefaultDescription
featureFEATUREInput feature to be processed
base_gainFLOAT1.000–10Overall amplification of the feature values (0.0 to 10.0)
floorFLOAT0.000–1Minimum value for the processed feature (0.0 to 1.0)
ceilingFLOAT1.000–10Maximum value for the processed feature (0.0 to 10.0)
peak_sharpnessFLOAT1.00.1–10Sharpness of peaks in the feature curve (0.1 to 10.0)
valley_sharpnessFLOAT1.00.1–10Sharpness of valleys in the feature curve (0.1 to 10.0)
attackFLOAT1.000.01–1Speed at which the envelope follower responds to increasing values (0.01 to 1.0)
releaseFLOAT1.000.01–1Speed at which the envelope follower responds to decreasing values (0.01 to 1.0)
smoothingFLOAT0.000–1Amount of smoothing applied to the final curve (0.0 to 1.0)
feature_thresholdFLOAT0.000–1β€”
rise_detection_thresholdFLOAT1.000–1β€”
rise_smoothing_factorFLOAT0.500.1–5β€”
invert_outputBOOLEANfalseβ€”

Outputs (1)

NameTypeDescription
FEATUREFEATUREβ€”