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