Feature Mixer β‘π ‘π π £π
An audio-compressor-style channel strip for your reactive curve
- feature
- FEATURE
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.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| feature | FEATURE | Input feature to be processed | |
| base_gain | FLOAT | 1.000β10 | Overall amplification of the feature values (0.0 to 10.0) |
| floor | FLOAT | 0.000β1 | Minimum value for the processed feature (0.0 to 1.0) |
| ceiling | FLOAT | 1.000β10 | Maximum value for the processed feature (0.0 to 10.0) |
| peak_sharpness | FLOAT | 1.00.1β10 | Sharpness of peaks in the feature curve (0.1 to 10.0) |
| valley_sharpness | FLOAT | 1.00.1β10 | Sharpness of valleys in the feature curve (0.1 to 10.0) |
| attack | FLOAT | 1.000.01β1 | Speed at which the envelope follower responds to increasing values (0.01 to 1.0) |
| release | FLOAT | 1.000.01β1 | Speed at which the envelope follower responds to decreasing values (0.01 to 1.0) |
| smoothing | FLOAT | 0.000β1 | Amount of smoothing applied to the final curve (0.0 to 1.0) |
| feature_threshold | FLOAT | 0.000β1 | β |
| rise_detection_threshold | FLOAT | 1.000β1 | β |
| rise_smoothing_factor | FLOAT | 0.500.1β5 | β |
| invert_output | BOOLEAN | false | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |