midi-message 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +13 -0
- data/README.rdoc +100 -0
- data/TODO +0 -0
- data/lib/midi-message/channel_message.rb +179 -0
- data/lib/midi-message/constant.rb +61 -0
- data/lib/midi-message/context.rb +104 -0
- data/lib/midi-message/note_message.rb +70 -0
- data/lib/midi-message/parser.rb +48 -0
- data/lib/midi-message/process/filter.rb +58 -0
- data/lib/midi-message/process/limit.rb +31 -0
- data/lib/midi-message/process/processor.rb +30 -0
- data/lib/midi-message/process/transpose.rb +30 -0
- data/lib/midi-message/short_message.rb +119 -0
- data/lib/midi-message/system_exclusive.rb +202 -0
- data/lib/midi-message/system_message.rb +47 -0
- data/lib/midi-message/type_conversion.rb +47 -0
- data/lib/midi-message.rb +37 -0
- data/lib/midi.yml +337 -0
- data/test/helper.rb +11 -0
- data/test/test_constants.rb +48 -0
- data/test/test_context.rb +86 -0
- data/test/test_filter.rb +95 -0
- data/test/test_limit.rb +39 -0
- data/test/test_mutability.rb +28 -0
- data/test/test_parser.rb +72 -0
- data/test/test_processor.rb +19 -0
- data/test/test_short_message.rb +123 -0
- data/test/test_system_exclusive.rb +100 -0
- data/test/test_transpose.rb +39 -0
- metadata +74 -0
data/lib/midi.yml
ADDED
@@ -0,0 +1,337 @@
|
|
1
|
+
Status:
|
2
|
+
Note Off: 0x8
|
3
|
+
Note On: 0x9
|
4
|
+
Polyphonic Aftertouch: 0xA
|
5
|
+
Control Change: 0xB
|
6
|
+
Program Change: 0xC
|
7
|
+
Channel Aftertouch: 0xD
|
8
|
+
Pitch Bend: 0xE
|
9
|
+
System Exclusive: 0xF0
|
10
|
+
System Common: [0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6]
|
11
|
+
System Realtime: [0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF]
|
12
|
+
|
13
|
+
Control Change:
|
14
|
+
Bank Select: 0
|
15
|
+
Modulation Wheel: 1
|
16
|
+
Breath Controller: 2
|
17
|
+
Foot Controller: 4
|
18
|
+
Portamento Time: 5
|
19
|
+
Data Entry MSB: 6
|
20
|
+
Channel Volume: 7
|
21
|
+
Balance: 8
|
22
|
+
Pan: 10
|
23
|
+
Expression Controller: 11
|
24
|
+
General Purpose Controllers: 16
|
25
|
+
General Purpose Controllers: 17
|
26
|
+
General Purpose Controllers: 18
|
27
|
+
General Purpose Controllers: 19
|
28
|
+
LSB for controller 0: 32
|
29
|
+
LSB for controller 1: 33
|
30
|
+
LSB for controller 2: 34
|
31
|
+
LSB for controller 3: 35
|
32
|
+
LSB for controller 4: 36
|
33
|
+
LSB for controller 5: 37
|
34
|
+
LSB for controller 6: 38
|
35
|
+
LSB for controller 7: 39
|
36
|
+
LSB for controller 8: 40
|
37
|
+
LSB for controller 9: 41
|
38
|
+
LSB for controller 10: 42
|
39
|
+
LSB for controller 11: 43
|
40
|
+
LSB for controller 12: 44
|
41
|
+
LSB for controller 13: 45
|
42
|
+
LSB for controller 14: 46
|
43
|
+
LSB for controller 15: 47
|
44
|
+
LSB for controller 16: 48
|
45
|
+
LSB for controller 17: 49
|
46
|
+
LSB for controller 18: 50
|
47
|
+
LSB for controller 19: 51
|
48
|
+
LSB for controller 20: 52
|
49
|
+
LSB for controller 21: 53
|
50
|
+
LSB for controller 22: 54
|
51
|
+
LSB for controller 23: 55
|
52
|
+
LSB for controller 24: 56
|
53
|
+
LSB for controller 25: 57
|
54
|
+
LSB for controller 26: 58
|
55
|
+
LSB for controller 27: 59
|
56
|
+
LSB for controller 28: 60
|
57
|
+
LSB for controller 29: 61
|
58
|
+
LSB for controller 30: 62
|
59
|
+
LSB for controller 31: 63
|
60
|
+
Sustain: 64
|
61
|
+
Hold Pedal: 64
|
62
|
+
Portamento: 65
|
63
|
+
|
64
|
+
Control Mode:
|
65
|
+
All Sound Off: 120
|
66
|
+
All Controllers Off: 121
|
67
|
+
Local Keyboard Toggle: 122
|
68
|
+
All Notes Off: 123
|
69
|
+
Omni Off: 124
|
70
|
+
Omni On: 125
|
71
|
+
Mono: 126
|
72
|
+
Poly: 127
|
73
|
+
|
74
|
+
System Common:
|
75
|
+
Song Position Pointer: 0x2
|
76
|
+
Song Select: 0x3
|
77
|
+
Tune Request: 0x6
|
78
|
+
|
79
|
+
System Realtime:
|
80
|
+
Start: 0xA
|
81
|
+
Clock: 0x8
|
82
|
+
Continue: 0xB
|
83
|
+
Stop: 0xC
|
84
|
+
ActiveSense: 0xE
|
85
|
+
Reset: 0xF
|
86
|
+
|
87
|
+
Manufacturer:
|
88
|
+
|
89
|
+
SequentialCircuits: 1
|
90
|
+
BigBriar: 2
|
91
|
+
Octave: 3
|
92
|
+
Moog: 4
|
93
|
+
Passport: 5
|
94
|
+
Lexicon: 6
|
95
|
+
|
96
|
+
PAIA: 0x11
|
97
|
+
Simmons: 0x12
|
98
|
+
GentleElectric: 0x13
|
99
|
+
Fairlight: 0x14
|
100
|
+
BonTempi: 0x20
|
101
|
+
SIEL: 0x21
|
102
|
+
SyntheAxe: 0x23
|
103
|
+
|
104
|
+
Kawai: 0x40
|
105
|
+
Roland: 0x41
|
106
|
+
Korg: 0x42
|
107
|
+
Yamaha: 0x43
|
108
|
+
Casio: 0x44
|
109
|
+
Akai: 0x47
|
110
|
+
|
111
|
+
Emagic: [0x00, 0x20, 0x31]
|
112
|
+
Behringer: [0x00, 0x20, 0x32]
|
113
|
+
|
114
|
+
Note:
|
115
|
+
C-1: 0
|
116
|
+
C#-1: 1
|
117
|
+
Db-1: 1
|
118
|
+
D-1: 2
|
119
|
+
Eb-1: 3
|
120
|
+
D#-1: 3
|
121
|
+
E-1: 4
|
122
|
+
Fb-1: 4
|
123
|
+
F-1: 5
|
124
|
+
E#-1: 5
|
125
|
+
F#-1: 6
|
126
|
+
Gb-1: 6
|
127
|
+
G-1: 7
|
128
|
+
G#-1: 8
|
129
|
+
Ab-1: 8
|
130
|
+
A-1: 9
|
131
|
+
A#-1: 10
|
132
|
+
Bb-1: 10
|
133
|
+
B-1: 11
|
134
|
+
Cb0: 11
|
135
|
+
C0: 12
|
136
|
+
B#-1: 12
|
137
|
+
C#0: 13
|
138
|
+
Db0: 13
|
139
|
+
D0: 14
|
140
|
+
D#0: 15
|
141
|
+
Eb0: 15
|
142
|
+
E0: 16
|
143
|
+
Fb0: 16
|
144
|
+
F0: 17
|
145
|
+
E#0: 17
|
146
|
+
F#0: 18
|
147
|
+
Gb0: 18
|
148
|
+
G0: 19
|
149
|
+
Ab0: 20
|
150
|
+
G#0: 20
|
151
|
+
A0: 21
|
152
|
+
Bb0: 22
|
153
|
+
A#0: 22
|
154
|
+
B0: 23
|
155
|
+
Cb1: 23
|
156
|
+
C1: 24
|
157
|
+
B#0: 24
|
158
|
+
Db1: 25
|
159
|
+
C#1: 25
|
160
|
+
D1: 26
|
161
|
+
D#1: 27
|
162
|
+
Eb1: 27
|
163
|
+
E1: 28
|
164
|
+
Fb1: 28
|
165
|
+
F1: 29
|
166
|
+
E#1: 29
|
167
|
+
F#1: 30
|
168
|
+
Gb1: 30
|
169
|
+
G1: 31
|
170
|
+
Ab1: 32
|
171
|
+
G#1: 32
|
172
|
+
A1: 33
|
173
|
+
A#1: 34
|
174
|
+
Bb1: 34
|
175
|
+
B1: 35
|
176
|
+
Cb2: 35
|
177
|
+
C2: 36
|
178
|
+
B#1: 36
|
179
|
+
Db2: 37
|
180
|
+
C#2: 37
|
181
|
+
D2: 38
|
182
|
+
D#2: 39
|
183
|
+
Eb2: 39
|
184
|
+
E2: 40
|
185
|
+
Fb2: 40
|
186
|
+
F2: 41
|
187
|
+
E#2: 41
|
188
|
+
F#2: 42
|
189
|
+
Gb2: 42
|
190
|
+
G2: 43
|
191
|
+
G#2: 44
|
192
|
+
Ab2: 44
|
193
|
+
A2: 45
|
194
|
+
A#2: 46
|
195
|
+
Bb2: 46
|
196
|
+
B2: 47
|
197
|
+
Cb3: 47
|
198
|
+
C3: 48
|
199
|
+
B#2: 48
|
200
|
+
C#3: 49
|
201
|
+
Db3: 49
|
202
|
+
D3: 50
|
203
|
+
Eb3: 51
|
204
|
+
D#3: 51
|
205
|
+
E3: 52
|
206
|
+
Fb3: 52
|
207
|
+
F3: 53
|
208
|
+
E#3: 53
|
209
|
+
F#3: 54
|
210
|
+
Gb3: 54
|
211
|
+
G3: 55
|
212
|
+
Ab3: 56
|
213
|
+
G#3: 56
|
214
|
+
A3: 57
|
215
|
+
A#3: 58
|
216
|
+
Bb3: 58
|
217
|
+
B3: 59
|
218
|
+
Cb4: 59
|
219
|
+
C4: 60
|
220
|
+
B#3: 60
|
221
|
+
C#4: 61
|
222
|
+
Db4: 61
|
223
|
+
D4: 62
|
224
|
+
D#4: 63
|
225
|
+
Eb4: 63
|
226
|
+
E4: 64
|
227
|
+
Fb4: 64
|
228
|
+
F4: 65
|
229
|
+
E#4: 65
|
230
|
+
Gb4: 66
|
231
|
+
F#4: 66
|
232
|
+
G4: 67
|
233
|
+
Ab4: 68
|
234
|
+
G#4: 68
|
235
|
+
A4: 69
|
236
|
+
A#4: 70
|
237
|
+
Bb4: 70
|
238
|
+
B4: 71
|
239
|
+
Cb5: 71
|
240
|
+
C5: 72
|
241
|
+
B#4: 72
|
242
|
+
C#5: 73
|
243
|
+
Db5: 73
|
244
|
+
D5: 74
|
245
|
+
Eb5: 75
|
246
|
+
D#5: 75
|
247
|
+
E5: 76
|
248
|
+
Fb5: 76
|
249
|
+
F5: 77
|
250
|
+
E#5: 77
|
251
|
+
F#5: 78
|
252
|
+
Gb5: 78
|
253
|
+
G5: 79
|
254
|
+
Ab5: 80
|
255
|
+
G#5: 80
|
256
|
+
A5: 81
|
257
|
+
A#5: 82
|
258
|
+
Bb5: 82
|
259
|
+
B5: 83
|
260
|
+
Cb6: 83
|
261
|
+
C6: 84
|
262
|
+
B#5: 84
|
263
|
+
C#6: 85
|
264
|
+
Db6: 85
|
265
|
+
D6: 86
|
266
|
+
D#6: 87
|
267
|
+
Eb6: 87
|
268
|
+
E6: 88
|
269
|
+
Fb6: 88
|
270
|
+
F6: 89
|
271
|
+
E#6: 89
|
272
|
+
Gb6: 90
|
273
|
+
F#6: 90
|
274
|
+
G6: 91
|
275
|
+
Ab6: 92
|
276
|
+
G#6: 92
|
277
|
+
A6: 93
|
278
|
+
A#6: 94
|
279
|
+
Bb6: 94
|
280
|
+
B6: 95
|
281
|
+
Cb7: 95
|
282
|
+
C7: 96
|
283
|
+
B#6: 96
|
284
|
+
C#7: 97
|
285
|
+
Db7: 97
|
286
|
+
D7: 98
|
287
|
+
D#7: 99
|
288
|
+
Eb7: 99
|
289
|
+
E7: 100
|
290
|
+
Fb7: 100
|
291
|
+
F7: 101
|
292
|
+
E#7: 101
|
293
|
+
Gb7: 102
|
294
|
+
F#7: 102
|
295
|
+
G7: 103
|
296
|
+
Ab7: 104
|
297
|
+
G#7: 104
|
298
|
+
A7: 105
|
299
|
+
A#7: 106
|
300
|
+
Bb7: 106
|
301
|
+
B7: 107
|
302
|
+
Cb8: 107
|
303
|
+
C8: 108
|
304
|
+
B#7: 108
|
305
|
+
C#8: 109
|
306
|
+
Db8: 109
|
307
|
+
D8: 110
|
308
|
+
D#8: 111
|
309
|
+
Eb8: 111
|
310
|
+
E8: 112
|
311
|
+
Fb8: 112
|
312
|
+
F8: 113
|
313
|
+
E#8: 113
|
314
|
+
Gb8: 114
|
315
|
+
F#8: 114
|
316
|
+
G8: 115
|
317
|
+
Ab8: 116
|
318
|
+
G#8: 116
|
319
|
+
A8: 117
|
320
|
+
A#8: 118
|
321
|
+
Bb8: 118
|
322
|
+
B8: 119
|
323
|
+
Cb9: 119
|
324
|
+
C9: 120
|
325
|
+
B#8: 120
|
326
|
+
C#9: 121
|
327
|
+
Db9: 121
|
328
|
+
D9: 122
|
329
|
+
D#9: 123
|
330
|
+
Eb9: 123
|
331
|
+
E9: 124
|
332
|
+
Fb9: 124
|
333
|
+
F9: 125
|
334
|
+
E#9: 125
|
335
|
+
Gb9: 126
|
336
|
+
F#9: 126
|
337
|
+
G9: 127
|
data/test/helper.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class ConstantsTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include TestHelper
|
9
|
+
|
10
|
+
def test_note_on
|
11
|
+
msg = NoteOn["c3"].new(0, 100)
|
12
|
+
assert_equal(NoteOn, msg.class)
|
13
|
+
assert_equal("C3", msg.name)
|
14
|
+
assert_equal("C", msg.note_name)
|
15
|
+
assert_equal([0x90, 0x30, 100], msg.to_a)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_control_change
|
19
|
+
msg = NoteOn["C3"].new(0, 100)
|
20
|
+
assert_equal(NoteOn, msg.class)
|
21
|
+
assert_equal("C3", msg.name)
|
22
|
+
assert_equal([0x90, 0x30, 100], msg.to_a)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_control_change
|
26
|
+
msg = ControlChange["Modulation Wheel"].new(2, 0x20)
|
27
|
+
assert_equal(ControlChange, msg.class)
|
28
|
+
assert_equal(msg.channel, 2)
|
29
|
+
assert_equal(0x01, msg.index)
|
30
|
+
assert_equal(0x20, msg.value)
|
31
|
+
assert_equal([0xB2, 0x01, 0x20], msg.to_a)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_system_realtime
|
35
|
+
msg = SystemRealtime["Stop"].new
|
36
|
+
assert_equal(SystemRealtime, msg.class)
|
37
|
+
assert_equal("Stop", msg.name)
|
38
|
+
assert_equal([0xFC], msg.to_a)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_system_common
|
42
|
+
msg = SystemCommon["Song Select"].new
|
43
|
+
assert_equal(SystemCommon, msg.class)
|
44
|
+
assert_equal("Song Select", msg.name)
|
45
|
+
assert_equal([0xF3], msg.to_a)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class ContextTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include TestHelper
|
9
|
+
def test_note_off
|
10
|
+
msg = with(:channel => 0, :velocity => 64) do
|
11
|
+
note_off(55)
|
12
|
+
end
|
13
|
+
assert_equal(0, msg.channel)
|
14
|
+
assert_equal(55, msg.note)
|
15
|
+
assert_equal(64, msg.velocity)
|
16
|
+
assert_equal([128, 55, 64], msg.to_a)
|
17
|
+
assert_equal("803740", msg.to_bytestr)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_note_on
|
21
|
+
msg = with(:channel => 0, :velocity => 64) do
|
22
|
+
note_on(55)
|
23
|
+
end
|
24
|
+
assert_equal(0, msg.channel)
|
25
|
+
assert_equal(55, msg.note)
|
26
|
+
assert_equal(64, msg.velocity)
|
27
|
+
assert_equal([144, 55, 64], msg.to_a)
|
28
|
+
assert_equal("903740", msg.to_bytestr)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_control_change
|
32
|
+
msg = with(:channel => 2) do
|
33
|
+
control_change(0x20, 0x30)
|
34
|
+
end
|
35
|
+
assert_equal(msg.channel, 2)
|
36
|
+
assert_equal(0x20, msg.index)
|
37
|
+
assert_equal(0x30, msg.value)
|
38
|
+
assert_equal([0xB2, 0x20, 0x30], msg.to_a)
|
39
|
+
assert_equal("B22030", msg.to_bytestr)
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_polyphonic_aftertouch
|
44
|
+
msg = with(:channel => 1) do
|
45
|
+
polyphonic_aftertouch(0x40, 0x40)
|
46
|
+
end
|
47
|
+
assert_equal(1, msg.channel)
|
48
|
+
assert_equal(0x40, msg.note)
|
49
|
+
assert_equal(0x40, msg.value)
|
50
|
+
assert_equal([0xA1, 0x40, 0x40], msg.to_a)
|
51
|
+
assert_equal("A14040", msg.to_bytestr)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_program_change
|
55
|
+
msg = with(:channel => 3) do
|
56
|
+
program_change(0x40)
|
57
|
+
end
|
58
|
+
assert_equal(3, msg.channel)
|
59
|
+
assert_equal(0x40, msg.program)
|
60
|
+
assert_equal([0xC3, 0x40], msg.to_a)
|
61
|
+
assert_equal("C340", msg.to_bytestr)
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_channel_aftertouch
|
66
|
+
msg = with(:channel => 3) do
|
67
|
+
channel_aftertouch(0x50)
|
68
|
+
end
|
69
|
+
assert_equal(3, msg.channel)
|
70
|
+
assert_equal(0x50, msg.value)
|
71
|
+
assert_equal([0xD3, 0x50], msg.to_a)
|
72
|
+
assert_equal("D350", msg.to_bytestr)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_pitch_bend
|
76
|
+
msg = with(:channel => 0) do
|
77
|
+
pitch_bend(0x50, 0xA0)
|
78
|
+
end
|
79
|
+
assert_equal(0, msg.channel)
|
80
|
+
assert_equal(0x50, msg.low)
|
81
|
+
assert_equal(0xA0, msg.high)
|
82
|
+
assert_equal([0xE0, 0x50, 0xA0], msg.to_a)
|
83
|
+
assert_equal("E050A0", msg.to_bytestr)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
data/test/test_filter.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class FilterTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include MIDIMessage::Process
|
9
|
+
include TestHelper
|
10
|
+
|
11
|
+
def test_high_pass_note_reject
|
12
|
+
msg = MIDIMessage::NoteOn["C0"].new(0, 100)
|
13
|
+
assert_equal(12, msg.note)
|
14
|
+
outp = HighPassFilter.new(msg, :note, 20).process
|
15
|
+
assert_equal(nil, outp)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_high_pass_note_accept
|
19
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
20
|
+
assert_equal(60, msg.note)
|
21
|
+
outp = HighPassFilter.new(msg, :note, 20).process
|
22
|
+
assert_equal(msg, outp)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_low_pass_note_reject
|
26
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
27
|
+
assert_equal(60, msg.note)
|
28
|
+
outp = LowPassFilter.new(msg, :note, 50).process
|
29
|
+
assert_equal(nil, outp)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_low_pass_note_accept
|
33
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
34
|
+
assert_equal(60, msg.note)
|
35
|
+
outp = LowPassFilter.new(msg, :note, 100).process
|
36
|
+
assert_equal(msg, outp)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_band_pass_note_reject
|
40
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
41
|
+
assert_equal(60, msg.note)
|
42
|
+
outp = BandPassFilter.new(msg, :note, (20..50)).process
|
43
|
+
assert_equal(nil, outp)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_band_pass_note_accept
|
47
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
48
|
+
assert_equal(60, msg.note)
|
49
|
+
outp = BandPassFilter.new(msg, :note, (20..100)).process
|
50
|
+
assert_equal(msg, outp)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_band_reject_note_reject
|
54
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
55
|
+
assert_equal(60, msg.note)
|
56
|
+
outp = NotchFilter.new(msg, :note, (20..70)).process
|
57
|
+
assert_equal(nil, outp)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_band_reject_note_accept
|
61
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
62
|
+
assert_equal(60, msg.note)
|
63
|
+
outp = NotchFilter.new(msg, :note, (20..50)).process
|
64
|
+
assert_equal(msg, outp)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_multiband_note_reject
|
68
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
69
|
+
assert_equal(60, msg.note)
|
70
|
+
outp = Filter.new(msg, :note, [(20..30), (40..50)]).process
|
71
|
+
assert_equal(nil, outp)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_multiband_note_accept
|
75
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
76
|
+
assert_equal(60, msg.note)
|
77
|
+
outp = Filter.new(msg, :note, [(20..30), (50..70)]).process
|
78
|
+
assert_equal(msg, outp)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_multinotch_note_reject
|
82
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
83
|
+
assert_equal(60, msg.note)
|
84
|
+
outp = Filter.new(msg, :note, [(20..30), (55..65)], :reject => true).process
|
85
|
+
assert_equal(nil, outp)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_multinotch_note_accept
|
89
|
+
msg = MIDIMessage::NoteOn["C4"].new(0, 100)
|
90
|
+
assert_equal(60, msg.note)
|
91
|
+
outp = Filter.new(msg, :note, [(20..30), (40..50)], :reject => true).process
|
92
|
+
assert_equal(msg, outp)
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
data/test/test_limit.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class LimitTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include MIDIMessage::Process
|
9
|
+
include TestHelper
|
10
|
+
|
11
|
+
def test_low_note
|
12
|
+
msg = MIDIMessage::NoteOn["C0"].new(0, 100)
|
13
|
+
assert_equal(12, msg.note)
|
14
|
+
Limit.new(msg, :note, (20..50)).process
|
15
|
+
assert_equal(20, msg.note)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_high_note
|
19
|
+
msg = MIDIMessage::NoteOn["C6"].new(0, 100)
|
20
|
+
assert_equal(84, msg.note)
|
21
|
+
Limit.new(msg, :note, (20..50)).process
|
22
|
+
assert_equal(50, msg.note)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_low_velocity
|
26
|
+
msg = MIDIMessage::NoteOn["C0"].new(0, 10)
|
27
|
+
assert_equal(10, msg.velocity)
|
28
|
+
Limit.new(msg, :velocity, (30..110)).process
|
29
|
+
assert_equal(30, msg.velocity)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_high_velocity
|
33
|
+
msg = MIDIMessage::NoteOn["C6"].new(0, 120)
|
34
|
+
assert_equal(120, msg.velocity)
|
35
|
+
Limit.new(msg, :velocity, (25..75)).process
|
36
|
+
assert_equal(75, msg.velocity)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class MutabilityTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include TestHelper
|
9
|
+
|
10
|
+
def test_note
|
11
|
+
msg = NoteOn["E4"].new(0, 100)
|
12
|
+
assert_equal(0x40, msg.note)
|
13
|
+
assert_equal("E4", msg.name)
|
14
|
+
msg.note += 5
|
15
|
+
assert_equal(0x45, msg.note)
|
16
|
+
assert_equal("A4", msg.name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_octave
|
20
|
+
msg = NoteOn["E4"].new(0, 100)
|
21
|
+
assert_equal(0x40, msg.note)
|
22
|
+
assert_equal("E4", msg.name)
|
23
|
+
msg.octave += 1
|
24
|
+
assert_equal(0x4C, msg.note)
|
25
|
+
assert_equal("E5", msg.name)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/test/test_parser.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class ParserTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include MIDIMessage
|
8
|
+
include TestHelper
|
9
|
+
|
10
|
+
def test_sysex
|
11
|
+
msg = MIDIMessage.parse(0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7)
|
12
|
+
assert_equal(SystemExclusive::Command, msg.class)
|
13
|
+
assert_equal(SystemExclusive::Node, msg.node.class)
|
14
|
+
assert_equal([0x40, 0x00, 0x7F], msg.address)
|
15
|
+
assert_equal([0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7], msg.to_bytes)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_note_off
|
19
|
+
msg = MIDIMessage.parse(0x80, 0x40, 0x40)
|
20
|
+
assert_equal(NoteOff, msg.class)
|
21
|
+
assert_equal([0x80, 0x40, 0x40], msg.to_a)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_note_on
|
25
|
+
msg = MIDIMessage.parse(0x90, 0x40, 0x40)
|
26
|
+
assert_equal(NoteOn, msg.class)
|
27
|
+
assert_equal([0x90, 0x40, 0x40], msg.to_a)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_polyphonic_aftertouch
|
31
|
+
msg = MIDIMessage.parse(0xA1, 0x40, 0x40)
|
32
|
+
assert_equal(PolyphonicAftertouch, msg.class)
|
33
|
+
assert_equal([0xA1, 0x40, 0x40], msg.to_a)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_control_change
|
37
|
+
msg = MIDIMessage.parse(0xB2, 0x20, 0x20)
|
38
|
+
assert_equal(ControlChange, msg.class)
|
39
|
+
assert_equal([0xB2, 0x20, 0x20], msg.to_a)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_program_change
|
43
|
+
msg = MIDIMessage.parse(0xC3, 0x40)
|
44
|
+
assert_equal(ProgramChange, msg.class)
|
45
|
+
assert_equal("C340", msg.to_bytestr)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_channel_aftertouch
|
49
|
+
msg = MIDIMessage.parse("D350")
|
50
|
+
assert_equal(ChannelAftertouch, msg.class)
|
51
|
+
assert_equal([0xD3, 0x50], msg.to_a)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_pitch_bend
|
55
|
+
msg = MIDIMessage.parse("E050A0")
|
56
|
+
assert_equal(PitchBend, msg.class)
|
57
|
+
assert_equal([0xE0, 0x50, 0xA0], msg.to_a)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_system_common
|
61
|
+
msg = MIDIMessage.parse([0xF1, 0x50, 0xA0])
|
62
|
+
assert_equal(SystemCommon, msg.class)
|
63
|
+
assert_equal([0xF1, 0x50, 0xA0], msg.to_a)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_system_realtime
|
67
|
+
msg = MIDIMessage.parse(0xF8)
|
68
|
+
assert_equal(SystemRealtime, msg.class)
|
69
|
+
assert_equal([0xF8], msg.to_a)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|