Robin Gareus
4866106bcc
* search by author: - "Ardour Team" for "ready to use" plugins - "Ardour Lua Task Force" = example plugins * search by Category - use "Example" for DSP plugins (except instruments)
41 lines
1.3 KiB
Lua
41 lines
1.3 KiB
Lua
ardour {
|
|
["type"] = "session",
|
|
name = "Stop at Marker",
|
|
license = "MIT",
|
|
author = "Ardour Lua Task Force",
|
|
description = [[An example session script which stops the transport on every location marker when rolling forward.]]
|
|
}
|
|
|
|
function factory ()
|
|
return function (n_samples)
|
|
if (not Session:transport_rolling ()) then
|
|
-- not rolling, nothing to do.
|
|
return
|
|
end
|
|
|
|
local pos = Session:transport_frame () -- current playhead position
|
|
local loc = Session:locations () -- all marker locations
|
|
|
|
-- find first marker after the current playhead position, ignore loop + punch ranges
|
|
-- (this only works when rolling forward, to extend this example see
|
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Locations )
|
|
local m = loc:first_mark_after (pos, false)
|
|
|
|
if (m == -1) then
|
|
-- no marker was found
|
|
return
|
|
end
|
|
|
|
-- since ardour may split the process cycle for events,
|
|
-- n_samples may be smaller.
|
|
local blk = Session:get_block_size ()
|
|
|
|
-- transport stop can only happen on a process-cycle boundary.
|
|
-- This callback happens from within the process callback,
|
|
-- so we need to queue it ahead of time.
|
|
if (pos + n_samples + blk >= m and pos + n_samples < m) then
|
|
Session:request_transport_speed (0.0, true)
|
|
end
|
|
end
|
|
end
|