- -- passthrough midi data, and fill the event buffer
- for i, d in pairs(midiin) do
- local ev = d["data"]
- midiout[i] = { time = d["time"], data = ev }
- pos = pos % ringsize + 1
- for j = 1, math.min(#ev,evlen) do
- buffer[(pos-1)*evlen + j] = ev[j]
- end
- for j = #ev+1, evlen do
- buffer[(pos-1)*evlen + j] = 0
+ -- passthrough all data
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+ ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+ -- then fill the event buffer
+ local ib = in_map:get (ARDOUR.DataType ("midi"), 0) -- index of 1st midi input
+
+ if ib ~= ARDOUR.ChanMapping.Invalid then
+ local events = bufs:get_midi (ib):table () -- copy event list into a lua table
+
+ -- iterate over all MIDI events
+ for _, e in pairs (events) do
+ local ev = e:buffer():array()
+ pos = pos % ringsize + 1
+ -- copy the data
+ for j = 1, math.min(e:size(),evlen) do
+ buffer[(pos-1)*evlen + j] = ev[j]
+ end
+ -- zero unused slots
+ for j = e:size()+1, evlen do
+ buffer[(pos-1)*evlen + j] = 0
+ end