summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorNikolaus Gullotta <nikolaus.gullotta@gmail.com>2018-04-06 12:54:41 -0500
committerNikolaus Gullotta <nikolaus.gullotta@gmail.com>2018-06-01 09:55:41 -0500
commit29aba34d1cea4aef02f5cec7ec9939c4f6a5f8ab (patch)
treefc48256360cdb8b51d7d7b7734405fac9ec82cff /scripts
parent112a1ab1c42ffce4822dbb1bbe4c26c95dbce63d (diff)
moving singen and noisegen from mixbus repo to ardour + change singen display and add noisegen display
Diffstat (limited to 'scripts')
-rw-r--r--scripts/noisegen.lua103
-rw-r--r--scripts/singen.lua94
2 files changed, 197 insertions, 0 deletions
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