Is there any way to trigger MIDI notes with crow?
I’ve written a pretty nice sequencer class in Lua, I’d love to trigger my drum machine with it.
Sorry for the sparse documentation, let me know if you have any questions! As a hint, bseq will convert any number into its binary representation — instant trigger sequences!
Second hint — run mlb = true and see what happens 
seq.lua
-- a get together
-- 1. INIT
function init()
-- jf
jf_init(true)
-- scales
lydian = { 0, 2, 4, 6, 7, 9, 11 }
penta = { 0, 2, 4, 7, 9 }
penta2 = { 2, 4, 6, 9, 11 }
seven = { 0, 4, 7, 11, 14 }
-- loop
slb = false
sl = 8
-- bval
b1val = 144
b2val = 18
b3val = 43691
-- sequence velocity
sv = 8
-- cv params
cva = 0
cvr = 0.5
cvv = 5
cvs = 'log'
-- pick jf or cv trigs
jfb = true
-- sequence
s1 = seq:new(penta2, 1)
-- binary sequence
b1 = bseq:new(b1val)
b2 = bseq:new(b2val)
b3 = bseq:new(b3val)
-- start sequence metro
S = metro.init{ event = s_iter, time = 0.15 }; S:start()
end
-- 2. EVENTS
-- sequence
st = 1
function s_iter ()
-- update bvals
b1:u(b1val)
b2:u(b2val)
b3:u(b3val)
-- trig jf
if jfb == true then
jf_trig(b1:next(), s1, sv)
jf_trig(b2:next(), s1, sv)
jf_trig(b3:next(), s1, sv)
else
-- trig cv
cv_trig(b1:next(), 1, sv)
cv_trig(b2:next(), 2, sv)
cv_trig(b3:next(), 3, sv)
end
-- loop
if slb and st >= sl then
st = 0
s1:reset()
b1:reset()
b2:reset()
b3:reset()
end
-- iterate
st = st + 1
end
-- 3. FUNCTIONS
-- init jf
function jf_init (bool)
ii.pullup(true)
if bool then ii.jf.mode(1) else ii.jf.mode(0) end
end
-- trigger jf
function jf_trig (trig, seq, vel) if trig == 1 then jf(seq:next(), vel) end end
-- jf play_note wrapper
function jf (note, vel) ii.jf.play_note(note / 12, vel) end
-- trigger cv
function cv_trig (trig, chan, vel) if trig == 1 then output[chan]( ar(cva, cvr, vel or cvv, cvs)) end end
-- 4. CLASSES
-- seq
seq = { seq = {}, t = 0, seq_i = 0, len_i = 0 }
-- init
function seq:new (seq, step, len)
local this = {}
setmetatable(this, self)
self.__index = self
this.seq = seq
this.step = step or 1
this.len = len or #this.seq
return this
end
-- return next note
function seq:next ()
self.seq_i = (self.seq_i + self.step) % #self.seq
self:check_len()
return self.seq[self.seq_i + 1] + self.t
end
-- helper — reset seq at len
function seq:check_len ()
self.len_i = self.len_i + 1
if self.len_i >= self.len then self:reset() end
end
-- directly reset seq
function seq:reset ()
self.seq_i = 0
self.len_i = 0
end
-- bseq — inherits seq
bseq = seq:new ()
-- init
function bseq:new (val, step)
b = seq:new(bits(val), step)
setmetatable(b, self)
self.__index = self
b.val = val
return b
end
-- update val
function bseq:u (val)
self.seq = bits(val)
self.val = val
-- unlike seq, reset len!
self.len = #self.seq
end
-- add to val
function bseq:a (n) self:n(self.val + n) end
-- convert decimal to binary
function bits (num, bits)
bits = bits or math.max(1, select(2, math.frexp(num)))
local t = {}
for b = bits, 1, -1 do
t[b] = math.fmod(num, 2)
num = math.floor((num - t[b]) / 2)
end
return t
end
-- 5. TROUBLESHOOTING
-- print table
function printt(tab) for i, v in ipairs(tab) do print(i, v) end end
-- print sequence
function prints(seq) printt(seq.seq) end