-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtryToRecord.lua
More file actions
124 lines (113 loc) · 3.03 KB
/
Copy pathtryToRecord.lua
File metadata and controls
124 lines (113 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
ardour {
["type"] = "dsp",
name = "Midi Record",
category = "Midi",
license = "GPLv2",
author = "R8000",
description = [[hello]]
}
function dsp_ioconfig ()
return { {midi_in = 1, midi_out = 1, audio_in = -1, audio_out = -1}, }
end
function dsp_configure(ins, outs)
n_out = outs
n_out:set_midi(0)
end
local distanceFromRecordStart = -1
local distanceFromLoopStart = 0
local recordOnAtPreviousCheck = 0
local loopOnAtPreviousCheck = 0
local sizeOfLoop = 10000000000
local firstBar = 0
local tme = 0 -- sample-counter
local seq = 1 -- sequence-step
local spb = 0 -- samples per beat
local rateO = 0
local currentSample = 0
local currentOffset = 0
local beatsInABar = 4
local samplesPerBar = 0
--assuming 4 beats per bar
local midi_sequence1 = {
}
function dsp_params ()
return
{
{["type"] = "input", name = "Record", min = 0, max = 1, default = 0, enum = true, scalepoints =
{
["Off"] = 0,
["On"] = 1
}
},
{["type"] = "input", name = "Loop", min = 0, max = 1, default = 0, enum = true, scalepoints =
{
["Off"] = 0,
["On"] = 1
}
}
}
end
function dsp_init (rate)
end
function string.starts(String,Start)
return string.sub(String,1,string.len(Start))==Start
end
function dsp_dsp_midi_input ()
return true
end
function dsp_run (_, _, n_samples)
assert (type(midiin) == "table")
assert (type(midiout) == "table")
local ctrl = CtrlPorts:array()
local record = ctrl[1]
if(recordOnAtPreviousCheck <1 and record == 1) then
distanceFromRecordStart = 0
recordOnAtPreviousCheck = 1
midi_sequence1 = {}
end
if(recordOnAtPreviousCheck == 1 and record < 1) then
sizeOfLoop = distanceFromRecordStart
--print(sizeOfLoop)
end
recordOnAtPreviousCheck = record
local loop = ctrl[2]
if(loopOnAtPreviousCheck < 1 and loop == 1) then
distanceFromLoopStart = 0
loopOnAtPreviousCheck = 1
end
loopOnAtPreviousCheck = loop
if(record == 1) then
local m = 1
for _,b in pairs (midiin) do
local t = b["time"] -- t = [ 1 .. n_samples ]
local d = b["data"] -- get midi-event
midiout[m] = {}
midiout[m]["time"] = t
midiout[m]["data"] = d
m = m + 1
local event_type
if #d == 0 then event_type = -1 else event_type = d[1] >> 4 end
if (#d == 3 ) then -- note on
local midiNoteAndTime = {time= t + distanceFromRecordStart, midi= d}
table.insert(midi_sequence1, midiNoteAndTime)
end
end
end
if(loop == 1) then
if(distanceFromLoopStart > sizeOfLoop) then
distanceFromLoopStart = 0
end
local m = 1
for _, midiAndTime in pairs(midi_sequence1) do
local offset = midiAndTime.time - distanceFromLoopStart
if(offset >=0 and offset < n_samples) then
midiout[m] = {}
midiout[m]["time"] = offset
midiout[m]["data"] = midiAndTime.midi
m = m + 1
end
end
end
distanceFromLoopStart = distanceFromLoopStart + n_samples
distanceFromRecordStart = distanceFromRecordStart + n_samples
end