midi-message 0.4.7 → 0.4.8

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: 6e0111fbc4f13b3de102dff3ebbdc0b2ccda001c
4
- data.tar.gz: 77408d5b1a726b00d7c4032530c8c361fd31e8dc
3
+ metadata.gz: a74063f4fe5e1a622a69fc4c775763f20046defb
4
+ data.tar.gz: 19638072ab7f93b748d5a435263947ece626f9ea
5
5
  SHA512:
6
- metadata.gz: 1fafe7abcdaf8e90df0bcaeeb49d680266ba453dbf21c28aae68a5dd1d97fd962b9e59077bab2fbafc15872563c674a965dae51a666190235d37b5722b3b8c0c
7
- data.tar.gz: 575a16f20a645fbd7cf6304716ab35120d8718fdecca41bea197c09fc55202e225ef48a9930a6aa226cca7c6bc635e22fb49b90cff54651af0ed759e2913dfdd
6
+ metadata.gz: f85ede4091a84b04f9f292298205cdd7e8fa7e12c24f27e078de4076ede187f94aad464cec41640dfb7aeaf45b2d010a753a4248441143b1157ea93ff5be0a37
7
+ data.tar.gz: 5f031bf9d385a268d2c3355f787918bf8f1ebdc65321df5a25b7dfc67bc8d5a000f23851e899310f4ee644c9c8f5d161915ffaf74a4845bd87ad0d3630cc4787
data/README.md CHANGED
@@ -115,4 +115,4 @@ Check out [nibbler](http://github.com/arirusso/nibbler) for more advanced parsin
115
115
 
116
116
  Apache 2.0, See the file LICENSE
117
117
 
118
- Copyright (c) 2011-2015 Ari Russo
118
+ Copyright (c) 2011-2015 [Ari Russo](http://arirusso.com)
@@ -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 :key, :value
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
- # All constant groups
38
- # @return [Array<ConstantGroup>]
39
- def self.all
40
- ensure_initialized
41
- @groups
42
- end
51
+ class << self
43
52
 
44
- # Find a constant group by its key
45
- # @param [String, Symbol] key
46
- # @return [ConstantGroup]
47
- def self.[](key)
48
- ensure_initialized
49
- @groups.find { |g| g.key.to_s.downcase == key.to_s.downcase }
50
- end
53
+ # All constant groups
54
+ # @return [Array<ConstantGroup>]
55
+ def all
56
+ ensure_initialized
57
+ @groups
58
+ end
51
59
 
52
- private
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
- # Lazy initialize
55
- # @return [Boolean]
56
- def self.ensure_initialized
57
- populate_dictionary | populate_groups
58
- end
69
+ private
59
70
 
60
- # Populate the dictionary of constants
61
- # @return [Boolean]
62
- def self.populate_dictionary
63
- if @dict.nil?
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
- # Populate the constant groups using the dictionary
70
- # @return [Boolean]
71
- def self.populate_groups
72
- if @groups.nil? && !@dict.nil?
73
- @groups = @dict.map { |k, v| new(k, v) }
74
- true
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
@@ -25,6 +25,6 @@ require "midi-message/parser"
25
25
 
26
26
  module MIDIMessage
27
27
 
28
- VERSION = "0.4.7"
28
+ VERSION = "0.4.8"
29
29
 
30
30
  end
@@ -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
- def test_note_off
6
- msg = MIDIMessage.with(:channel => 0, :velocity => 64) do
7
- note_off(55)
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
- def test_note_on
17
- msg = MIDIMessage.with(:channel => 0, :velocity => 64) do
18
- note_on(55)
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
- def test_control_change
28
- msg = MIDIMessage.with(:channel => 2) do
29
- control_change(0x20, 0x30)
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
- end
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
- def test_program_change
51
- msg = MIDIMessage.with(:channel => 3) do
52
- program_change(0x40)
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
- end
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
- def test_pitch_bend
72
- msg = MIDIMessage.with(:channel => 0) do
73
- pitch_bend(0x50, 0xA0)
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
- assert_equal(0, msg.channel)
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
@@ -1,6 +1,7 @@
1
- dir = File.dirname(File.expand_path(__FILE__))
2
- $LOAD_PATH.unshift dir + "/../lib"
1
+ $:.unshift(File.join("..", "lib"))
3
2
 
4
3
  require "minitest/autorun"
4
+ require "mocha/test_unit"
5
+ require "shoulda-context"
5
6
 
6
7
  require "midi-message"
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.7
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-04-12 00:00:00.000000000 Z
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/constants_test.rb
114
+ - test/constant_test.rb
115
115
  - test/context_test.rb
116
116
  - test/helper.rb
117
117
  - test/message_test.rb
@@ -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