midi-message 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/midi-message.rb +1 -1
- data/lib/midi-message/system_exclusive.rb +59 -18
- data/test/test_system_exclusive.rb +23 -1
- metadata +2 -2
data/lib/midi-message.rb
CHANGED
@@ -17,25 +17,24 @@ module MIDIMessage
|
|
17
17
|
EndByte = 0xF7
|
18
18
|
|
19
19
|
# an array of message parts. multiple byte parts will be represented as an array of bytes
|
20
|
-
def to_a
|
20
|
+
def to_a(options = {})
|
21
|
+
omit = options[:omit] || []
|
21
22
|
# this may need to be cached when properties are updated
|
22
23
|
# might be worth benchmarking
|
23
24
|
[
|
24
25
|
self.class::StartByte,
|
25
|
-
@node.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
[value].flatten,
|
31
|
-
checksum,
|
26
|
+
(@node.to_a(options) unless @node.nil? || omit.include?(:node)),
|
27
|
+
(type_byte unless omit.include?(:type)),
|
28
|
+
[address].compact.flatten,
|
29
|
+
[value].compact.flatten,
|
30
|
+
(checksum unless omit.include?(:checksum)),
|
32
31
|
self.class::EndByte
|
33
|
-
]
|
32
|
+
].compact
|
34
33
|
end
|
35
34
|
|
36
35
|
# a flat array of message bytes
|
37
|
-
def to_numeric_byte_array
|
38
|
-
to_a.flatten
|
36
|
+
def to_numeric_byte_array(options = {})
|
37
|
+
to_a(options).flatten
|
39
38
|
end
|
40
39
|
alias_method :to_numeric_bytes, :to_numeric_byte_array
|
41
40
|
alias_method :to_byte_array, :to_numeric_byte_array
|
@@ -81,7 +80,7 @@ module MIDIMessage
|
|
81
80
|
|
82
81
|
include Base
|
83
82
|
|
84
|
-
|
83
|
+
attr_accessor :data
|
85
84
|
alias_method :value, :data
|
86
85
|
#alias_method :value=, :data=
|
87
86
|
|
@@ -130,6 +129,33 @@ module MIDIMessage
|
|
130
129
|
end
|
131
130
|
|
132
131
|
end
|
132
|
+
|
133
|
+
# A SysEx message with no implied type
|
134
|
+
#
|
135
|
+
class Message
|
136
|
+
|
137
|
+
include Base
|
138
|
+
|
139
|
+
attr_accessor :data
|
140
|
+
|
141
|
+
def initialize(data, options = {})
|
142
|
+
@data = (data.kind_of?(Array) && data.length.eql?(1)) ? data[0] : data
|
143
|
+
initialize_sysex(nil, options)
|
144
|
+
end
|
145
|
+
|
146
|
+
# an array of message parts. multiple byte parts will be represented as an array of bytes
|
147
|
+
def to_a(options = {})
|
148
|
+
omit = options[:omit] || []
|
149
|
+
# this may need to be cached when properties are updated
|
150
|
+
# might be worth benchmarking
|
151
|
+
[
|
152
|
+
self.class::StartByte,
|
153
|
+
@data,
|
154
|
+
self.class::EndByte
|
155
|
+
].compact
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
133
159
|
|
134
160
|
#
|
135
161
|
# The SystemExclusive::Node represents a destination for a message. For example a hardware
|
@@ -145,6 +171,15 @@ module MIDIMessage
|
|
145
171
|
@model_id = options[:model_id]
|
146
172
|
@manufacturer_id = manufacturer.kind_of?(Numeric) ? manufacturer : Constant.find("Manufacturer", manufacturer).value
|
147
173
|
end
|
174
|
+
|
175
|
+
def to_a(options = {})
|
176
|
+
omit = options[:omit] || []
|
177
|
+
[
|
178
|
+
(@manufacturer_id unless omit.include?(:manufacturer) || omit.include?(:manufacturer_id)),
|
179
|
+
(@device_id unless omit.include?(:device) || omit.include?(:device_id)),
|
180
|
+
(@model_id unless omit.include?(:model) || omit.include?(:model_id))
|
181
|
+
].compact
|
182
|
+
end
|
148
183
|
|
149
184
|
# this message takes a prototype message, copies it, and returns the copy with its node set
|
150
185
|
# to this node
|
@@ -177,18 +212,24 @@ module MIDIMessage
|
|
177
212
|
end_status = bytes.pop
|
178
213
|
|
179
214
|
return nil unless start_status.eql?(0xF0) && end_status.eql?(0xF7)
|
180
|
-
|
215
|
+
|
216
|
+
type_byte = bytes[3]
|
217
|
+
|
218
|
+
# if the 4th byte isn't status, we will just make this a Message object -- this may need some tweaking
|
219
|
+
if type_byte == 0x11
|
220
|
+
msg_class = Request
|
221
|
+
elsif type_byte == 0x12
|
222
|
+
msg_class = Command
|
223
|
+
else
|
224
|
+
return Message.new(bytes)
|
225
|
+
end
|
226
|
+
|
181
227
|
fixed_length_message_part = bytes.slice!(0,7)
|
182
228
|
|
183
229
|
manufacturer_id = fixed_length_message_part[0]
|
184
230
|
device_id = fixed_length_message_part[1]
|
185
231
|
model_id = fixed_length_message_part[2]
|
186
232
|
|
187
|
-
msg_class = case fixed_length_message_part[3]
|
188
|
-
when 0x11 then Request
|
189
|
-
when 0x12 then Command
|
190
|
-
end
|
191
|
-
|
192
233
|
address = fixed_length_message_part.slice(4,3)
|
193
234
|
checksum = bytes.slice!((bytes.length - 1), 1)
|
194
235
|
value = bytes
|
@@ -19,8 +19,30 @@ class SystemExclusiveMessageTest < Test::Unit::TestCase
|
|
19
19
|
assert_equal(0x41, node.manufacturer_id)
|
20
20
|
assert_equal(0x42, node.model_id)
|
21
21
|
assert_equal(0x10, node.device_id)
|
22
|
+
assert_equal([0x41, 0x10, 0x42], node.to_a)
|
22
23
|
end
|
23
|
-
|
24
|
+
|
25
|
+
def test_no_node
|
26
|
+
msg = SystemExclusive::Command.new([0x40, 0x7F, 0x00], 0x10)
|
27
|
+
assert_equal([0xF0, 0x12, 0x40, 0x7F, 0x00, 0x10, 0x31, 0xF7], msg.to_bytes)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_node_without_model_id
|
31
|
+
node = SystemExclusive::Node.new(:Roland, :device_id => 0x10)
|
32
|
+
assert_equal(0x41, node.manufacturer_id)
|
33
|
+
assert_equal(nil, node.model_id)
|
34
|
+
assert_equal(0x10, node.device_id)
|
35
|
+
assert_equal([0x41, 0x10], node.to_a)
|
36
|
+
msg = SystemExclusive::Command.new([0x40, 0x7F, 0x00], 0x10, :node => node)
|
37
|
+
assert_equal(10, msg.to_bytes.size)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_parse_weird_message
|
41
|
+
msg = SystemExclusive.new(0xF0, 0x41, 0x12, 0x40, 0x00, 0x7F, 0x10, 0x41, 0xF7)
|
42
|
+
assert_equal([0x41, 0x12, 0x40, 0x00, 0x7F, 0x10, 0x41], msg.data)
|
43
|
+
assert_equal([0xF0, 0x41, 0x12, 0x40, 0x00, 0x7F, 0x10, 0x41, 0xF7], msg.to_bytes)
|
44
|
+
end
|
45
|
+
|
24
46
|
def test_new
|
25
47
|
msg = SystemExclusive.new(0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x10, 0x41, 0xF7)
|
26
48
|
assert_equal(0x41, msg.node.manufacturer_id)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midi-message
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
12
|
+
date: 2011-09-12 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: MIDI messages, objectified in Ruby
|
15
15
|
email:
|