mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 15:25:01 +01:00
Prefer using C++ DSP for noise generation in scripts
This significantly reduces the DSP load of the noise generator (avg. process time is reduced by a factor of 8 or more).
This commit is contained in:
parent
9e3efced72
commit
f18a7e3fc3
2 changed files with 55 additions and 0 deletions
111
share/scripts/_noisegen.lua
Normal file
111
share/scripts/_noisegen.lua
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
ardour {
|
||||
["type"] = "dsp",
|
||||
name = "NoiseGen",
|
||||
category = "Instrument",
|
||||
license = "MIT",
|
||||
author = "Ardour Team",
|
||||
description = [[Noise Generator (v-1.02)]]
|
||||
}
|
||||
|
||||
function dsp_params ()
|
||||
return
|
||||
{
|
||||
{ ["type"] = "input", name = "White/Pink", min = 0, max = 1, default = 0, toggled = true },
|
||||
{ ["type"] = "input", name = "Gain", min = -60, max = 0, default = -18, unit="dB" },
|
||||
}
|
||||
end
|
||||
|
||||
function dsp_ioconfig ()
|
||||
return { [1] = { audio_in = -1, audio_out = -1}, }
|
||||
end
|
||||
|
||||
local sr = 0
|
||||
|
||||
function dsp_init (rate)
|
||||
sr = rate
|
||||
end
|
||||
|
||||
local ao = 0
|
||||
local draw = 0
|
||||
|
||||
function dsp_run (ins, outs, n_samples)
|
||||
|
||||
local a = {} -- init array
|
||||
local ctrl = CtrlPorts:array ()
|
||||
local noise = ctrl[1] or 0
|
||||
local amplitude = ARDOUR.DSP.dB_to_coefficient (ctrl[2]) or ARDOUR.DSP.dB_to_coefficient (-18)
|
||||
|
||||
local b0 = 0.0
|
||||
local b1 = 0.0
|
||||
local b2 = 0.0
|
||||
local b3 = 0.0
|
||||
local b4 = 0.0
|
||||
local b5 = 0.0
|
||||
local b6 = 0.0
|
||||
|
||||
--Pink noise generation courtesy of Paul Kellet's refined method
|
||||
--http://www.musicdsp.org/files/pink.txt
|
||||
--If 'white' consists of uniform random numbers,
|
||||
--the pink noise will have an almost gaussian distribution.
|
||||
for s = 1, n_samples do
|
||||
if noise == 0 then
|
||||
a[s] = amplitude * 2 * (math.random() - 0.5)
|
||||
end
|
||||
if noise == 1 then
|
||||
white = (amplitude * 0.25) * 2 * (math.random() - 0.5)
|
||||
b0 = 0.99886 * b0 + white * 0.0555179;
|
||||
b1 = 0.99332 * b1 + white * 0.0750759;
|
||||
b2 = 0.96900 * b2 + white * 0.1538520;
|
||||
b3 = 0.86650 * b3 + white * 0.3104856;
|
||||
b4 = 0.55000 * b4 + white * 0.5329522;
|
||||
b5 = -0.7616 * b5 - white * 0.0168980;
|
||||
b6 = white * 0.115926;
|
||||
a[s] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362;
|
||||
end
|
||||
end
|
||||
|
||||
if (draw > (sr/15)) then
|
||||
self:queue_draw()
|
||||
draw = 0
|
||||
end
|
||||
|
||||
-- passes array a {} into buffer
|
||||
for c = 1,#outs do
|
||||
outs[c]:set_table(a, n_samples)
|
||||
end
|
||||
draw = draw + n_samples
|
||||
end
|
||||
|
||||
function render_inline (ctx, w, max_h) --inline display
|
||||
local ctrl = CtrlPorts:array()
|
||||
h = 30
|
||||
p = 0
|
||||
inc = 0
|
||||
ycy = 0.5
|
||||
pink = false
|
||||
local amplitude = ARDOUR.DSP.dB_to_coefficient(ctrl[2])
|
||||
if ctrl[1] == 1 then pink = true end
|
||||
if pink then inc = 0.7/w end
|
||||
|
||||
--draw rectangle
|
||||
ctx:rectangle(0, 0, w, h)
|
||||
ctx:set_source_rgba(0, 0, 0, 1.0)
|
||||
ctx:fill()
|
||||
ctx:set_line_width(1.5)
|
||||
ctx:set_source_rgba(0.8, 0.8, 0.8, 1.0)
|
||||
|
||||
l_x = 0
|
||||
l_y = 0
|
||||
for x = 0,w do
|
||||
if pink then ycy = 0.3 else ycy = 0.5 end --slant slightly like an actual pink noise spectrum
|
||||
y = math.log(20^amplitude) * (math.random() - 0.5) - p
|
||||
yc = ycy * h + ((-0.5 * h) * y)
|
||||
ctx:move_to (x, yc + 3)
|
||||
ctx:line_to (l_x, l_y + 3)
|
||||
l_x = x
|
||||
l_y = yc
|
||||
ctx:stroke()
|
||||
p = p + inc
|
||||
end
|
||||
return {w, h + 6}
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue