mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 08:14:58 +01:00
Add/update scripts reading raw audio-data
This commit is contained in:
parent
a439d8bbe4
commit
978de93cf2
2 changed files with 80 additions and 4 deletions
75
scripts/_find_nonzero_sample.lua
Normal file
75
scripts/_find_nonzero_sample.lua
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
ardour {
|
||||||
|
["type"] = "EditorAction",
|
||||||
|
name = "Find non zero audio sample",
|
||||||
|
author = "Ardour Team",
|
||||||
|
description = [[Find the position of first non-zero audio sample in selected regions.]]
|
||||||
|
}
|
||||||
|
|
||||||
|
function factory () return function ()
|
||||||
|
-- get Editor GUI Selection
|
||||||
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
|
||||||
|
local sel = Editor:get_selection ()
|
||||||
|
|
||||||
|
-- allocate a buffer (float* in C)
|
||||||
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:DspShm
|
||||||
|
local cmem = ARDOUR.DSP.DspShm (8192)
|
||||||
|
local msg = ""
|
||||||
|
|
||||||
|
-- iterate over selected regions
|
||||||
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
|
||||||
|
for r in sel.regions:regionlist ():iter () do
|
||||||
|
-- test if it's an audio region
|
||||||
|
if r:to_audioregion ():isnil () then
|
||||||
|
goto next
|
||||||
|
end
|
||||||
|
|
||||||
|
-- to read the Region data, we use the Readable interface of the Region
|
||||||
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Readable
|
||||||
|
local rd = r:to_readable ()
|
||||||
|
|
||||||
|
local n_samples = rd:readable_length ()
|
||||||
|
local n_channels = rd:n_channels ()
|
||||||
|
|
||||||
|
local nonzeropos = -1
|
||||||
|
|
||||||
|
-- iterate over all channels in Audio Region
|
||||||
|
for c = 0, n_channels -1 do
|
||||||
|
local pos = 0
|
||||||
|
repeat
|
||||||
|
-- read at most 8K samples of channel 'c' starting at 'pos'
|
||||||
|
local s = rd:read (cmem:to_float (0), pos, 8192, c)
|
||||||
|
-- access the raw audio data
|
||||||
|
-- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
|
||||||
|
local d = cmem:to_float (0):array()
|
||||||
|
-- iterate over the audio sample data
|
||||||
|
for i = 0, s do
|
||||||
|
if math.abs (d[i]) > 0 then
|
||||||
|
print ("nonzero at", pos + i)
|
||||||
|
if (nonzeropos < 0 or pos + i < nonzeropos) then
|
||||||
|
nonzeropos = pos + i
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pos = pos + s
|
||||||
|
if (nonzeropos >= 0 and pos > nonzeropos) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
until s < 8192
|
||||||
|
end
|
||||||
|
|
||||||
|
if (nonzeropos >= 0) then
|
||||||
|
msg = msg .. string.format("%s: %d\n", r:name (), nonzeropos + r:position())
|
||||||
|
else
|
||||||
|
msg = msg .. "Region: '%s' is silent\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
::next::
|
||||||
|
end
|
||||||
|
|
||||||
|
if (msg ~= "") then
|
||||||
|
local md = LuaDialog.Message ("First Non Zero Sample", msg, LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close)
|
||||||
|
print (md:run())
|
||||||
|
end
|
||||||
|
|
||||||
|
end end
|
||||||
|
|
@ -31,10 +31,10 @@ function factory () return function ()
|
||||||
local peak = 0 -- the audio peak to be calculated
|
local peak = 0 -- the audio peak to be calculated
|
||||||
|
|
||||||
-- iterate over all channels in Audio Region
|
-- iterate over all channels in Audio Region
|
||||||
for c = 0, n_channels do
|
for c = 0, n_channels -1 do
|
||||||
|
local pos = 0
|
||||||
repeat
|
repeat
|
||||||
local pos = 0
|
-- read at most 8K samples of channel 'c' starting at 'pos'
|
||||||
-- read at most 8K samples of channel 'c'
|
|
||||||
local s = rd:read (cmem:to_float (0), pos, 8192, c)
|
local s = rd:read (cmem:to_float (0), pos, 8192, c)
|
||||||
pos = pos + s
|
pos = pos + s
|
||||||
-- access the raw audio data
|
-- access the raw audio data
|
||||||
|
|
@ -46,7 +46,8 @@ function factory () return function ()
|
||||||
peak = math.abs (d[i])
|
peak = math.abs (d[i])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
until pos < n_samples
|
until s < 8192
|
||||||
|
assert (pos == n_samples)
|
||||||
end
|
end
|
||||||
|
|
||||||
if (peak > 0) then
|
if (peak > 0) then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue