Feature Oscillator β‘π ‘π π £π
Add a steady pulse under (or instead of) your reactive signal
- feature
- FEATURE
Not every reactive effect should be entirely at the mercy of your audio or motion data - sometimes you want a steady, predictable pulse underneath it, the way a synth pad has an LFO ticking away regardless of what else is happening in the mix. Feature Oscillator generates a periodic wave - sine, square, sawtooth, or triangle - and blends it with an input feature, so you can layer rhythmic, data-independent motion on top of (or in place of) whatever's actually driving the rest of your reactivity.
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, extracted from a source and reshaped by Feature Modulator nodes like this one before it drives a Flex node's parameter or an external target.
How it works
The node generates a waveform of the type you pick (sine for smooth up-and-down motion, square for a hard on/off pulse, sawtooth for a ramp-and-snap pattern, triangle for a linear up-and-down) at your chosen frequency and amplitude, with phase_shift letting you offset where in the cycle it starts. blend then mixes that generated wave with your input feature - at 0 the output is entirely the original feature, at 1 it's entirely the oscillator, and values in between mix the two.
Inputs and outputs that matter
feature(required) - the input curve the oscillator blends against. This is required even if you want something close to a pure oscillator - pushblendtoward 1 to minimize the input feature's contribution.oscillator_type-sine,square,sawtooth, ortriangle.frequency(0.1β10, default 1) - how fast the wave cycles.amplitude(0.0β1.0, default 0.5) - how large the wave's swing is.phase_shift(0 to 2Ο, default 0) - where in the cycle the wave starts.blend(0.0β1.0, default 0.5) - the mix between the original feature and the generated oscillation.invert_output- flips the result.
Output is a single FEATURE, ready to wire into 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 signal generation and math - no models, no GPU work, no audio-processing dependencies of its own, though it ships with the pack's full requirements set.
Where people get tripped up
If a v1-to-v2 update leaves the pack broken, the README's fix is a clean uninstall and reinstall rather than a git pull.
The most common confusion with this node is frequency's units: neither the tooltip nor the README pins down whether it's cycles-per-second or cycles-across-the-whole-clip, and the node has no awareness of your source audio's actual tempo or duration - it only sees the feature curve it's given. Don't expect it to auto-sync to your track's BPM. Treat frequency as a dial you tune by eye against a preview render rather than a value you can calculate up front, and re-check it any time your clip length changes, since the same value can read as a slow drift on a short clip and a rapid flicker on a long one (or vice versa) depending on which convention the node actually uses.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| feature | FEATURE | Input feature to be processed | |
| oscillator_type | COMBO | Type of oscillation ("sine", "square", "sawtooth", "triangle") | |
| frequency | FLOAT | 1.00.1β10 | Frequency of oscillation (0.1 to 10.0) |
| amplitude | FLOAT | 0.500β1 | Amplitude of oscillation (0.0 to 1.0) |
| phase_shift | FLOAT | 0.00β6.283185307179586 | Phase shift of oscillation (0.0 to 2Ο) |
| blend | FLOAT | 0.500β1 | Blend factor between original feature and oscillation (0.0 to 1.0) |
| invert_output | BOOLEAN | false | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |