Particle Color Modulation β‘π ‘π π £π
Shift your particles' color over the simulation
- previous_modulation
- feature
- PARTICLE_MODULATION
ParticleEmitter gives particles a starting color; this node makes that color change as the simulation runs. Think embers cooling from white-hot to red, or a color mood shift as a track builds - particles that start one color and drift toward another over a defined window, either on a fixed schedule or driven by an external reactive signal.
How it works
Like most of this pack's particle modulators, it uses a fixed timing window: start_frame/end_frame (or effect_duration as an alternative way to size that window) plus temporal_easing (ease_in_out, linear, bounce, elastic, none) shape how the transition ramps in and out. palindrome plays the modulation forward then reverses it within that window instead of holding at the target. random, when enabled, picks a random value between the starting color and target_color each time rather than a smooth, deterministic interpolation - useful if you want flickering variation instead of a clean gradient shift.
target_color is a literal RGB string, (255,255,255) by default - set it to whatever hue you want particles converging toward.
The two optional inputs are what make this composable rather than a one-off effect. previous_modulation chains modulations together - the same pattern used throughout this pack's force fields and emitters - so you can stack a color shift and a size shift and a speed shift into one combined modulation set, applied in sequence. feature lets an external FEATURE signal (from AudioFeatureExtractor, RhythmFeatureExtractor, or any other Feature source in the pack) drive the modulation instead of running purely on the fixed frame window - so the color shift can happen on a beat rather than a hardcoded timestamp.
The inputs and outputs that matter
target_color(default(255,255,255)) - the color particles converge toward.start_frame/end_frame/effect_duration- the modulation window.temporal_easing/palindrome/random- how the transition plays out.previous_modulation(optional,PARTICLE_MODULATION) - chain in earlier modulations.feature(optional,FEATURE) - drive the modulation reactively.
Output is a single PARTICLE_MODULATION, which plugs into ParticleEmitter's particle_modulation input to actually apply the color shift in the simulation.
How to install it
ComfyUI Manager: search "RyanOnTheInside", install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt
then restart. The particle system runs on pymunk, pinned tightly in requirements.txt (>=6.8.0,<7.0.0) - a version mismatch there is a real, known source of install-time trouble specifically for this side of the pack.
Common issues & troubleshooting
Modulation node built, but nothing changes when you run the workflow. This node produces a definition, not the effect itself - it needs to actually be wired into ParticleEmitter's particle_modulation input (directly, or as the last link in a previous_modulation chain) before it does anything.
Chained several modulations and the result looks nothing like any single one. Chained modulations apply in sequence, not in isolation - if you're debugging a specific color behavior, temporarily disconnect the chain back to just this node alone to confirm it looks right before re-adding the rest.
Wired in a feature but the color still just follows the fixed timing. Double check the feature is actually connected end to end - with no feature input, this node quietly falls back to its own start_frame/end_frame/temporal_easing schedule, which can look identical to a badly-wired feature at a glance.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| start_frame | INT | 00β1000 | Frame to start the modulation effect (0 to 1000) |
| end_frame | INT | 00β1000 | Frame to end the modulation effect (0 to 1000) |
| effect_duration | INT | 00β1000 | Duration of the modulation effect in frames (0 to 1000) |
| temporal_easing | COMBO | Easing function for the modulation effect ('ease_in_out', 'linear', 'bounce', 'elastic', 'none') | |
| palindrome | BOOLEAN | false | Whether to reverse the modulation effect after completion |
| random | BOOLEAN | false | When enabled, selects random values between start and target |
| target_color | STRING | (255,255,255) | Target color for particles at the end of the modulation (RGB tuple) |
| previous_modulationopt | PARTICLE_MODULATION | Optional previous modulation to chain with (PARTICLE_MODULATION type) | |
| featureopt | FEATURE | Optional feature to drive the modulation (FEATURE type) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PARTICLE_MODULATION | PARTICLE_MODULATION | β |