W=240
H=136
BPM=174
STEP=3

max=math.max
min=math.min
abs=math.abs
rnd=math.random
sin=math.sin

cyan={
	0x04,0x0d,0x0c,0x1c,0x13,0x2b,
	0x22,0x19,0x3a,0x26,0x1e,0x49,
	0x28,0x24,0x58,0x2a,0x2d,0x67,
	0x2f,0x3a,0x77,0x35,0x4a,0x86,
	0x3a,0x5c,0x96,0x3f,0x70,0xa5,
	0x45,0x87,0xb5,0x50,0x9d,0xbe,
	0x5f,0xb1,0xc4,0x6e,0xc3,0xcb,
	0xa3,0xdc,0xb9,0xde,0xee,0xd7}

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}
	
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}
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 BOOT()
	palset(0,cyan)
end

tf=0
tff=0
frm=0


function TIC()
mt=debug.getinfo(TIC)
txt=mt["source"]..mt["source"]
	frm=frm+1
	t=time()/60000*(BPM/2)+(60000*BPM)
	ft=time()/60000*BPM
	fas=time()/60000*BPM*256
	ti=t//1
	tf=lerp(tf,ti,.8)
	tff=lerp(tff,ft//1,.4)
	b=fft(0,16)*3
	s=fft(32,128)*10
	h=fft(128,512)
	vbank(1)
	cls()
	vbank(0)
	palmix(0,cyan,orange,b/5)
	for y=0,H do 
		for xx=0,W,STEP do
			x=xx+frm%STEP
			Y=y/H
			X=x/W
			f=ffts(x,x+x)*2+1+fft(x)*(x*.1)
			f=max(0,min(15,f))
			if x<W/3 then
				c=b
			elseif x>=W/3 and x<W/3*2 then
				c=s
			else
				c=h
			end
			vbank(0)
			if c>H/2-y then
				pix(x,y,f+(tf+X)*7)
			else
				pix(x,y,15-f+(tf+Y)*6)
			end
			if rnd(100)<40+b*fft(Y)*100 then
				vbank(1)
				if c>H/2-y then
					pix(x,y,f+(tf+X)*7)
				else
					pix(x,y,15-f+(tf+Y)*6)
				end
			end
		end 
	end 
	vbank(1)
	i=(fas//1%#txt)%#txt//2
	if fas//1%256<196 then 
		print(string.sub(txt,i,i+400),11,10,14*s)
		print(string.sub(txt,i,i+400),10,10,1)
	end
end

function BDR(i)
	local ii=abs(i-H/2)*(2+sin(tf/0.01)*1.5)
	local ff=fft(ii)
	local fs=ffts(ii)
	local fl=fft(0,32)
	vbank(0)
	
	palmix(1,orange,cyan,(fs*2-ff)*4)
	poke(0x3ff9,rnd(-ff*4//1,fs*4//1)+fl*(H-i*i)*sin(fs)*.01)
	if t%i==ff then
	poke(0x3ff9+1,fs*10)
	end
	
	vbank(1)
	poke(0x3ff9,-rnd(-ff*4//1,fs*4//1)+fl*(H-i*i)*sin(fs)*.01)
	
	
end