31 lines
744 B
Lua
31 lines
744 B
Lua
|
instrument=klass()
|
||
|
function instrument:init(callback)
|
||
|
self.callback=callback
|
||
|
self.volume=1.0
|
||
|
end
|
||
|
|
||
|
function instrument:spackle(track,channel,t0,t1,note,verbs)
|
||
|
-- a one-indexed table of note data
|
||
|
-- (one-indexed because Lua kind of sucks)
|
||
|
local nflagses,keep_silence=self.callback(t1-t0,note,instrument_split_verbs(verbs))
|
||
|
for i,nflags in pairs(nflagses) do
|
||
|
if nflags.v>0 or keep_silence then
|
||
|
nflags = nflags:clone() -- avoid breaking instrument
|
||
|
|
||
|
local min_v=0
|
||
|
if (nflags.v>0) min_v = 1
|
||
|
nflags.v = mid(flr(nflags.v * self.volume + 0.5),min_v,7)
|
||
|
|
||
|
track:plot(channel,t0+i-1,nflags)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
instrument_split_verbs=function(x)
|
||
|
if (not x) return {}
|
||
|
local t={}
|
||
|
for i in all(split(x)) do
|
||
|
t[i]=true
|
||
|
end
|
||
|
return t
|
||
|
end
|