summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-11-21 21:24:11 +0100
committerRobin Gareus <robin@gareus.org>2016-11-21 21:24:11 +0100
commite7243c0486b8225271d08784c832577a0cfcee46 (patch)
tree0fcc5a31949a35f866d32bfc38b105b91a11565e /scripts
parentb53ea4ea0e29c5566ed2e09664c209804d211d3b (diff)
MIDI LFO generator plugin
Diffstat (limited to 'scripts')
-rw-r--r--scripts/_midi_lfo.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/scripts/_midi_lfo.lua b/scripts/_midi_lfo.lua
new file mode 100644
index 0000000000..fd8b2b07ef
--- /dev/null
+++ b/scripts/_midi_lfo.lua
@@ -0,0 +1,74 @@
+ardour {
+ ["type"] = "dsp",
+ name = "MIDI LFO",
+ category = "Example", -- Utility
+ license = "MIT",
+ author = "Ardour Lua Task Force",
+ description = [[MIDI CC LFO Example -- Triangle full scale CC Parameter automation]]
+}
+
+function dsp_ioconfig ()
+ return { { midi_in = 1, midi_out = 1, audio_in = 0, audio_out = 0}, }
+end
+
+function dsp_params ()
+ return
+ {
+ { ["type"] = "input", name = "BPM", min = 40, max = 200, default = 60, unit="BPM"},
+ { ["type"] = "input", name = "CC", min = 0, max = 127, default = 1, integer = true },
+ }
+end
+
+local samplerate
+local time = 0
+local step = 0
+
+function dsp_init (rate)
+ samplerate = rate
+ local bpm = 120
+ spb = rate * 60 / bpm
+end
+
+function dsp_run (_, _, n_samples)
+ assert (type(midiin) == "table")
+ assert (type(midiout) == "table")
+
+ local ctrl = CtrlPorts:array ()
+ local bpm = ctrl[1]
+ local cc = ctrl[2]
+
+ local spb = samplerate * 60 / bpm -- samples per beat
+ local sps = spb / 254 -- samples per step (0..127..1 = 254 steps)
+
+ assert (sps > 1)
+ local i = 1
+ local m = 1
+
+ for ts = 1, n_samples do
+ time = time + 1
+
+ -- forward incoming midi
+ if i <= #midiin then
+ while midiin[i]["time"] == ts do
+ midiout[m] = midiin[i]
+ i = i + 1
+ m = m + 1
+ if i > #midiin then break end
+ end
+ end
+
+ -- inject LFO events
+ if time >= spb then
+ local val
+ if step > 127 then val = 254 - step else val = step end
+
+ midiout[m] = {}
+ midiout[m]["time"] = ts
+ midiout[m]["data"] = { 0xb0, cc, val }
+
+ m = m + 1
+ time = time - sps
+ if step == 253 then step = 0 else step = step + 1 end
+ end
+ end
+end