From 29aba34d1cea4aef02f5cec7ec9939c4f6a5f8ab Mon Sep 17 00:00:00 2001 From: Nikolaus Gullotta Date: Fri, 6 Apr 2018 12:54:41 -0500 Subject: [PATCH] moving singen and noisegen from mixbus repo to ardour + change singen display and add noisegen display --- gtk2_ardour/luadialog.cc | 9 ---- scripts/noisegen.lua | 103 +++++++++++++++++++++++++++++++++++++++ scripts/singen.lua | 94 +++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 scripts/noisegen.lua create mode 100644 scripts/singen.lua diff --git a/gtk2_ardour/luadialog.cc b/gtk2_ardour/luadialog.cc index 943b077b77..0bc1e8aad8 100644 --- a/gtk2_ardour/luadialog.cc +++ b/gtk2_ardour/luadialog.cc @@ -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 { diff --git a/scripts/noisegen.lua b/scripts/noisegen.lua new file mode 100644 index 0000000000..684f421364 --- /dev/null +++ b/scripts/noisegen.lua @@ -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 diff --git a/scripts/singen.lua b/scripts/singen.lua new file mode 100644 index 0000000000..8b22c1257b --- /dev/null +++ b/scripts/singen.lua @@ -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 \ No newline at end of file