midi-message 0.4.7 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/midi-message/constant.rb +53 -34
- data/lib/midi-message.rb +1 -1
- data/test/constant_test.rb +160 -0
- data/test/context_test.rb +111 -60
- data/test/helper.rb +3 -2
- data/test/message_test.rb +2 -0
- metadata +3 -3
- data/test/constants_test.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a74063f4fe5e1a622a69fc4c775763f20046defb
|
4
|
+
data.tar.gz: 19638072ab7f93b748d5a435263947ece626f9ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f85ede4091a84b04f9f292298205cdd7e8fa7e12c24f27e078de4076ede187f94aad464cec41640dfb7aeaf45b2d010a753a4248441143b1157ea93ff5be0a37
|
7
|
+
data.tar.gz: 5f031bf9d385a268d2c3355f787918bf8f1ebdc65321df5a25b7dfc67bc8d5a000f23851e899310f4ee644c9c8f5d161915ffaf74a4845bd87ad0d3630cc4787
|
data/README.md
CHANGED
@@ -4,16 +4,31 @@ module MIDIMessage
|
|
4
4
|
# eg *C4* for MIDI note *60* or *Bank Select* for MIDI control change *0*
|
5
5
|
module Constant
|
6
6
|
|
7
|
+
# Get a Mapping object for the specified constant
|
8
|
+
# @param [Symbol, String] group_name
|
9
|
+
# @param [String] const_name
|
10
|
+
# @return [MIDIMessage::Constant::Map, nil]
|
7
11
|
def self.find(group_name, const_name)
|
8
12
|
group = Group[group_name]
|
9
13
|
group.find(const_name)
|
10
14
|
end
|
11
15
|
|
16
|
+
# Get the value of the specified constant
|
17
|
+
# @param [Symbol, String] group_name
|
18
|
+
# @param [String] const_name
|
19
|
+
# @return [Object]
|
20
|
+
def self.value(group_name, const_name)
|
21
|
+
map = find(group_name, const_name)
|
22
|
+
map.value
|
23
|
+
end
|
24
|
+
|
12
25
|
# MIDI Constant container
|
13
26
|
class Group
|
14
27
|
|
15
|
-
attr_reader :
|
28
|
+
attr_reader :constants, :key
|
16
29
|
|
30
|
+
# @param [String] key
|
31
|
+
# @param [Hash] constants
|
17
32
|
def initialize(key, constants)
|
18
33
|
@key = key
|
19
34
|
@constants = constants.map { |k, v| Constant::Map.new(k, v) }
|
@@ -25,7 +40,6 @@ module MIDIMessage
|
|
25
40
|
def find(name)
|
26
41
|
@constants.find { |const| const.key.to_s.downcase == name.to_s.downcase }
|
27
42
|
end
|
28
|
-
alias_method :[], :find
|
29
43
|
|
30
44
|
# Find a constant by its value
|
31
45
|
# @param [Object] value
|
@@ -34,45 +48,50 @@ module MIDIMessage
|
|
34
48
|
@constants.find { |const| const.value.to_s.downcase == value.to_s.downcase }
|
35
49
|
end
|
36
50
|
|
37
|
-
|
38
|
-
# @return [Array<ConstantGroup>]
|
39
|
-
def self.all
|
40
|
-
ensure_initialized
|
41
|
-
@groups
|
42
|
-
end
|
51
|
+
class << self
|
43
52
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
53
|
+
# All constant groups
|
54
|
+
# @return [Array<ConstantGroup>]
|
55
|
+
def all
|
56
|
+
ensure_initialized
|
57
|
+
@groups
|
58
|
+
end
|
51
59
|
|
52
|
-
|
60
|
+
# Find a constant group by its key
|
61
|
+
# @param [String, Symbol] key
|
62
|
+
# @return [ConstantGroup]
|
63
|
+
def find(key)
|
64
|
+
ensure_initialized
|
65
|
+
@groups.find { |g| g.key.to_s.downcase == key.to_s.downcase }
|
66
|
+
end
|
67
|
+
alias_method :[], :find
|
53
68
|
|
54
|
-
|
55
|
-
# @return [Boolean]
|
56
|
-
def self.ensure_initialized
|
57
|
-
populate_dictionary | populate_groups
|
58
|
-
end
|
69
|
+
private
|
59
70
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@dict = YAML.load_file(File.expand_path('../../midi.yml', __FILE__))
|
65
|
-
true
|
71
|
+
# Lazy initialize
|
72
|
+
# @return [Boolean]
|
73
|
+
def ensure_initialized
|
74
|
+
populate_dictionary | populate_groups
|
66
75
|
end
|
67
|
-
end
|
68
76
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
77
|
+
# Populate the dictionary of constants
|
78
|
+
# @return [Boolean]
|
79
|
+
def populate_dictionary
|
80
|
+
if @dict.nil?
|
81
|
+
@dict = YAML.load_file(File.expand_path('../../midi.yml', __FILE__))
|
82
|
+
true
|
83
|
+
end
|
75
84
|
end
|
85
|
+
|
86
|
+
# Populate the constant groups using the dictionary
|
87
|
+
# @return [Boolean]
|
88
|
+
def populate_groups
|
89
|
+
if @groups.nil? && !@dict.nil?
|
90
|
+
@groups = @dict.map { |k, v| new(k, v) }
|
91
|
+
true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
76
95
|
end
|
77
96
|
|
78
97
|
end
|
data/lib/midi-message.rb
CHANGED
@@ -0,0 +1,160 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class ConstantTest < Minitest::Test
|
4
|
+
|
5
|
+
context "Constant" do
|
6
|
+
|
7
|
+
context ".find" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@map = MIDIMessage::Constant.find(:note, "C2")
|
11
|
+
end
|
12
|
+
|
13
|
+
should "return constant mapping" do
|
14
|
+
refute_nil @map
|
15
|
+
assert_equal MIDIMessage::Constant::Map, @map.class
|
16
|
+
assert_equal 36, @map.value
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
context ".value" do
|
22
|
+
|
23
|
+
setup do
|
24
|
+
@value = MIDIMessage::Constant.value(:note, "C3")
|
25
|
+
end
|
26
|
+
|
27
|
+
should "return constant value" do
|
28
|
+
refute_nil @value
|
29
|
+
assert_equal 48, @value
|
30
|
+
assert_equal MIDIMessage::NoteOn.new(0, @value, 100).note, @value
|
31
|
+
assert_equal MIDIMessage::NoteOn["C3"].new(0, 100).note, @value
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
context "Group" do
|
37
|
+
|
38
|
+
context "#find" do
|
39
|
+
|
40
|
+
setup do
|
41
|
+
@group = MIDIMessage::Constant::Group.find(:note)
|
42
|
+
@map = @group.find("C3")
|
43
|
+
end
|
44
|
+
|
45
|
+
should "return correct mapping" do
|
46
|
+
refute_nil @map
|
47
|
+
assert_equal MIDIMessage::Constant::Map, @map.class
|
48
|
+
assert_equal 48, @map.value
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context ".find" do
|
54
|
+
|
55
|
+
setup do
|
56
|
+
@group = MIDIMessage::Constant::Group.find(:note)
|
57
|
+
end
|
58
|
+
|
59
|
+
should "return group object" do
|
60
|
+
refute_nil @group
|
61
|
+
assert_equal MIDIMessage::Constant::Group, @group.class
|
62
|
+
assert_equal "Note", @group.key
|
63
|
+
refute_empty @group.constants
|
64
|
+
assert @group.constants.all? { |c| c.kind_of?(MIDIMessage::Constant::Map) }
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
context "Loader" do
|
72
|
+
|
73
|
+
context "DSL" do
|
74
|
+
|
75
|
+
context "#[]" do
|
76
|
+
|
77
|
+
context "note on" do
|
78
|
+
|
79
|
+
setup do
|
80
|
+
@message = MIDIMessage::NoteOn["c3"].new(0, 100)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "create message object" do
|
84
|
+
assert_equal(MIDIMessage::NoteOn, @message.class)
|
85
|
+
assert_equal("C3", @message.name)
|
86
|
+
assert_equal("C", @message.note_name)
|
87
|
+
assert_equal("Note On: C3", @message.verbose_name)
|
88
|
+
assert_equal([0x90, 0x30, 100], @message.to_a)
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
context "note off" do
|
94
|
+
|
95
|
+
setup do
|
96
|
+
@message = MIDIMessage::NoteOff["C2"].new(0, 100)
|
97
|
+
end
|
98
|
+
|
99
|
+
should "create message object" do
|
100
|
+
assert_equal(MIDIMessage::NoteOff, @message.class)
|
101
|
+
assert_equal("C2", @message.name)
|
102
|
+
assert_equal("Note Off: C2", @message.verbose_name)
|
103
|
+
assert_equal([0x80, 0x24, 100], @message.to_a)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
context "cc" do
|
109
|
+
|
110
|
+
setup do
|
111
|
+
@message = MIDIMessage::ControlChange["Modulation Wheel"].new(2, 0x20)
|
112
|
+
end
|
113
|
+
|
114
|
+
should "create message object" do
|
115
|
+
assert_equal(MIDIMessage::ControlChange, @message.class)
|
116
|
+
assert_equal(@message.channel, 2)
|
117
|
+
assert_equal(0x01, @message.index)
|
118
|
+
assert_equal(0x20, @message.value)
|
119
|
+
assert_equal([0xB2, 0x01, 0x20], @message.to_a)
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
context "system realtime" do
|
125
|
+
|
126
|
+
setup do
|
127
|
+
@message = MIDIMessage::SystemRealtime["Stop"].new
|
128
|
+
end
|
129
|
+
|
130
|
+
should "create message object" do
|
131
|
+
assert_equal(MIDIMessage::SystemRealtime, @message.class)
|
132
|
+
assert_equal("Stop", @message.name)
|
133
|
+
assert_equal([0xFC], @message.to_a)
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
context "system common" do
|
139
|
+
|
140
|
+
setup do
|
141
|
+
@message = MIDIMessage::SystemCommon["Song Select"].new
|
142
|
+
end
|
143
|
+
|
144
|
+
should "create message object" do
|
145
|
+
assert_equal(MIDIMessage::SystemCommon, @message.class)
|
146
|
+
assert_equal("Song Select", @message.name)
|
147
|
+
assert_equal([0xF3], @message.to_a)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
data/test/context_test.rb
CHANGED
@@ -2,81 +2,132 @@ require "helper"
|
|
2
2
|
|
3
3
|
class ContextTest < Minitest::Test
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
context "Context" do
|
6
|
+
|
7
|
+
context "note off" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@message = MIDIMessage.with(:channel => 0, :velocity => 64) do
|
11
|
+
note_off(55)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
should "create message object" do
|
16
|
+
assert_equal(0, @message.channel)
|
17
|
+
assert_equal(55, @message.note)
|
18
|
+
assert_equal(64, @message.velocity)
|
19
|
+
assert_equal([128, 55, 64], @message.to_a)
|
20
|
+
assert_equal("803740", @message.to_bytestr)
|
21
|
+
end
|
22
|
+
|
8
23
|
end
|
9
|
-
assert_equal(0, msg.channel)
|
10
|
-
assert_equal(55, msg.note)
|
11
|
-
assert_equal(64, msg.velocity)
|
12
|
-
assert_equal([128, 55, 64], msg.to_a)
|
13
|
-
assert_equal("803740", msg.to_bytestr)
|
14
|
-
end
|
15
24
|
|
16
|
-
|
17
|
-
|
18
|
-
|
25
|
+
context "note on" do
|
26
|
+
|
27
|
+
setup do
|
28
|
+
@message = MIDIMessage.with(:channel => 0, :velocity => 64) do
|
29
|
+
note_on(55)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
should "create message object" do
|
34
|
+
assert_equal(0, @message.channel)
|
35
|
+
assert_equal(55, @message.note)
|
36
|
+
assert_equal(64, @message.velocity)
|
37
|
+
assert_equal([144, 55, 64], @message.to_a)
|
38
|
+
assert_equal("903740", @message.to_bytestr)
|
39
|
+
end
|
40
|
+
|
19
41
|
end
|
20
|
-
assert_equal(0, msg.channel)
|
21
|
-
assert_equal(55, msg.note)
|
22
|
-
assert_equal(64, msg.velocity)
|
23
|
-
assert_equal([144, 55, 64], msg.to_a)
|
24
|
-
assert_equal("903740", msg.to_bytestr)
|
25
|
-
end
|
26
42
|
|
27
|
-
|
28
|
-
|
29
|
-
|
43
|
+
context "cc" do
|
44
|
+
|
45
|
+
setup do
|
46
|
+
@message = MIDIMessage.with(:channel => 2) do
|
47
|
+
control_change(0x20, 0x30)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
should "create message object" do
|
52
|
+
assert_equal(@message.channel, 2)
|
53
|
+
assert_equal(0x20, @message.index)
|
54
|
+
assert_equal(0x30, @message.value)
|
55
|
+
assert_equal([0xB2, 0x20, 0x30], @message.to_a)
|
56
|
+
assert_equal("B22030", @message.to_bytestr)
|
57
|
+
end
|
58
|
+
|
30
59
|
end
|
31
|
-
assert_equal(msg.channel, 2)
|
32
|
-
assert_equal(0x20, msg.index)
|
33
|
-
assert_equal(0x30, msg.value)
|
34
|
-
assert_equal([0xB2, 0x20, 0x30], msg.to_a)
|
35
|
-
assert_equal("B22030", msg.to_bytestr)
|
36
60
|
|
37
|
-
|
61
|
+
context "polyphonic aftertouch" do
|
62
|
+
|
63
|
+
setup do
|
64
|
+
@message = MIDIMessage.with(:channel => 1) do
|
65
|
+
polyphonic_aftertouch(0x40, 0x40)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
should "create message object" do
|
70
|
+
assert_equal(1, @message.channel)
|
71
|
+
assert_equal(0x40, @message.note)
|
72
|
+
assert_equal(0x40, @message.value)
|
73
|
+
assert_equal([0xA1, 0x40, 0x40], @message.to_a)
|
74
|
+
assert_equal("A14040", @message.to_bytestr)
|
75
|
+
end
|
38
76
|
|
39
|
-
def test_polyphonic_aftertouch
|
40
|
-
msg = MIDIMessage.with(:channel => 1) do
|
41
|
-
polyphonic_aftertouch(0x40, 0x40)
|
42
77
|
end
|
43
|
-
assert_equal(1, msg.channel)
|
44
|
-
assert_equal(0x40, msg.note)
|
45
|
-
assert_equal(0x40, msg.value)
|
46
|
-
assert_equal([0xA1, 0x40, 0x40], msg.to_a)
|
47
|
-
assert_equal("A14040", msg.to_bytestr)
|
48
|
-
end
|
49
78
|
|
50
|
-
|
51
|
-
|
52
|
-
|
79
|
+
context "program change" do
|
80
|
+
|
81
|
+
setup do
|
82
|
+
@message = MIDIMessage.with(:channel => 3) do
|
83
|
+
program_change(0x40)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
should "create message object" do
|
88
|
+
assert_equal(3, @message.channel)
|
89
|
+
assert_equal(0x40, @message.program)
|
90
|
+
assert_equal([0xC3, 0x40], @message.to_a)
|
91
|
+
assert_equal("C340", @message.to_bytestr)
|
92
|
+
end
|
93
|
+
|
53
94
|
end
|
54
|
-
assert_equal(3, msg.channel)
|
55
|
-
assert_equal(0x40, msg.program)
|
56
|
-
assert_equal([0xC3, 0x40], msg.to_a)
|
57
|
-
assert_equal("C340", msg.to_bytestr)
|
58
95
|
|
59
|
-
|
96
|
+
context "channel aftertouch" do
|
97
|
+
|
98
|
+
setup do
|
99
|
+
@message = MIDIMessage.with(:channel => 3) do
|
100
|
+
channel_aftertouch(0x50)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
should "create message object" do
|
105
|
+
assert_equal(3, @message.channel)
|
106
|
+
assert_equal(0x50, @message.value)
|
107
|
+
assert_equal([0xD3, 0x50], @message.to_a)
|
108
|
+
assert_equal("D350", @message.to_bytestr)
|
109
|
+
end
|
60
110
|
|
61
|
-
def test_channel_aftertouch
|
62
|
-
msg = MIDIMessage.with(:channel => 3) do
|
63
|
-
channel_aftertouch(0x50)
|
64
111
|
end
|
65
|
-
assert_equal(3, msg.channel)
|
66
|
-
assert_equal(0x50, msg.value)
|
67
|
-
assert_equal([0xD3, 0x50], msg.to_a)
|
68
|
-
assert_equal("D350", msg.to_bytestr)
|
69
|
-
end
|
70
112
|
|
71
|
-
|
72
|
-
|
73
|
-
|
113
|
+
context "pitch bend" do
|
114
|
+
|
115
|
+
setup do
|
116
|
+
@message = MIDIMessage.with(:channel => 0) do
|
117
|
+
pitch_bend(0x50, 0xA0)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
should "create message object" do
|
122
|
+
assert_equal(0, @message.channel)
|
123
|
+
assert_equal(0x50, @message.low)
|
124
|
+
assert_equal(0xA0, @message.high)
|
125
|
+
assert_equal([0xE0, 0x50, 0xA0], @message.to_a)
|
126
|
+
assert_equal("E050A0", @message.to_bytestr)
|
127
|
+
end
|
128
|
+
|
74
129
|
end
|
75
|
-
|
76
|
-
assert_equal(0x50, msg.low)
|
77
|
-
assert_equal(0xA0, msg.high)
|
78
|
-
assert_equal([0xE0, 0x50, 0xA0], msg.to_a)
|
79
|
-
assert_equal("E050A0", msg.to_bytestr)
|
130
|
+
|
80
131
|
end
|
81
132
|
|
82
133
|
end
|
data/test/helper.rb
CHANGED
data/test/message_test.rb
CHANGED
@@ -4,6 +4,8 @@ class ShortMessageTest < Minitest::Test
|
|
4
4
|
|
5
5
|
def test_channel_message
|
6
6
|
message = MIDIMessage::ChannelMessage.new(0x9, 0x0, 0x40, 0x40)
|
7
|
+
refute_nil message
|
8
|
+
assert message.kind_of?(MIDIMessage)
|
7
9
|
assert_equal(0x9, message.status[0])
|
8
10
|
assert_equal(0x0, message.status[1])
|
9
11
|
assert_equal(0x40, message.data[0])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midi-message
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -111,7 +111,7 @@ files:
|
|
111
111
|
- lib/midi-message/system_message.rb
|
112
112
|
- lib/midi-message/type_conversion.rb
|
113
113
|
- lib/midi.yml
|
114
|
-
- test/
|
114
|
+
- test/constant_test.rb
|
115
115
|
- test/context_test.rb
|
116
116
|
- test/helper.rb
|
117
117
|
- test/message_test.rb
|
data/test/constants_test.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
class ConstantsTest < Minitest::Test
|
4
|
-
|
5
|
-
def test_note_on
|
6
|
-
msg = MIDIMessage::NoteOn["c3"].new(0, 100)
|
7
|
-
assert_equal(MIDIMessage::NoteOn, msg.class)
|
8
|
-
assert_equal("C3", msg.name)
|
9
|
-
assert_equal("C", msg.note_name)
|
10
|
-
assert_equal("Note On: C3", msg.verbose_name)
|
11
|
-
assert_equal([0x90, 0x30, 100], msg.to_a)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_note_off
|
15
|
-
msg = MIDIMessage::NoteOff["C2"].new(0, 100)
|
16
|
-
assert_equal(MIDIMessage::NoteOff, msg.class)
|
17
|
-
assert_equal("C2", msg.name)
|
18
|
-
assert_equal("Note Off: C2", msg.verbose_name)
|
19
|
-
assert_equal([0x80, 0x24, 100], msg.to_a)
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_control_change
|
23
|
-
msg = MIDIMessage::ControlChange["Modulation Wheel"].new(2, 0x20)
|
24
|
-
assert_equal(MIDIMessage::ControlChange, msg.class)
|
25
|
-
assert_equal(msg.channel, 2)
|
26
|
-
assert_equal(0x01, msg.index)
|
27
|
-
assert_equal(0x20, msg.value)
|
28
|
-
assert_equal([0xB2, 0x01, 0x20], msg.to_a)
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_system_realtime
|
32
|
-
msg = MIDIMessage::SystemRealtime["Stop"].new
|
33
|
-
assert_equal(MIDIMessage::SystemRealtime, msg.class)
|
34
|
-
assert_equal("Stop", msg.name)
|
35
|
-
assert_equal([0xFC], msg.to_a)
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_system_common
|
39
|
-
msg = MIDIMessage::SystemCommon["Song Select"].new
|
40
|
-
assert_equal(MIDIMessage::SystemCommon, msg.class)
|
41
|
-
assert_equal("Song Select", msg.name)
|
42
|
-
assert_equal([0xF3], msg.to_a)
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|