moving singen and noisegen from mixbus repo to ardour + change singen display and...
authorNikolaus Gullotta <nikolaus.gullotta@gmail.com>
Fri, 6 Apr 2018 17:54:41 +0000 (12:54 -0500)
committerNikolaus Gullotta <nikolaus.gullotta@gmail.com>
Fri, 1 Jun 2018 14:55:41 +0000 (09:55 -0500)
gtk2_ardour/luadialog.cc
scripts/noisegen.lua [new file with mode: 0644]
scripts/singen.lua [new file with mode: 0644]

index 943b077b7721bdafc0a4566a8b14c1de7450954f..0bc1e8aad8e797c85abf7b3ac73ea87e4f49869e 100644 (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
 {
diff --git a/scripts/noisegen.lua b/scripts/noisegen.lua
new file mode 100644 (file)
index 0000000..684f421
--- /dev/null
@@ -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 (file)
index 0000000..8b22c12
--- /dev/null
@@ -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