Emitter Emission Rate Modulation β‘π ‘π π £π
Ramp a particle emitter's output rate over time
- previous_modulation
- feature
- EMITTER_MODULATION
Part of the pack's particle-system side, built on the pymunk physics engine listed in its requirements - the same subsystem behind the audio-reactive particle simulations the author has demoed publicly (gravity wells, vortices, spring joints, multiple independent emitters). This specific node controls one thing: how many particles per frame an emitter is spitting out, and how that rate changes over a time window instead of staying fixed for the whole simulation.
How it works
You define a frame window with start_frame/end_frame (0 for end_frame means "until the end"), and within effect_duration frames the emission rate ramps toward target_emission_rate, shaped by temporal_easing. That's a real choice of curves - linear for a constant ramp, ease_in_out for a smoother accelerate-then-decelerate, bounce and elastic for springier, overshooting motion, or none for an instant step change. Two booleans add variation on top: palindrome plays the ramp forward then reverses it within the same window (rate rises then falls back, rather than just rising and holding), and random picks random values between the start and target instead of following the smooth curve.
The two optional inputs are what make this genuinely composable. previous_modulation lets you chain multiple EmitterEmissionRateModulation nodes together - stack a slow build-up in the first half of a clip with a sharp burst in the second, each as its own node. feature lets an external FEATURE signal (audio, brightness, a hand-drawn curve - anything the pack's Feature system produces) drive the modulation directly instead of relying purely on the fixed easing curve.
The inputs and outputs that matter
start_frame/end_frame(default 0 / 0, range 0β1000) - the frame window the effect applies over; 0 forend_framemeans until the end.effect_duration(default 0, range 0β1000) - frames over which the ramp happens; 0 means the full range.temporal_easing-ease_in_out,linear,bounce,elastic, ornone.palindrome(BOOLEAN, default false) - "the effect plays forward then reverses within the specified duration."random(BOOLEAN, default false) - "selects random values between start and target."target_emission_rate(default 50, range 0.1β100) - target rate in particles/frame.previous_modulation(optional, EMITTER_MODULATION) - chain onto an earlier modulation.feature(optional, FEATURE) - drive the modulation from an external reactive signal instead of the fixed curve.
Output: a single EMITTER_MODULATION, which feeds into the pack's base particle-emitter node to actually control its emission rate over the simulation.
How to install it
Via ComfyUI Manager: search "RyanOnTheInside," install, restart. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside.git
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt
then restart. The particle system runs on pymunk, a pure-Python physics library pinned in the pack's requirements - no separate model download, but make sure the pinned version range installs cleanly, since a version mismatch here is the most likely install-time failure for the particle-system nodes specifically.
Common issues & troubleshooting
Nothing seems to happen when this is wired in. Confirm this node's EMITTER_MODULATION output actually reaches the emitter node it's meant to control - a modulation node sitting disconnected from the emitter does nothing on its own.
Chained modulations don't behave the way you expect. previous_modulation composes modulations, it doesn't average or override them silently - think through the order you're chaining in, since a later modulation in the chain is layering on top of, not replacing, the earlier one.
Feature-driven modulation looks erratic. Check what's actually feeding feature - a noisy raw signal (say, an unshaped audio amplitude curve) will produce an erratic emission rate. Consider smoothing it upstream, or reach for one of the pack's shaped extractors (like BeatWaveFeatureExtractor) instead of a raw analysis signal if you want something more predictable.
bounce/elastic easing looks too extreme. Those curves overshoot the target on purpose - if the effect reads as too bouncy for your scene, ease_in_out or linear give a calmer ramp without the overshoot.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| start_frame | INT | 00β1000 | Frame number where the effect begins (0 to 1000) |
| end_frame | INT | 00β1000 | Frame number where the effect ends (0 to 1000, 0 means until end) |
| effect_duration | INT | 00β1000 | Number of frames over which the effect is applied (0 to 1000, 0 means full range) |
| temporal_easing | COMBO | Controls how the effect strength changes over time ('ease_in_out', 'linear', 'bounce', 'elastic', 'none') | |
| palindrome | BOOLEAN | false | When enabled, the effect plays forward then reverses within the specified duration |
| random | BOOLEAN | false | When enabled, selects random values between start and target |
| target_emission_rate | FLOAT | 50.00.1β100 | Target emission rate at the end of the modulation (0.1 to 100.0 particles/frame) |
| previous_modulationopt | EMITTER_MODULATION | Optional previous modulation to chain with (EMITTER_MODULATION type) | |
| featureopt | FEATURE | Optional feature to drive the modulation (FEATURE type) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| EMITTER_MODULATION | EMITTER_MODULATION | β |