2024-03-16 21:23:02 +00:00
|
|
|
function _init()
|
|
|
|
local bgm=build_bgm()
|
|
|
|
local free_patterns={}
|
2024-03-17 02:38:02 +00:00
|
|
|
for i=8,63 do add(free_patterns,i) end
|
2024-03-16 21:23:02 +00:00
|
|
|
|
|
|
|
bgm:build(free_patterns,0)
|
|
|
|
|
|
|
|
cstore(0x3100,0x3100,0x1200)
|
|
|
|
music(0)
|
|
|
|
end
|
|
|
|
function _update()
|
|
|
|
end
|
|
|
|
function _draw()
|
|
|
|
cls(0)
|
|
|
|
print("enjoy the music!")
|
|
|
|
end
|
|
|
|
|
|
|
|
function build_bgm()
|
2024-03-16 22:21:50 +00:00
|
|
|
local bgm=track:new()
|
2024-03-16 21:23:02 +00:00
|
|
|
|
2024-03-16 23:23:31 +00:00
|
|
|
bgm:add(32)
|
2024-03-16 21:23:02 +00:00
|
|
|
bgm:add(32)
|
2024-03-17 02:38:02 +00:00
|
|
|
bgm:add(32)
|
|
|
|
bgm:add(32)
|
|
|
|
|
|
|
|
local bassline=instrument:new(devil(0,2,5,5))
|
|
|
|
local yowler=instrument:new(devil(1,2,5,3))
|
|
|
|
local p0=performer:new(bgm,0,bassline,0,{12-2})
|
|
|
|
local p1=performer:new(bgm,1,yowler,0,{24-2})
|
2024-03-16 21:23:02 +00:00
|
|
|
|
2024-03-17 02:38:02 +00:00
|
|
|
function generators(r,a,b,c,d)
|
|
|
|
a+=r b+=r c+=r d+=r
|
|
|
|
local oct=12
|
|
|
|
if (b < a) oct=-12
|
|
|
|
local e=a+oct
|
|
|
|
local f=b+oct
|
|
|
|
local g=c+oct
|
|
|
|
local t={
|
|
|
|
gen4=function()
|
|
|
|
p0:play(1,a) p0:play(1,a+24,"slide") p0:play(1,d) p0:play(1,e)
|
|
|
|
p1:play(1,a,"chop") p1:play(1,a,"chop") p1:play(1,d) p1:play(1,e)
|
|
|
|
end,
|
|
|
|
|
|
|
|
gen3=function()
|
|
|
|
p0:play(1,a) p0:play(1,a,"chop") p0:play(1,d)
|
|
|
|
p1:play(1,a,"chop") p1:play(1,a,"chop") p1:play(1,d)
|
|
|
|
end,
|
|
|
|
|
|
|
|
gen2=function(off)
|
|
|
|
off = off or 0
|
|
|
|
p0:play(1,f+off) p0:play(1,g+off)
|
|
|
|
p1:play(1,f+off,"chop") p1:play(1,g+off)
|
|
|
|
end
|
|
|
|
}
|
|
|
|
t.gen16=function()
|
|
|
|
t.gen4() t.gen4() t.gen3() t.gen3() t.gen2()
|
|
|
|
end
|
|
|
|
t.gen12=function()
|
|
|
|
t.gen3() t.gen3() t.gen3() t.gen3()
|
|
|
|
end
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
p1.offset=-12
|
|
|
|
generators(0,0,3,5,10).gen16()
|
|
|
|
p1.offset=-5
|
|
|
|
generators(12,0,3,5,10).gen16()
|
|
|
|
generators(24,0,3,5,10).gen16()
|
|
|
|
p1.offset=4
|
|
|
|
generators(29,0,-2,-3,-7).gen12()
|
|
|
|
p1.offset=7
|
|
|
|
generators(29,0,-2,-3,-7).gen2()
|
|
|
|
p1.offset=-5
|
|
|
|
generators(29,0,-2,-3,-7).gen2()
|
|
|
|
|
|
|
|
local drums=instrument:new(drums)
|
|
|
|
local pd=performer:new(bgm,1,drums,0,{0})
|
|
|
|
|
|
|
|
for i=0,5 do
|
|
|
|
pd:play(1,0,"kick")
|
|
|
|
pd:rest(3)
|
|
|
|
pd:play(1,0,"snare")
|
|
|
|
pd:rest(3)
|
|
|
|
end
|
|
|
|
pd:play(1,0,"kick") pd:rest(1) pd:play(1,0,"kick") pd:rest(1) pd:play(1,0,"snare") pd:rest(1)
|
|
|
|
pd:play(1,0,"kick") pd:rest(1) pd:play(1,0,"kick") pd:rest(1) pd:play(1,0,"snare") pd:rest(1)
|
|
|
|
pd:play(1,0,"kick") pd:rest(1) pd:play(1,0,"kick") pd:rest(1)
|
|
|
|
|
|
|
|
local melo1=instrument:new(melo1)
|
|
|
|
local pm=performer:new(bgm,2,melo1,0,{48-2})
|
|
|
|
|
|
|
|
local function generate_ostinato(a,b,c,d,e,stophalf)
|
|
|
|
pm:play(1,a,"qq") pm:play(1,a,"qq") pm:play(1,a,"q") pm:play(1,a)
|
|
|
|
pm:play(1,a,"qq") pm:play(1,a,"qq") pm:play(1,a,"q") pm:play(1,a)
|
|
|
|
pm:play(1,a,"qq") pm:play(1,a,"qq") pm:play(1,a,"q") pm:play(1,a)
|
|
|
|
pm:play(1,a,"qq") pm:play(1,a,"qq") pm:play(1,e,"q") pm:play(1,e)
|
|
|
|
if (stophalf) return
|
|
|
|
pm:play(1,d,"qq") pm:play(1,d,"q") pm:play(1,d) pm:play(1,d)
|
|
|
|
pm:play(1,d,"q") pm:play(1,d,"q") pm:play(1,d) pm:play(1,d)
|
|
|
|
pm:play(1,c,"q") pm:play(1,c,"q") pm:play(1,c) pm:play(1,c)
|
|
|
|
pm:play(1,b) pm:play(1,b) pm:play(1,c) pm:play(1,b)
|
|
|
|
end
|
|
|
|
|
|
|
|
generate_ostinato(-5,-2,2,3,5)
|
|
|
|
generate_ostinato(-5,-2,2,3,5,true)
|
|
|
|
pm:rest(16)
|
2024-03-16 21:23:02 +00:00
|
|
|
|
|
|
|
return bgm
|
2024-03-16 23:23:31 +00:00
|
|
|
end
|
|
|
|
|
2024-03-17 02:38:02 +00:00
|
|
|
function devil(w,e,v0,v1)
|
|
|
|
return function(duration,pitch,verbs)
|
|
|
|
local out={}
|
|
|
|
for i=1,duration do
|
|
|
|
local v=v1
|
|
|
|
if (i == 1) v=v0
|
|
|
|
out[i]=nflags:new{p=pitch,v=v,c=1,w=w,e=e}
|
|
|
|
end
|
|
|
|
if (verbs.slide and #out>0) out[1].e=1
|
|
|
|
if (verbs.chop and #out>0) out[1].e=3
|
|
|
|
return out
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function drums(duration,pitch,verbs)
|
|
|
|
if verbs.kick then
|
|
|
|
return {
|
|
|
|
-- kind of a cool sidechained bass effect, but not useful here
|
|
|
|
-- nflags:new{p=10,v=7,c=1,w=0,e=0},
|
|
|
|
-- nflags:new{p=0,v=5,c=1,w=0,e=1}
|
2024-03-16 23:23:31 +00:00
|
|
|
|
2024-03-17 02:38:02 +00:00
|
|
|
nflags:new{p=19,v=7,c=1,w=2,e=0},
|
|
|
|
-- nflags:new{p=12,v=5,c=1,w=2,e=0}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
if (verbs.snare) return {nflags:new{p=30,v=7,c=0,w=6,e=3}}
|
|
|
|
|
|
|
|
return {}
|
|
|
|
end
|
|
|
|
|
|
|
|
function melo1(duration,pitch,verbs)
|
|
|
|
local v=6
|
|
|
|
if (verbs.q) v=4
|
|
|
|
if (verbs.qq) v=2
|
2024-03-16 23:23:31 +00:00
|
|
|
local out={}
|
|
|
|
for i=1,duration do
|
2024-03-17 02:38:02 +00:00
|
|
|
out[i]=nflags:new{p=pitch,w=3,v=v,e=5}
|
2024-03-16 23:23:31 +00:00
|
|
|
end
|
|
|
|
return out
|
2024-03-17 02:38:02 +00:00
|
|
|
end
|