midi-message 0.4.2 → 0.4.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9796cb4569f21bfb836502370ca6329634b35900
|
4
|
+
data.tar.gz: 8fa9fd01613d569ebb0cb9aec601ebd14faec95f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f714e1746e5fbd490f25b2ce0c582714a7e6c11edc0b0bf99a5d200796be8ba60f294aa77162425f3fe5b74f0b69231fbef0e0150565d0a72d40b55294b418ea
|
7
|
+
data.tar.gz: 21f9e7978fa17ab50f6c5fd8492bf92d1637986f7ba3a7e463a8b1e7a170ef0e1593285c3920b386d5002656045876ec70bb5b135a85640e0a77d7a1ece0a697
|
data/lib/midi-message.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
#
|
2
2
|
# Ruby MIDI message objects
|
3
3
|
#
|
4
|
-
# (c)2011-2014 Ari Russo
|
5
|
-
#
|
4
|
+
# (c)2011-2014 Ari Russo
|
5
|
+
# Apache 2.0 License
|
6
|
+
#
|
6
7
|
module MIDIMessage
|
7
|
-
|
8
|
-
VERSION = "0.4.
|
9
|
-
|
8
|
+
|
9
|
+
VERSION = "0.4.3"
|
10
|
+
|
10
11
|
end
|
11
12
|
|
12
13
|
# Libs
|
@@ -26,4 +27,3 @@ require "midi-message/constant"
|
|
26
27
|
require "midi-message/context"
|
27
28
|
require "midi-message/message"
|
28
29
|
require "midi-message/parser"
|
29
|
-
|
@@ -3,6 +3,7 @@ module MIDIMessage
|
|
3
3
|
# Common behavior amongst Channel Message types
|
4
4
|
module ChannelMessage
|
5
5
|
|
6
|
+
include MIDIMessage # this enables ..kind_of?(MIDIMessage)
|
6
7
|
attr_reader :data, :name
|
7
8
|
|
8
9
|
# Shortcut to RawChannelMessage.new
|
@@ -17,7 +18,7 @@ module MIDIMessage
|
|
17
18
|
# @param [*Array<Fixnum>] data The status nibbles and data bytes
|
18
19
|
def initialize(*data)
|
19
20
|
data = data.dup
|
20
|
-
options = data.last.kind_of?(Hash) ? data.pop : {}
|
21
|
+
options = data.last.kind_of?(Hash) ? data.pop : {}
|
21
22
|
processed_data = options[:const].nil? ? data : data_with_const(data, options[:const])
|
22
23
|
initialize_channel_message(self.class.type_for_status, *processed_data)
|
23
24
|
end
|
@@ -29,7 +30,7 @@ module MIDIMessage
|
|
29
30
|
{ :name => :data, :index => 1 }
|
30
31
|
]
|
31
32
|
properties = self.class.properties
|
32
|
-
unless properties.nil?
|
33
|
+
unless properties.nil?
|
33
34
|
properties.each_with_index do |prop,i|
|
34
35
|
self.class.send(:attr_reader, prop)
|
35
36
|
self.class.send(:define_method, "#{prop}=") do |val|
|
@@ -55,7 +56,7 @@ module MIDIMessage
|
|
55
56
|
def data_with_const(data, const)
|
56
57
|
key = self.class.constant_property
|
57
58
|
ind = self.class.properties.index(key) || 0
|
58
|
-
data.insert(ind, const.value)
|
59
|
+
data.insert(ind, const.value)
|
59
60
|
end
|
60
61
|
|
61
62
|
def initialize_channel_message(status_nibble_1, status_nibble_2, data_byte_1, data_byte_2 = 0)
|
@@ -72,7 +73,7 @@ module MIDIMessage
|
|
72
73
|
# Get the status nibble for this particular message type
|
73
74
|
# @return [Fixnum] The status nibble
|
74
75
|
def type_for_status
|
75
|
-
Status[display_name]
|
76
|
+
Status[display_name]
|
76
77
|
end
|
77
78
|
|
78
79
|
def properties
|
@@ -104,7 +105,7 @@ module MIDIMessage
|
|
104
105
|
# @return [RawChannelMessage] The resulting RawChannelMessage object
|
105
106
|
def initialize(*data)
|
106
107
|
initialize_channel_message(*data)
|
107
|
-
end
|
108
|
+
end
|
108
109
|
|
109
110
|
# Convert this RawChannelMessage to one of the more specific ChannelMessage types
|
110
111
|
# eg. RawChannelMessage.new(0x9, 0x0, 0x40, 0x40).to_type would result in
|
@@ -13,7 +13,7 @@ module MIDIMessage
|
|
13
13
|
(note / 12) - 1
|
14
14
|
end
|
15
15
|
alias_method :oct, :octave
|
16
|
-
|
16
|
+
|
17
17
|
# Set the octave number of the note
|
18
18
|
# @param [Fixnum] value
|
19
19
|
# @return [NoteMessage] self
|
@@ -22,19 +22,19 @@ module MIDIMessage
|
|
22
22
|
self
|
23
23
|
end
|
24
24
|
alias_method :oct=, :octave=
|
25
|
-
|
25
|
+
|
26
26
|
# How many half-steps is this note above the closest C
|
27
27
|
# @return [Fixnum]
|
28
28
|
def abs_note
|
29
29
|
note - ((note / 12) * 12)
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
# The name of the note without its octave e.g. F#
|
33
33
|
# @return [String]
|
34
34
|
def note_name
|
35
35
|
name.split(/-?\d\z/).first
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
end
|
@@ -3,10 +3,12 @@ module MIDIMessage
|
|
3
3
|
# Common behavior amongst all Message types
|
4
4
|
module ShortMessage
|
5
5
|
|
6
|
+
include MIDIMessage # this enables ..kind_of?(MIDIMessage)
|
7
|
+
|
6
8
|
attr_reader :name,
|
7
9
|
:status,
|
8
10
|
:verbose_name
|
9
|
-
|
11
|
+
|
10
12
|
# Initialize the message status
|
11
13
|
# @param [Fixnum] status_nibble_1 The first nibble of the status
|
12
14
|
# @param [Fixnum] status_nibble_2 The second nibble of the status
|
@@ -14,11 +16,11 @@ module MIDIMessage
|
|
14
16
|
@status = [status_nibble_1, status_nibble_2]
|
15
17
|
populate_using_const
|
16
18
|
end
|
17
|
-
|
19
|
+
|
18
20
|
# Byte array representation of the message eg [0x90, 0x40, 0x40] for NoteOn(0x40, 0x40)
|
19
21
|
# @return [Array<Fixnum>] The array of bytes in the MIDI message
|
20
22
|
def to_a
|
21
|
-
data = @data.nil? ? [] : [@data[0], @data[1]]
|
23
|
+
data = @data.nil? ? [] : [@data[0], @data[1]]
|
22
24
|
[(@status[0] << 4) + @status[1], *data].compact
|
23
25
|
end
|
24
26
|
alias_method :to_byte_a, :to_a
|
@@ -31,19 +33,19 @@ module MIDIMessage
|
|
31
33
|
TypeConversion.numeric_byte_array_to_hex_string(to_a)
|
32
34
|
end
|
33
35
|
alias_method :to_bytestr, :to_hex_s
|
34
|
-
|
36
|
+
|
35
37
|
protected
|
36
|
-
|
38
|
+
|
37
39
|
def self.included(base)
|
38
40
|
base.send(:extend, ClassMethods)
|
39
41
|
end
|
40
|
-
|
42
|
+
|
41
43
|
def update
|
42
44
|
populate_using_const
|
43
45
|
end
|
44
|
-
|
46
|
+
|
45
47
|
private
|
46
|
-
|
48
|
+
|
47
49
|
# This will populate message metadata with information gathered from midi.yml
|
48
50
|
def populate_using_const
|
49
51
|
const_group_name = self.class.display_name
|
@@ -57,22 +59,22 @@ module MIDIMessage
|
|
57
59
|
unless const.nil?
|
58
60
|
@const = const
|
59
61
|
@name = @const.nil? ? const.key : @const.key
|
60
|
-
@verbose_name = "#{self.class.display_name}: #{@name}"
|
62
|
+
@verbose_name = "#{self.class.display_name}: #{@name}"
|
61
63
|
end
|
62
|
-
end
|
64
|
+
end
|
63
65
|
end
|
64
66
|
|
65
67
|
module ClassMethods
|
66
|
-
|
68
|
+
|
67
69
|
# Find a constant value in this class's group for the passed in key
|
68
70
|
# @param [String] name The constant key
|
69
71
|
# @return [String] The constant value
|
70
|
-
def get_constant(name)
|
72
|
+
def get_constant(name)
|
71
73
|
key = constant_name || display_name
|
72
74
|
unless key.nil?
|
73
75
|
group = ConstantGroup[key]
|
74
76
|
group.find(name)
|
75
|
-
end
|
77
|
+
end
|
76
78
|
end
|
77
79
|
|
78
80
|
def display_name
|
@@ -98,7 +100,7 @@ module MIDIMessage
|
|
98
100
|
const = get_constant(const_name.to_s)
|
99
101
|
MessageBuilder.new(self, const) unless const.nil?
|
100
102
|
end
|
101
|
-
|
103
|
+
|
102
104
|
end
|
103
105
|
|
104
106
|
end
|
@@ -107,29 +109,29 @@ module MIDIMessage
|
|
107
109
|
|
108
110
|
# @param [MIDIMessage] klass The message class to build
|
109
111
|
# @param [String] const The constant to build the message with
|
110
|
-
def initialize(klass, const)
|
111
|
-
@klass = klass
|
112
|
+
def initialize(klass, const)
|
113
|
+
@klass = klass
|
112
114
|
@const = const
|
113
115
|
end
|
114
116
|
|
115
|
-
def new(*a)
|
116
|
-
a.last.kind_of?(Hash) ? a.last[:const] = @const : a.push(:const => @const)
|
117
|
+
def new(*a)
|
118
|
+
a.last.kind_of?(Hash) ? a.last[:const] = @const : a.push(:const => @const)
|
117
119
|
@klass.new(*a)
|
118
120
|
end
|
119
121
|
|
120
122
|
end
|
121
|
-
|
123
|
+
|
122
124
|
# Shortcuts for dealing with message status
|
123
125
|
module Status
|
124
|
-
|
126
|
+
|
125
127
|
# The value of the Status constant with the name status_name
|
126
128
|
# @param [String] status_name The key to use to look up a constant value
|
127
129
|
# @return [String] The constant value that was looked up
|
128
130
|
def self.[](status_name)
|
129
131
|
const = Constant.find("Status", status_name)
|
130
132
|
const.value unless const.nil?
|
131
|
-
end
|
132
|
-
|
133
|
+
end
|
134
|
+
|
133
135
|
end
|
134
136
|
|
135
137
|
end
|
@@ -3,6 +3,8 @@ module MIDIMessage
|
|
3
3
|
# MIDI System-Exclusive Messages (SysEx)
|
4
4
|
module SystemExclusive
|
5
5
|
|
6
|
+
include MIDIMessage # this enables ..kind_of?(MIDIMessage)
|
7
|
+
|
6
8
|
def self.included(base)
|
7
9
|
base.send(:include, InstanceMethods)
|
8
10
|
end
|
@@ -18,7 +20,7 @@ module MIDIMessage
|
|
18
20
|
|
19
21
|
# an array of message parts. multiple byte parts will be represented as an array of bytes
|
20
22
|
def to_a(options = {})
|
21
|
-
omit = options[:omit] || []
|
23
|
+
omit = options[:omit] || []
|
22
24
|
node = @node.to_a(options) unless @node.nil? || omit.include?(:node)
|
23
25
|
# this may need to be cached when properties are updated
|
24
26
|
# might be worth benchmarking
|
@@ -44,7 +46,7 @@ module MIDIMessage
|
|
44
46
|
|
45
47
|
# string representation of the object's bytes
|
46
48
|
def to_hex_s
|
47
|
-
strings = to_bytes.map do |byte|
|
49
|
+
strings = to_bytes.map do |byte|
|
48
50
|
string = byte.to_s(16)
|
49
51
|
string = "0#{string}" if string.length == 1
|
50
52
|
string
|
@@ -73,7 +75,7 @@ module MIDIMessage
|
|
73
75
|
# alternate method from
|
74
76
|
# http://www.2writers.com/eddie/TutSysEx.htm
|
75
77
|
def checksum
|
76
|
-
sum = (address + [value].flatten).inject(&:+)
|
78
|
+
sum = (address + [value].flatten).inject(&:+)
|
77
79
|
mod = sum.divmod(128)[1]
|
78
80
|
128 - mod
|
79
81
|
end
|
@@ -107,7 +109,7 @@ module MIDIMessage
|
|
107
109
|
|
108
110
|
# an array of message parts. multiple byte parts will be represented as an array of bytes
|
109
111
|
def to_a(options = {})
|
110
|
-
omit = options[:omit] || []
|
112
|
+
omit = options[:omit] || []
|
111
113
|
node = @node.to_a(options) unless @node.nil? || omit.include?(:node)
|
112
114
|
# this may need to be cached when properties are updated
|
113
115
|
# might be worth benchmarking
|
@@ -122,7 +124,7 @@ module MIDIMessage
|
|
122
124
|
end
|
123
125
|
|
124
126
|
#
|
125
|
-
# The SystemExclusive::Node represents a destination for a message. For example a hardware
|
127
|
+
# The SystemExclusive::Node represents a destination for a message. For example a hardware
|
126
128
|
# synthesizer or sampler
|
127
129
|
#
|
128
130
|
class Node
|
@@ -196,7 +198,7 @@ module MIDIMessage
|
|
196
198
|
msg_class = Request
|
197
199
|
elsif type_byte == 0x12
|
198
200
|
msg_class = Command
|
199
|
-
else
|
201
|
+
else
|
200
202
|
return Message.new(bytes)
|
201
203
|
end
|
202
204
|
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Objects and classes for dealing with MIDI messages.
|
14
14
|
email:
|