Nodes/RyanOnTheInside/Particle Size Modulation βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
ComfyUI Node

Particle Size Modulation βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜

Grow or shrink particles over the simulation

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
Particle Size Modulation βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • previous_modulation
  • feature
  • PARTICLE_MODULATION
β—„start_frame0β–Ί
β—„end_frame0β–Ί
β—„effect_duration0β–Ί
β—„temporal_easingβ–Ύβ–Ί
β—„palindromefalseβ–Ί
β—„randomfalseβ–Ί
β—„target_size20.0β–Ί

The sibling to ParticleColorModulation, aimed at size instead of color: particles that start at whatever ParticleEmitter's particle_size set them to, then grow or shrink toward a target_size over a defined window. Think sparks that shrink to nothing as they age, or a bloom effect where particles swell as a track builds - the kind of thing that reads as "alive" rather than a static sprite spray.

How it works

Same timing machinery as the other particle modulators in this pack: start_frame/end_frame (or effect_duration as an alternative way to size the window) plus temporal_easing (ease_in_out, linear, bounce, elastic, none) shape the ramp, and palindrome plays the size change forward then back within that window rather than holding at the target. random swaps the smooth, deterministic interpolation for a random pick between the starting size and target_size on each application - useful for a flickery, less uniform look instead of a clean scale-up.

target_size (default 20, up to 400) is the size particles converge toward - note this shares the same units as ParticleEmitter's own particle_size field, so set it relative to whatever size you gave particles at spawn.

The two optional inputs make this composable: previous_modulation chains earlier modulations (color, speed, or another size modulation) into one combined PARTICLE_MODULATION, and feature lets an external FEATURE signal - audio amplitude, MIDI velocity, whatever's already flowing through your graph - drive the size change instead of a fixed frame window, so particles can visibly pulse in size on a beat rather than growing on a hardcoded schedule.

The inputs and outputs that matter

  • target_size (default 20, 0–400) - the size particles converge toward.
  • start_frame/end_frame/effect_duration - the modulation window.
  • temporal_easing / palindrome / random - how the change 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 size change 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. Runs on pymunk, pinned tightly (>=6.8.0,<7.0.0) in requirements.txt - a version conflict there is a real, known way for the particle-system side of this pack to fail on install.

Common issues & troubleshooting

Node runs but particle size never changes. It needs to be wired into ParticleEmitter's particle_modulation input - this node only produces a definition, the actual size change happens during simulation in ParticleEmissionMask.

Growth looks abrupt rather than gradual. That's temporal_easing set to linear or none - switch to ease_in_out for a smoother ramp, or check that effect_duration/end_frame isn't set too short relative to your total sequence length, which compresses the whole transition into a handful of frames.

Combined with a previous_modulation chain and sizes look off. Modulations in a chain apply in sequence, not independently - if size looks wrong, temporarily unplug the earlier links to confirm this node alone behaves as expected before re-adding the rest of the chain.

CategoryRyanOnTheInside/ParticleSystems/Modulators/ParticleModulators

Inputs (9)

NameTypeDefaultDescription
start_frameINT00–1000Frame to start the modulation effect (0 to 1000)
end_frameINT00–1000Frame to end the modulation effect (0 to 1000)
effect_durationINT00–1000Duration of the modulation effect in frames (0 to 1000)
temporal_easingCOMBOEasing function for the modulation effect ('ease_in_out', 'linear', 'bounce', 'elastic', 'none')
palindromeBOOLEANfalseWhether to reverse the modulation effect after completion
randomBOOLEANfalseWhen enabled, selects random values between start and target
target_sizeFLOAT20.00–400Target size for particles at the end of the modulation (0.0 to 400.0)
previous_modulationoptPARTICLE_MODULATIONOptional previous modulation to chain with (PARTICLE_MODULATION type)
featureoptFEATUREOptional feature to drive the modulation (FEATURE type)

Outputs (1)

NameTypeDescription
PARTICLE_MODULATIONPARTICLE_MODULATIONβ€”