/Gallery Web demo All effects ← Site

Analog Rotation

The tonearm rides a turning record.

Astra Kinetic · every moving shape in it is evaluated by the rule, not drawn · 256×192 grid · 48-step seamless loop

Analog Rotation — animated pixel art loop generated in Phluxel
One painted still, one rule, 48 steps. Every frame above came out of the simulation.

The rule that makes it move

This is the whole thing. Phluxel runs it on every cell, every step — the animation is what happens when you repeat it. BASE is the painted scene, so the rule reads the artwork instead of its own output and never smears.

Analog RotationPhlux
// Astra scene. _sx/_sy rescale the 256x192 coordinates to any grid size.
PARAM _motion=1
LET _sx = 256/GW
LET _sy = 192/GH
LET _p={FRAC,TICK*_motion/48}
LET _t=_p*6.283185307179586
LET _r=BASE.R
LET _g=BASE.G
LET _b=BASE.B
LET _dx=X*_sx-105
LET _dy=(Y*_sy-99)*1.6
LET _rr=_dx*_dx+_dy*_dy
LET _m1=(_rr>360 & _rr<2800 & {ABS,_dx*{SIN,_t}-_dy*{COS,_t}}<1 & _dx*{COS,_t}+_dy*{SIN,_t}>0) ? 1 : 0
LET _r1=_m1 ? 136 : _r
LET _g1=_m1 ? 149 : _g
LET _b1=_m1 ? 143 : _b
LET _m2=((X*_sx-(105+10*{COS,_t}))*(X*_sx-(105+10*{COS,_t}))+(Y*_sy-(99+6*{SIN,_t}))*(Y*_sy-(99+6*{SIN,_t}))<4) ? 1 : 0
LET _r2=_m2 ? 237 : _r1
LET _g2=_m2 ? 215 : _g1
LET _b2=_m2 ? 172 : _b1
LET _m3=((X*_sx-(105))*(X*_sx-(105))+(Y*_sy-(99))*(Y*_sy-(99))<4) ? 1 : 0
LET _r3=_m3 ? 238 : _r2
LET _g3=_m3 ? 224 : _g2
LET _b3=_m3 ? 189 : _b2
LET _m4=(X*_sx>175 & X*_sx<178 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+0.0}))) ? 1 : 0
LET _r4=_m4 ? 168 : _r3
LET _g4=_m4 ? 194 : _g3
LET _b4=_m4 ? 160 : _b3
LET _m5=(X*_sx>179 & X*_sx<182 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+0.9}))) ? 1 : 0
LET _r5=_m5 ? 168 : _r4
LET _g5=_m5 ? 194 : _g4
LET _b5=_m5 ? 160 : _b4
LET _m6=(X*_sx>183 & X*_sx<186 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+1.8}))) ? 1 : 0
LET _r6=_m6 ? 168 : _r5
LET _g6=_m6 ? 194 : _g5
LET _b6=_m6 ? 160 : _b5
LET _m7=(X*_sx>187 & X*_sx<190 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+2.7}))) ? 1 : 0
LET _r7=_m7 ? 168 : _r6
LET _g7=_m7 ? 194 : _g6
LET _b7=_m7 ? 160 : _b6
LET _m8=(X*_sx>191 & X*_sx<194 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+3.6}))) ? 1 : 0
LET _r8=_m8 ? 168 : _r7
LET _g8=_m8 ? 194 : _g7
LET _b8=_m8 ? 160 : _b7
LET _m9=(X*_sx>195 & X*_sx<198 & Y*_sy<126 & Y*_sy>125-(5+12*(.5+.5*{SIN,_t*2+4.5}))) ? 1 : 0
LET _r9=_m9 ? 168 : _r8
LET _g9=_m9 ? 194 : _g8
LET _b9=_m9 ? 160 : _b8
A=255
R=_r9
G=_g9
B=_b9

The coordinates are written for the 256×192 canvas this was painted on; _sx/_sy rescale them, so the same rule works on a smaller grid too. Download the script ↓

Make it yourself

  1. Open Phluxel, click Browse Starters and pick Analog Rotation — that loads the painted scene and this rule together.
  2. Press play, then drag the _motion knob while it runs. You never have to stop and restart.
  3. Paint over the scene, or drop the rule on your own artwork — it reads whatever is underneath.
  4. Export a seamless loop as GIF, APNG, MP4, a PNG sequence, or a sprite sheet.

Try it without installing anything

Phluxel runs in the browser as a demo, and the free desktop edition has every feature with a watermark on exports.

Open the browser demo Download free (Windows) Wishlist on Steam

More from Astra Kinetic

Signal StudyA waveform crawls across an oscilloscope screen. Harbor RadarA radar sweep finds the same boat on every turn. Espresso RitualAn espresso machine pours while the cup steams. Wind RibbonsLong banners bend in a steady breeze. All 90 effectsThe complete starter gallery.