This one's a bit faster...
set display mode 800,600,32
sync on
sync rate 60
of=200
dim col(12000)
dim fra#(30)
fra#(0)=0.1:fra#(1)=0:fra#(2)=0.5
fra#(3)=1:fra#(4)=0:fra#(5)=0
fra#(6)=1:fra#(7)=0.3:fra#(8)=0
fra#(9)=1:fra#(10)=1:fra#(11)=0
fra#(12)=0:fra#(13)=1:fra#(14)=0
fra#(15)=0:fra#(16)=1:fra#(17)=1
fra#(18)=0:fra#(19)=0:fra#(20)=1
fra#(21)=0.3:fra#(22)=0:fra#(23)=1
delay=0:delay1=9
frogy=0
ho=1920
dop=10
gg=439
`
gosub makecol
mf#=0.0001
mod#=3
mff#=0.0001
````````````````````````
do
cls
gosub draw
sync
loop
```````````````````````````
draw:
`lock pixels
mod#=mod#+(mf#*0.01)
if mod#>359 then mff#=0.0001
if mod#<1 then mff#=-0.00015
mf#=mf#+mff#
aqu=3200+511+512
d#=0
dc=ec
t#=360/mod#
for f=gg*2 to 1 step -4
ink col(dc)
doh:
x1#=400+f*sin(d#+j#)
y1#=300+f*cos(d#+j#)
d#=d#+t#
x2#=400+f*sin(d#+j#)
y2#=300+f*cos(d#+j#)
ligne(x1#,y1#,x2#,y2#)
if d#<360 then goto doh
inc dc:if dc>aqu then dc=0
next f
inc j#,0.5:if j#>359 then j#=j#-360
inc ec,16:if ec>aqu then ec=ec-aqu
`unlock pixels
return
```````````````````````````
function ligne(ax,ay,bx,by)
dx# = abs(ax-bx) : dy# = abs(ay-by)
if dx# > dy# then u# = 1.0/dx# else u# = 1.0/dy#
for t# = 0 to 1.0 step u#+u#
x# = (1.0-t#)*ax + t#*bx
y# = (1.0-t#)*ay + t#*by
x = x# + x# - int(x#)
y = y# + y# - int(y#)
box x,y,x+1,y+1
next t
endfunction
```````````````````````````
makecol:
of=0
a1=21
lop:
for f=of to of+255
g=f-of
p=of*2
r#=g*(fra#(a1))
g#=g*(fra#(a1+1))
b#=g*(fra#(a1+2))
c=rgb(r#,g#,b#)
col(g+p)=c
col(p+(511-g))=c
next f
zzz=p+(255-g)
dec a1,3:if a1<0 then return
inc of,255
goto lop
Or the video...
https://www.youtube.com/watch?v=AecShPCsdzg