mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 00:04:56 +01:00
Example Lua script for inter-plugin communication
This commit is contained in:
parent
0517e186c7
commit
ecba48a116
1 changed files with 71 additions and 0 deletions
71
scripts/_dsp_plugin_communication.lua
Normal file
71
scripts/_dsp_plugin_communication.lua
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
ardour { ["type"] = "dsp", name = "DSP Plugin Communication" }
|
||||
function dsp_ioconfig () return { { audio_in = -1, audio_out = -1} } end
|
||||
|
||||
function dsp_init (rate)
|
||||
self:shmem ():allocate (1)
|
||||
end
|
||||
|
||||
function dsp_configure (ins, outs)
|
||||
end
|
||||
|
||||
function dsp_params ()
|
||||
return
|
||||
{
|
||||
{ ["type"] = "output", name = "self", min = 0, max = 8},
|
||||
{ ["type"] = "output", name = "gain", min = 0, max = 2},
|
||||
}
|
||||
end
|
||||
|
||||
function dsp_run (ins, outs, n_samples)
|
||||
local ctrl = CtrlPorts:array ()
|
||||
local route = self:route ()
|
||||
local shmem = self:shmem ()
|
||||
|
||||
local i = 0;
|
||||
local l = 0;
|
||||
local s = -1;
|
||||
|
||||
-- iterate overall plugins on this track,
|
||||
-- find all LuaProc instances of this plugin (unique_id),
|
||||
repeat
|
||||
local proc = route:nth_plugin (i)
|
||||
if not proc:isnil ()
|
||||
and not proc:to_insert():plugin (0):to_luaproc():isnil ()
|
||||
and proc:to_insert():plugin (0):unique_id () == self:unique_id () then
|
||||
if (self:id ():to_s() == proc:to_insert():plugin (0):id ():to_s()) then
|
||||
s = l; -- this plugin instance
|
||||
end
|
||||
if l == 0 then
|
||||
shmem = proc:to_insert():plugin (0):to_luaproc():shmem ()
|
||||
end
|
||||
l = l + 1 -- count total instances of this plugin
|
||||
end
|
||||
i = i + 1
|
||||
until proc:isnil ()
|
||||
|
||||
assert (s >= 0)
|
||||
ctrl[1] = s;
|
||||
|
||||
-- calculate digital peak of all channels
|
||||
local peak = 0
|
||||
for c = 1,#ins do
|
||||
if not ins[c]:sameinstance (outs[c]) then
|
||||
ARDOUR.DSP.copy_vector (outs[c], ins[c], n_samples)
|
||||
end
|
||||
peak = ARDOUR.DSP.compute_peak(outs[c], n_samples, peak)
|
||||
end
|
||||
|
||||
local a = shmem:to_float (0):array ()
|
||||
if s == 0 then
|
||||
-- the first plugin saves the peak
|
||||
a[0] = peak
|
||||
ctrl[2] = -1
|
||||
else
|
||||
-- all later plugins display the difference to the first.
|
||||
if (a[0] == 0) then
|
||||
ctrl[2] = 1
|
||||
else
|
||||
ctrl[2] = peak / a[0]
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue