13
0

moving singen and noisegen from mixbus repo to ardour + change singen display and add noisegen display

This commit is contained in:
Nikolaus Gullotta 2018-04-06 12:54:41 -05:00
parent 112a1ab1c4
commit 29aba34d1c
3 changed files with 197 additions and 9 deletions

View File

@ -188,15 +188,6 @@ public:
protected:
Gtk::ColorButton _cs;
};
/*
local a = {
{type = "color", key = "col", title = ""}
}
local rv = LuaDialog.Dialog("", a):run()
print(rv['col'])
*/
class LuaDialogCheckbox : public LuaDialogWidget
{

103
scripts/noisegen.lua Normal file
View File

@ -0,0 +1,103 @@
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 ao = 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
-- passes array a {} into buffer
for c = 1,#outs do
outs[c]:set_table(a, n_samples)
end
if (a ~= ao) then
self:queue_draw()
end
ao = amplitude
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

94
scripts/singen.lua Normal file
View File

@ -0,0 +1,94 @@
ardour {
["type"] = "dsp",
name = "SinGen",
category = "Instrument",
license = "MIT",
author = "Ardour Team",
description = [[Sine Wave Generator (v1.2)]]
}
local lpf = 0
function dsp_params ()
return
{
{ ["type"] = "input", name = "Frequency", min = 20, max = 20000, default = 1000, unit="Hz", logarithmic = true },
{ ["type"] = "input", name = "Gain", min = -90, max = 0, default = -18, unit="dB" },
}
end
function dsp_ioconfig ()
return { [1] = { audio_in = -1, audio_out = -1}, }
end
function dsp_init (rate)
r = rate
lpf = 2048 / rate
end
function low_pass_filter_param(old, new, limit)
if math.abs (old - new) < limit then
return new
else
return old + lpf * (new - old)
end
end
local p = 0
local fo = 0
local ao = 0
function dsp_run (ins, outs, n_samples)
local ctrl = CtrlPorts:array() --call parameters
local a = {} --init array
local f = ctrl[1] or 1000
local amp = low_pass_filter_param(ao, ARDOUR.DSP.dB_to_coefficient(ctrl[2]), 0.02)
local inc = f / r
for s = 1, n_samples do --fill table with fragments of a sine wave
p = p + inc
a[s] = amp * math.sin(p * (2 * math.pi))
end
for c = 1,#outs do
outs[c]:set_table(a, n_samples) --passes array into buffer
end
if (f ~= fo) or (a ~= ao) then
self:queue_draw()
end
fo = f
ao = amp
end
function render_inline (ctx, w, max_h) --inline display
local ctrl = CtrlPorts:array()
h = 30
p = 0
inc = 1/w
f = ctrl[1] / 1000
if f < 0.5 then f = 0.5 end
if f > 8 then f = 8 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
y = ARDOUR.DSP.dB_to_coefficient(ctrl[2]) * math.sin(f * (2 * math.pi * (p)))
yc = 0.5 * 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