summaryrefslogtreecommitdiff
path: root/scripts/_midi_rec_start.lua
blob: edd67eb7aff4bb30ea0de774bdfc4f376f97bbe7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ardour {
	["type"]    = "session",
	name        = "MIDI Record Enable",
	category    = "Example", -- "Utility"
	license     = "MIT",
	author      = "Ardour Lua Task Force",
	description = [[An example script to start recording on note-on.]]
}

function factory ()
	return function (n_samples)
		if Session:actively_recording() then return end -- when recording already, do nothing
		-- iterate over all MIDI ports
		_, t = Session:engine ():get_ports (ARDOUR.DataType.midi (), ARDOUR.PortList ())
		for p in t[2]:iter () do
			-- skip output ports
			if not p:receives_input () then goto next end
			local midiport = p:to_midiport ()
			-- and skip async event ports
			if midiport:isnil () then goto next end
			local mb = midiport:get_midi_buffer (n_samples) -- get the midi-data buffers
			local events = mb:table () -- copy event list into lua table
			for _,e in pairs (events) do -- iterate over all events in the midi-buffer
				if bit32.band (e:buffer():array()[1], 0xf0) == 0x90 then -- note on
					Session:maybe_enable_record (true) -- global record-enable from rt-context
					-- maybe-enable may fail if there are no tracks or step-entry is active
					-- roll transport if record-enable suceeded:
					if ARDOUR.Session.RecordState.Enabled == Session:record_status() then
						Session:request_transport_speed (1.0, true) -- ...and go.
					end
					return
				end
			end
			::next::
		end
	end
end