midi-message 0.4.4 → 0.4.5
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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +16 -16
- data/lib/midi-message.rb +5 -5
- data/lib/midi-message/channel_message.rb +55 -33
- data/lib/midi-message/constant.rb +201 -45
- data/lib/midi-message/message.rb +36 -195
- data/lib/midi-message/messages.rb +211 -0
- data/lib/midi-message/system_message.rb +2 -2
- data/test/constants_test.rb +25 -30
- data/test/context_test.rb +2 -6
- data/test/helper.rb +3 -8
- data/test/{short_message_test.rb → message_test.rb} +44 -49
- data/test/mutability_test.rb +8 -13
- data/test/parser_test.rb +39 -44
- data/test/system_exclusive_test.rb +54 -59
- data/test/system_message_test.rb +21 -27
- metadata +85 -5
- data/lib/midi-message/short_message.rb +0 -137
data/test/system_message_test.rb
CHANGED
@@ -1,71 +1,65 @@
|
|
1
|
-
|
1
|
+
require "helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
class SystemMessageTest < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include MIDIMessage
|
8
|
-
include TestHelper
|
3
|
+
class SystemMessageTest < Minitest::Test
|
9
4
|
|
10
5
|
def test_system_common
|
11
|
-
msg = SystemCommon.new(0x2, 0x00, 0x08)
|
6
|
+
msg = MIDIMessage::SystemCommon.new(0x2, 0x00, 0x08)
|
12
7
|
assert_equal("Song Position Pointer", msg.name)
|
13
8
|
assert_equal(0xF, msg.status[0])
|
14
9
|
assert_equal(0x2, msg.status[1])
|
15
10
|
assert_equal(0x00, msg.data[0])
|
16
11
|
assert_equal(0x08, msg.data[1])
|
17
12
|
assert_equal([0xF2, 0x00, 0x08], msg.to_a)
|
18
|
-
assert_equal("F20008", msg.to_bytestr)
|
13
|
+
assert_equal("F20008", msg.to_bytestr)
|
19
14
|
end
|
20
15
|
|
21
16
|
def test_system_common_redundant
|
22
|
-
msg = SystemCommon.new(0xF2, 0x00, 0x08)
|
17
|
+
msg = MIDIMessage::SystemCommon.new(0xF2, 0x00, 0x08)
|
23
18
|
assert_equal("Song Position Pointer", msg.name)
|
24
19
|
assert_equal(0xF, msg.status[0])
|
25
20
|
assert_equal(0x2, msg.status[1])
|
26
21
|
assert_equal(0x00, msg.data[0])
|
27
22
|
assert_equal(0x08, msg.data[1])
|
28
23
|
assert_equal([0xF2, 0x00, 0x08], msg.to_a)
|
29
|
-
assert_equal("F20008", msg.to_bytestr)
|
24
|
+
assert_equal("F20008", msg.to_bytestr)
|
30
25
|
end
|
31
26
|
|
32
|
-
def test_system_common_constant
|
33
|
-
msg = SystemCommon["Song Position Pointer"].new(0x00, 0x08)
|
27
|
+
def test_system_common_constant
|
28
|
+
msg = MIDIMessage::SystemCommon["Song Position Pointer"].new(0x00, 0x08)
|
34
29
|
assert_equal("Song Position Pointer", msg.name)
|
35
30
|
assert_equal(0xF, msg.status[0])
|
36
31
|
assert_equal(0x2, msg.status[1])
|
37
32
|
assert_equal(0x00, msg.data[0])
|
38
33
|
assert_equal(0x08, msg.data[1])
|
39
34
|
assert_equal([0xF2, 0x00, 0x08], msg.to_a)
|
40
|
-
assert_equal("F20008", msg.to_bytestr)
|
35
|
+
assert_equal("F20008", msg.to_bytestr)
|
41
36
|
end
|
42
37
|
|
43
|
-
def test_system_realtime
|
44
|
-
msg = SystemRealtime.new(0x8)
|
38
|
+
def test_system_realtime
|
39
|
+
msg = MIDIMessage::SystemRealtime.new(0x8)
|
45
40
|
assert_equal("Clock", msg.name)
|
46
41
|
assert_equal(0xF, msg.status[0])
|
47
42
|
assert_equal(0x8, msg.status[1])
|
48
43
|
assert_equal([0xF8], msg.to_a)
|
49
|
-
assert_equal("F8", msg.to_bytestr)
|
50
|
-
end
|
44
|
+
assert_equal("F8", msg.to_bytestr)
|
45
|
+
end
|
51
46
|
|
52
|
-
def test_system_realtime_redundant
|
53
|
-
msg = SystemRealtime.new(0xF8)
|
47
|
+
def test_system_realtime_redundant
|
48
|
+
msg = MIDIMessage::SystemRealtime.new(0xF8)
|
54
49
|
assert_equal("Clock", msg.name)
|
55
50
|
assert_equal(0xF, msg.status[0])
|
56
51
|
assert_equal(0x8, msg.status[1])
|
57
52
|
assert_equal([0xF8], msg.to_a)
|
58
|
-
assert_equal("F8", msg.to_bytestr)
|
59
|
-
end
|
53
|
+
assert_equal("F8", msg.to_bytestr)
|
54
|
+
end
|
60
55
|
|
61
|
-
def test_system_realtime_constant
|
62
|
-
msg = SystemRealtime["Clock"].new
|
56
|
+
def test_system_realtime_constant
|
57
|
+
msg = MIDIMessage::SystemRealtime["Clock"].new
|
63
58
|
assert_equal("Clock", msg.name)
|
64
59
|
assert_equal(0xF, msg.status[0])
|
65
60
|
assert_equal(0x8, msg.status[1])
|
66
61
|
assert_equal([0xF8], msg.to_a)
|
67
|
-
assert_equal("F8", msg.to_bytestr)
|
68
|
-
end
|
62
|
+
assert_equal("F8", msg.to_bytestr)
|
63
|
+
end
|
69
64
|
|
70
65
|
end
|
71
|
-
|
metadata
CHANGED
@@ -1,15 +1,95 @@
|
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2015-01-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.5'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.5.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.5'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.5.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mocha
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.1.0
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.1.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '10.4'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 10.4.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.4'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 10.4.2
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: shoulda-context
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.2'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.1
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.2.1
|
13
93
|
description: Objects and classes for dealing with MIDI messages.
|
14
94
|
email:
|
15
95
|
- ari.russo@gmail.com
|
@@ -24,9 +104,9 @@ files:
|
|
24
104
|
- lib/midi-message/constant.rb
|
25
105
|
- lib/midi-message/context.rb
|
26
106
|
- lib/midi-message/message.rb
|
107
|
+
- lib/midi-message/messages.rb
|
27
108
|
- lib/midi-message/note_message.rb
|
28
109
|
- lib/midi-message/parser.rb
|
29
|
-
- lib/midi-message/short_message.rb
|
30
110
|
- lib/midi-message/system_exclusive.rb
|
31
111
|
- lib/midi-message/system_message.rb
|
32
112
|
- lib/midi-message/type_conversion.rb
|
@@ -34,9 +114,9 @@ files:
|
|
34
114
|
- test/constants_test.rb
|
35
115
|
- test/context_test.rb
|
36
116
|
- test/helper.rb
|
117
|
+
- test/message_test.rb
|
37
118
|
- test/mutability_test.rb
|
38
119
|
- test/parser_test.rb
|
39
|
-
- test/short_message_test.rb
|
40
120
|
- test/system_exclusive_test.rb
|
41
121
|
- test/system_message_test.rb
|
42
122
|
homepage: http://github.com/arirusso/midi-message
|
@@ -1,137 +0,0 @@
|
|
1
|
-
module MIDIMessage
|
2
|
-
|
3
|
-
# Common behavior amongst all Message types
|
4
|
-
module ShortMessage
|
5
|
-
|
6
|
-
include MIDIMessage # this enables ..kind_of?(MIDIMessage)
|
7
|
-
|
8
|
-
attr_reader :name,
|
9
|
-
:status,
|
10
|
-
:verbose_name
|
11
|
-
|
12
|
-
# Initialize the message status
|
13
|
-
# @param [Fixnum] status_nibble_1 The first nibble of the status
|
14
|
-
# @param [Fixnum] status_nibble_2 The second nibble of the status
|
15
|
-
def initialize_short_message(status_nibble_1, status_nibble_2)
|
16
|
-
@status = [status_nibble_1, status_nibble_2]
|
17
|
-
populate_using_const
|
18
|
-
end
|
19
|
-
|
20
|
-
# Byte array representation of the message eg [0x90, 0x40, 0x40] for NoteOn(0x40, 0x40)
|
21
|
-
# @return [Array<Fixnum>] The array of bytes in the MIDI message
|
22
|
-
def to_a
|
23
|
-
data = @data.nil? ? [] : [@data[0], @data[1]]
|
24
|
-
[(@status[0] << 4) + @status[1], *data].compact
|
25
|
-
end
|
26
|
-
alias_method :to_byte_a, :to_a
|
27
|
-
alias_method :to_byte_array, :to_a
|
28
|
-
alias_method :to_bytes, :to_a
|
29
|
-
|
30
|
-
# String representation of the message's bytes eg "904040" for NoteOn(0x40, 0x40)
|
31
|
-
# @return [String] The bytes of the message as a string of hex bytes
|
32
|
-
def to_hex_s
|
33
|
-
TypeConversion.numeric_byte_array_to_hex_string(to_a)
|
34
|
-
end
|
35
|
-
alias_method :to_bytestr, :to_hex_s
|
36
|
-
|
37
|
-
protected
|
38
|
-
|
39
|
-
def self.included(base)
|
40
|
-
base.send(:extend, ClassMethods)
|
41
|
-
end
|
42
|
-
|
43
|
-
def update
|
44
|
-
populate_using_const
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
# This will populate message metadata with information gathered from midi.yml
|
50
|
-
def populate_using_const
|
51
|
-
const_group_name = self.class.display_name
|
52
|
-
group_name_alias = self.class.constant_name
|
53
|
-
property = self.class.constant_property
|
54
|
-
value = self.send(property) unless property.nil?
|
55
|
-
value ||= @status[1] # default property to use for constants
|
56
|
-
group = ConstantGroup[group_name_alias] || ConstantGroup[const_group_name]
|
57
|
-
unless group.nil?
|
58
|
-
const = group.find_by_value(value)
|
59
|
-
unless const.nil?
|
60
|
-
@const = const
|
61
|
-
@name = @const.nil? ? const.key : @const.key
|
62
|
-
@verbose_name = "#{self.class.display_name}: #{@name}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
module ClassMethods
|
68
|
-
|
69
|
-
# Find a constant value in this class's group for the passed in key
|
70
|
-
# @param [String] name The constant key
|
71
|
-
# @return [String] The constant value
|
72
|
-
def get_constant(name)
|
73
|
-
key = constant_name || display_name
|
74
|
-
unless key.nil?
|
75
|
-
group = ConstantGroup[key]
|
76
|
-
group.find(name)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def display_name
|
81
|
-
const_get("DISPLAY_NAME") if const_defined?("DISPLAY_NAME")
|
82
|
-
end
|
83
|
-
|
84
|
-
def constant_map
|
85
|
-
const_get("CONSTANT") if const_defined?("CONSTANT")
|
86
|
-
end
|
87
|
-
|
88
|
-
def constant_name
|
89
|
-
constant_map.keys.first unless constant_map.nil?
|
90
|
-
end
|
91
|
-
|
92
|
-
def constant_property
|
93
|
-
constant_map[constant_name] unless constant_map.nil?
|
94
|
-
end
|
95
|
-
|
96
|
-
# This returns a MessageBuilder for the class, preloaded with the selected const
|
97
|
-
# @param [String, Symbol] const_name The constant key to use to build the message
|
98
|
-
# @return [MIDIMessage::MessageBuilder] A MessageBuilder object for the passed in constant
|
99
|
-
def [](const_name)
|
100
|
-
const = get_constant(const_name.to_s)
|
101
|
-
MessageBuilder.new(self, const) unless const.nil?
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
class MessageBuilder
|
109
|
-
|
110
|
-
# @param [MIDIMessage] klass The message class to build
|
111
|
-
# @param [String] const The constant to build the message with
|
112
|
-
def initialize(klass, const)
|
113
|
-
@klass = klass
|
114
|
-
@const = const
|
115
|
-
end
|
116
|
-
|
117
|
-
def new(*a)
|
118
|
-
a.last.kind_of?(Hash) ? a.last[:const] = @const : a.push(:const => @const)
|
119
|
-
@klass.new(*a)
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
# Shortcuts for dealing with message status
|
125
|
-
module Status
|
126
|
-
|
127
|
-
# The value of the Status constant with the name status_name
|
128
|
-
# @param [String] status_name The key to use to look up a constant value
|
129
|
-
# @return [String] The constant value that was looked up
|
130
|
-
def self.[](status_name)
|
131
|
-
const = Constant.find("Status", status_name)
|
132
|
-
const.value unless const.nil?
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|