summaryrefslogtreecommitdiff
path: root/scripts/tomsloop.lua
blob: 23c422d6eaaf0689c72c3e6626e92c60e37f7a78 (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
ardour { ["type"] = "Snippet", name = "Tom's Loop",
	license     = "MIT",
	author      = "Robin Gareus",
	email       = "robin@gareus.org",
	site        = "http://gareus.org",
	description = [[Bounce the loop-range of all non muted audio tracks, paste N times at playhead]]
}

-- unused ;  cfg parameter for ["type"] = "EditorAction"
function action_params ()
	return { ["times"]   = { title = "Number of copies to add", default = "1"}, }
end

function factory () return function ()
	-- get options
	local p = params or {}
	local npaste   = p["times"] or 1
	assert (npaste > 0)

	local proc     = ARDOUR.LuaAPI.nil_proc () -- bounce w/o processing
	local itt      = ARDOUR.InterThreadInfo () -- bounce progress info (unused)

	local loop     = Session:locations ():auto_loop_location ()
	local playhead = Session:transport_frame ()

	-- make sure we have a loop, and the playhead (edit point) is after it
	-- TODO: only print an error and return
	-- TODO: use the edit-point (not playhead) ? maybe.
	assert (loop)
	assert (loop:start () < loop:_end ())
	assert (loop:_end () < playhead)

	for route in Session:get_tracks ():iter () do
		-- skip muted tracks
		if route:muted () then
			goto continue
		end
		-- test if bouncing is possible
		local track = route:to_track ()
		if not track:bounceable (proc, false) then
			goto continue;
		end
		-- only audio tracks
		local playlist = track:playlist ()
		if playlist:data_type ():to_string() ~= "audio" then
			goto continue
		end

		-- check if there are any regions in the loop-range of this track
		local range = Evoral.Range (loop:start (), loop:_end ())
		if playlist:regions_with_start_within (range):empty () then
			goto continue
		end
		if playlist:regions_with_end_within (range):empty () then
			goto continue
		end

		-- all set
		--print (track:name ())

		-- do the actual work
		local region = track:bounce_range (loop:start (), loop:_end (), itt, proc, false)
		playlist:add_region(region, playhead, npaste, false)

		::continue::
	end
end end