So I converted to SpecBAS, but in the finest B+ tradition I added my own take on it:
1. Lissajous path through the field (line 40 handles that)
2. Conversion to 256 colours with Palette rotation - freaky
3. Expanded to the full window using filled rectangles.
I could probably get more FPS (this runs at 60fps on my core i7) if I use a bitmap scaling routine rather than the filled rects.
Getting the lissajous path to not jump all over the place when you press a key to get new colours was a trial, but it worked out well.
It looks blocky, but by god it looks nice when it moves.
10 z=2,s=6,w=scrw/s,h=scrh/s,
r1=200,r2=300,a1,a2,s1,s2,sp=1:
screen lock
20 dr,dg,db=rnd*256:
for i=0 to 127:
c=i:
palette i,abs(c-dr),abs(c-dg),abs(c-db):
palette 255-i,abs(c-dr),abs(c-dg),abs(c-db):
next i
30 gs1,gs2=(.125+rnd*2)/1000
40 a1+=s1,
a2+=s2,
mx=SIN a1*r1,
my=COS a2*r2,
s1+=(gs1-s1)/sp,
s2+=(gs2-s2)/sp
50 tm=msecs/200:
for y1=0 to h:
for x1=0 to w:
x=(x1+mx)*z,
y=(y1+my)*z,
vl=sin(pyth(x-128,y-128)/8)+sin(pyth(x-64+tm,y-64)/8)+sin(pyth(x-192,(y+tm/7)-64)/7)+sin(pyth(x-192,y-100)/8)+sin(pyth(x-64-(tm*8),y-192)/15):
rectangle ink 256/(1+abs(vl))-1;x1*s,y1*s,s,s fill:
next x1:
next y1:
sp=64:
palette shr 1,0 to 255:
wait screen:
if inkey$="" then
GO To 40
Else
DO:
Loop until INKEY$="":
GO To 20