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 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