-- greetings everyone !
W,H=240,136
STP=2
PI=3.1415
m=math
max=m.max
min=m.min
sin=m.sin
cos=m.cos
pow=m.pow
abs=m.abs


white={
	0x00,0x00,0x00,0x10,0x10,0x10,
	0x20,0x20,0x20,0x30,0x30,0x30,
	0x40,0x40,0x40,0x50,0x50,0x50,
	0x60,0x60,0x60,0x70,0x70,0x70,
	0x80,0x80,0x80,0x90,0x90,0x90,
	0xa0,0xa0,0xa0,0xb0,0xb0,0xb0,
	0xc0,0xc0,0xc0,0xd0,0xd0,0xd0,
	0xe0,0xe0,0xe0,0xf0,0xf0,0xf0}
	
whitc={
	0x00,0x00,0x00,0x20,0x20,0x20,
	0x40,0x40,0x40,0x60,0x60,0x60,
	0x80,0x80,0x80,0xa0,0xa0,0xa0,
	0xc0,0xc0,0xc0,0xe0,0xe0,0xe0,
	0xf0,0xf0,0xf0,0xd0,0xd0,0xd0,
	0xb0,0xb0,0xb0,0x90,0x90,0x90,
	0x70,0x70,0x70,0x50,0x50,0x50,
	0x30,0x30,0x30,0x10,0x10,0x10}

purple={ 
	0x0c,0x0a,0x2e,0x15,0x10,
	0x43,0x1e,0x15,0x59,0x27,0x19,
	0x70,0x31,0x1b,0x88,0x3d,0x1c,
	0xa1,0x49,0x1d,0xbb,0x57,0x1c,
	0xd7,0x66,0x1a,0xeb,0x79,0x20,
	0xf1,0x8d,0x32,0xf7,0xa0,0x46,
	0xfc,0xb3,0x5b,0xff,0xc3,0x70,
	0xe8,0xf1,0xaa,0xde,0xee,0xd7,0x1a}
	
orange={ 
	0x1a,0x0c,0x0a,0x2e,0x15,0x10,
	0x43,0x1e,0x15,0x59,0x27,0x19,
	0x70,0x31,0x1b,0x88,0x3d,0x1c,
	0xa1,0x49,0x1d,0xbb,0x57,0x1c,
	0xd7,0x66,0x1a,0xeb,0x79,0x20,
	0xf1,0x8d,0x32,0xf7,0xa0,0x46,
	0xfc,0xb3,0x5b,0xff,0xc3,0x70,
	0xe8,0xf1,0xaa,0xde,0xee,0xd7}
	
orangc={
	0x1a,0x0c,0x0a,0x43,0x1e,0x15,
	0x70,0x31,0x1b,0xa1,0x49,0x1d,
	0xd7,0x66,0x1a,0xf1,0x8d,0x32,
	0xfc,0xb3,0x5b,0xe8,0xf1,0xaa,
 0xde,0xee,0xd7,0xff,0xc3,0x70,
 0xf7,0xa0,0x46,0xeb,0x79,0x20,
 0xbb,0x57,0x1c,0x88,0x3d,0x1c,
 0x59,0x27,0x19,0x2e,0x15,0x10}
 
 
black={
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00}
	
function palset(bnk,pal)
	local curbnk=vbank()
	vbank(bnk)
	loadpal(pal)
	vbank(curbnk)
end
function loadpal(pal)
 for i=1,48 do
  poke(0x3fc0+i-1,pal[i])
 end
end
function palmix(bnk,p1,p2,t)
	local curbnk=vbank()
	local pal={}
	for i=1,#p1 do
		pal[i]=lerp(p1[i],p2[i],t)
	end
	vbank(bnk)
	loadpal(pal)
	vbank(curbnk)
end
function slen(a)
	return a[1]*a[1]+a[2]*a[2]
end	
function clr(c1,c2)
	local curbnk=vbank()
	vbank(0)
	cls(c1)
	vbank(1)
	cls(c2)
	vbank(curbnk)
end
function subpix(i,a,f)
	local p=peek4(i+f)
	poke4(math.min(i-f,0x3fbf*2+1),math.max(p-a,0))
end
function frnd(a,b,s)
	return rnd(a*s,b*s)/s
end
function lerp(a, b, t)
	return a + (b - a) * t
end
function rot(xx,yy,r)
    local x,y=xx,yy
    x=m.cos(r)*xx-m.sin(r)*yy
    y=m.cos(r)*yy+m.sin(r)*xx
    return x,y
end

dth={}
for i=1,W*H+1 do
	dth[i]=m.random(100)/100-.5
end

ft={}
function BOOT()
	palset(0,purple)
	for i=1,3025 do
		ft[i]=0
	end
end

frm=0
BPM=130
function TIC()
	local X,Y,x,y,xx,yy=0,0,0,0,0,0
	local f,flc,low,hi=0,0,0,0
	frm=frm+1
	t=time()/60000*BPM
	flc=fft(0,1023)
	low=ffts(0,32)
	hi=ffts(32,512)
	for i=1,1023 do
		ft[i]=ft[i]*.9+fft(i-1)
	end
	vbank(0)
	for yy=0,H,STP do 
		for xx=0,W,STP do
			x=xx+frm%STP
			y=yy+(frm//STP)%STP
			X=x/W-.5
			Y=y/H-.5
			X,Y=rot(X,Y,low*.08-hi*.08)
			X,Y=rot(X,Y,X*Y*sin(t/8+ft[abs(X*W*0.8)//1+1]))
			X=(X*(.9+(t//1-t)*.1)+.5)%1-.5
			Y=(Y*(.9+(t//1-t)*.1)+.5)%1-.5
			
			for i=0,2 do
				X=abs(X)-.08*hi
				Y=abs(Y)-.08*low
				X,Y=rot(X,Y,t*.02)
			end
			X=abs(X*W)
			Y=abs(Y*H)
			f=ft[X//1+1]*0.01%16--fft(x)/flc
			fx=fft(Y)*10
			f=f*500
			c=(Y+f)/H*16
			c=c+fx*10
			c=min(15,c)
			c=c+f+t//1
			c=c*(1-dth[(x*y)%#dth+1]*.01*f)
			pix(xx+frm%STP,yy+(frm//STP)%STP,c)
		end
	end
	vbank(1)
end

function BDR(i)
	local ii=abs(i-H/2-4)
	f=fft(ii/2)*4
	
	palmix(0,purple,white,f)
end