Confetti


Here's a little expression-based particle system that should work fine for confetti. Each layer becomes a "particle" that gets reused when its life expires. Create a small solid layer (say 15x15). Make it 3D. Apply a point control to the layer. Add this expression to the point control:


life=1.8;  //life of particle

seed_random(1,true);
delay=random(life);
if(time < delay){
  age=0;
  seed=0;
}else{
  age=(time-delay)%life;
  seed=Math.floor((time-delay)/life)+3;
}  
[seed,age]

Add this expression to the position property:


min_speed=150;  //minimum speed in y direction (pixels per second)
max_speed=200;
max_drift=100;  // maximum drift in x direction

seed=Math.round(effect("Point Control").param("Point")[0]);
age=effect("Point Control").param("Point")[1];
if(seed==0){
  [0,-20,0]
}else{
  seed_random(seed,true);
  curr_speed=random(min_speed,max_speed);
  drift=random(-max_drift,max_drift);
  origin=[random(0,this_comp.width),-20,0];
  origin  + [age*drift,age*curr_speed,0];
}

Add this expression to the orientation property:


m=360; //max rotation speed in degrees per second

seed=Math.round(effect("Point Control").param("Point")[0]);
age=effect("Point Control").param("Point")[1];
if (seed==0){
  [0,0,0]
}else{
  seed_random(seed,true);
  rot_speed=random([-m,-m,-m],[m,m,m])
  init_orient=random([360,360,360]);
  init_orient + rot_speed*age
}

Finally, add this expression to the z-rotation property:


m=360; //max rotation speed in degrees per second

seed=Math.round(effect("Point Control").param("Point")[0]);
age=effect("Point Control").param("Point")[1];
if (seed==0){
  0
}else{
  seed_random(seed,true);
  rot_speed=random(-m,m)
  rot_speed*age
}

Adjust min_speed, max_speed, max_drift, and the two rotation parameters (m) to suit your needs. If you decrease min_speed, you may have to increase the "life" parameter of the point control or the particles may disappear as they reach the bottom of the page. Duplicate this layer until you have enough particles (50 to 100 maybe?).