unimidi 0.3.5 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,34 @@
1
1
  dir = File.dirname(File.expand_path(__FILE__))
2
2
  $LOAD_PATH.unshift dir + '/../lib'
3
3
 
4
- require 'test/unit'
5
- require 'unimidi'
4
+ require "test/unit"
5
+ require "mocha/test_unit"
6
+ require "shoulda-context"
7
+ require "unimidi"
6
8
 
7
9
  module UniMIDI
8
10
 
9
- module TestHelper
10
-
11
- TestSysex = !RUBY_PLATFORM.include?("java")
11
+ class TestDeviceHelper
12
12
 
13
- def self.select_devices
14
- $test_device ||= {}
15
- { :input => UniMIDI::Input, :output => UniMIDI::Output }.each do |type, klass|
16
- $test_device[type] = klass.gets
13
+ def self.setup
14
+ if @test_devices.nil?
15
+ @test_devices = {}
16
+ { :input => UniMIDI::Input, :output => UniMIDI::Output }.each do |type, klass|
17
+ @test_devices[type] = klass.gets
18
+ end
17
19
  end
18
- end
20
+ end
19
21
 
20
- def platform_test(adapter, mod, device_class = nil, input_class = nil, output_class = nil)
21
- device_class ||= mod::Device
22
- input_class ||= mod::Input
23
- output_class ||= mod::Output
24
- assert_equal(adapter, UniMIDI::Platform.instance.interface)
25
- assert_not_same(input_class, UniMIDI::Input)
26
- assert_not_same(output_class, UniMIDI::Output)
27
- assert_not_same(device_class, UniMIDI::Device)
28
- assert_equal(input_class.first.name, UniMIDI::Input.first.name)
29
- assert_equal(input_class.first.id, UniMIDI::Input.first.id)
30
- assert_not_same(output_class.first, UniMIDI::Output.first)
31
- assert_equal(output_class.first.name, UniMIDI::Output.first.name)
32
- assert_equal(output_class.first.id, UniMIDI::Output.first.id)
22
+ def self.devices
23
+ @test_devices
33
24
  end
34
25
 
26
+ end
27
+
28
+ module TestHelper
29
+
30
+ TestSysex = !RUBY_PLATFORM.include?("java")
31
+
35
32
  def bytestrs_to_ints(arr)
36
33
  data = arr.map { |m| m[:data] }.join
37
34
  output = []
@@ -87,5 +84,3 @@ module UniMIDI
87
84
  end
88
85
 
89
86
  end
90
-
91
- UniMIDI::TestHelper.select_devices
@@ -0,0 +1,46 @@
1
+ require 'helper'
2
+
3
+ class UniMIDI::InputBufferTest < UniMIDI::TestCase
4
+
5
+ context "Input" do
6
+
7
+ setup do
8
+ TestDeviceHelper.setup
9
+ end
10
+
11
+ context "#buffer" do
12
+
13
+ setup do
14
+ sleep(1)
15
+ @messages = VariousMIDIMessages
16
+ @bytes = []
17
+ end
18
+
19
+ should "add received messages to the buffer" do
20
+
21
+ TestDeviceHelper.devices[:output].open do |output|
22
+ TestDeviceHelper.devices[:input].open do |input|
23
+
24
+ input.buffer.clear
25
+
26
+ @messages.each do |msg|
27
+
28
+ $>.puts "sending: " + msg.inspect
29
+ output.puts(msg)
30
+ @bytes += msg
31
+ sleep(0.5)
32
+ buffer = input.buffer.map { |m| m[:data] }.flatten
33
+ $>.puts "received: " + buffer.to_s
34
+ assert_equal(@bytes, buffer)
35
+
36
+ end
37
+
38
+ assert_equal(@bytes.length, input.buffer.map { |m| m[:data] }.flatten.length)
39
+
40
+ end
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -1,29 +1,47 @@
1
1
  require 'helper'
2
2
 
3
- class PlatformTest < UniMIDI::TestCase
4
-
5
- def test_jruby
6
- if RUBY_PLATFORM.include?("java")
7
- platform_test(MIDIJRubyAdapter, MIDIJRuby)
8
- end
9
- end
10
-
11
- def test_linux
12
- if RUBY_PLATFORM.include?("linux")
13
- platform_test(AlsaRawMIDIAdapter, AlsaRawMIDI)
14
- end
3
+ class UniMIDI::PlatformTest < UniMIDI::TestCase
4
+
5
+ def platform_test(adapter, mod, device_class = nil, input_class = nil, output_class = nil)
6
+ device_class ||= mod::Device
7
+ input_class ||= mod::Input
8
+ output_class ||= mod::Output
9
+ assert_not_same(input_class, UniMIDI::Input)
10
+ assert_not_same(output_class, UniMIDI::Output)
11
+ assert_not_same(device_class, UniMIDI::Device)
12
+ assert_equal(input_class.first.name, UniMIDI::Input.first.name)
13
+ assert_equal(input_class.first.id, UniMIDI::Input.first.id)
14
+ assert_not_same(output_class.first, UniMIDI::Output.first)
15
+ assert_equal(output_class.first.name, UniMIDI::Output.first.name)
16
+ assert_equal(output_class.first.id, UniMIDI::Output.first.id)
15
17
  end
16
-
17
- def test_osx
18
- if RUBY_PLATFORM.include?("darwin")
19
- platform_test(CoreMIDIAdapter, CoreMIDI, CoreMIDI::Endpoint, CoreMIDI::Source, CoreMIDI::Destination)
18
+
19
+ context "Platform" do
20
+
21
+ should "recognize java" do
22
+ if RUBY_PLATFORM.include?("java")
23
+ platform_test(Adapter::MIDIJRuby, ::MIDIJRuby)
24
+ end
25
+ end
26
+
27
+ should "recognize linux" do
28
+ if RUBY_PLATFORM.include?("linux")
29
+ platform_test(Adapter::AlsaRawMIDI, ::AlsaRawMIDI)
30
+ end
31
+ end
32
+
33
+ should "recognize osx" do
34
+ if RUBY_PLATFORM.include?("darwin")
35
+ platform_test(Adapter::CoreMIDI, ::CoreMIDI, ::CoreMIDI::Endpoint, ::CoreMIDI::Source, ::CoreMIDI::Destination)
36
+ end
37
+ end
38
+
39
+ should "recognize windows" do
40
+ if RUBY_PLATFORM.include?("mingw")
41
+ platform_test(Adapter::MIDIWinMM, ::MIDIWinMM)
42
+ end
20
43
  end
44
+
21
45
  end
22
-
23
- def test_windows
24
- if RUBY_PLATFORM.include?("mingw")
25
- platform_test(MIDIWinMMAdapter, MIDIWinMM)
26
- end
27
- end
28
-
46
+
29
47
  end
@@ -1,10 +1,18 @@
1
1
  require 'helper'
2
2
 
3
- class TypeConversionTest < UniMIDI::TestCase
4
-
5
- def test_numeric_byte_array_to_hex_string
6
- result = TypeConversion.numeric_byte_array_to_hex_string([0x90, 0x40, 0x40])
7
- assert "904040", result
3
+ class UniMIDI::TypeConversionTest < UniMIDI::TestCase
4
+
5
+ context "TypeConversion" do
6
+
7
+ context "#numeric_byte_array_to_hex_string" do
8
+
9
+ should "convert byte array to hex string" do
10
+ result = TypeConversion.numeric_byte_array_to_hex_string([0x90, 0x40, 0x40])
11
+ assert "904040", result
12
+ end
13
+
14
+ end
15
+
8
16
  end
9
-
17
+
10
18
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unimidi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.4
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-03-26 00:00:00.000000000 Z
11
+ date: 2014-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ffi-coremidi
14
+ name: alsa-rawmidi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: midi-jruby
28
+ name: ffi-coremidi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: alsa-rawmidi
42
+ name: midi-jruby
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
@@ -80,18 +80,23 @@ files:
80
80
  - lib/unimidi/adapter/ffi-coremidi.rb
81
81
  - lib/unimidi/adapter/midi-jruby.rb
82
82
  - lib/unimidi/adapter/midi-winmm.rb
83
- - lib/unimidi/congruous_api_adapter.rb
83
+ - lib/unimidi/command.rb
84
+ - lib/unimidi/device.rb
85
+ - lib/unimidi/input.rb
86
+ - lib/unimidi/loader.rb
87
+ - lib/unimidi/output.rb
84
88
  - lib/unimidi/platform.rb
85
89
  - lib/unimidi/type_conversion.rb
86
- - test/congruous_api_adapter_test.rb
90
+ - test/adapter_test.rb
91
+ - test/class_methods_test.rb
92
+ - test/functional_test.rb
87
93
  - test/helper.rb
88
- - test/input_buffer_test.rb
89
- - test/io_test.rb
94
+ - test/input_test.rb
90
95
  - test/platform_test.rb
91
- - test/selectors_test.rb
92
96
  - test/type_conversion_test.rb
93
97
  homepage: http://github.com/arirusso/unimidi
94
- licenses: []
98
+ licenses:
99
+ - Apache 2.0
95
100
  metadata: {}
96
101
  post_install_message:
97
102
  rdoc_options: []
@@ -1,321 +0,0 @@
1
- module UniMIDI
2
-
3
- module CongruousApiAdapter
4
-
5
- module Device
6
-
7
- def initialize(device_obj)
8
- @device = device_obj
9
- @id = @device.id
10
- @name = @device.name
11
- populate_type
12
- end
13
-
14
- def enabled?
15
- @device.enabled
16
- end
17
-
18
- # enable the device for use, can be passed a block to which the device will be passed back
19
- def open(*a, &block)
20
- @device.open(*a) unless enabled?
21
- if block_given?
22
- begin
23
- yield(self)
24
- ensure
25
- close
26
- end
27
- else
28
- at_exit do
29
- close
30
- end
31
- self
32
- end
33
- end
34
-
35
- def pretty_name
36
- "#{id}) #{name}"
37
- end
38
-
39
- # close the device
40
- def close(*a)
41
- @device.close(*a)
42
- end
43
-
44
- def self.included(base)
45
- base.send(:attr_reader, :name)
46
- base.send(:attr_reader, :id)
47
- base.send(:attr_reader, :type)
48
- base.send(:alias_method, :direction, :type)
49
- end
50
-
51
- module ClassMethods
52
-
53
- include Enumerable
54
-
55
- def each(&block)
56
- all.each { |device| yield(device) }
57
- end
58
-
59
- # Prints ids and names of each device to the console
60
- def list
61
- all.each { |device| puts(device.pretty_name) }
62
- end
63
-
64
- # Shortcut to get a device by its name
65
- def find_by_name(name)
66
- all.find { |device| name == device.name }
67
- end
68
-
69
- # streamlined console prompt that asks the user to select a device
70
- def gets(&block)
71
- device = nil
72
- class_name = self.name.split("::").last.downcase
73
- puts ""
74
- puts "Select a MIDI #{class_name}..."
75
- while device.nil?
76
- list
77
- print "> "
78
- selection = $stdin.gets.chomp
79
- if selection != ""
80
- selection = Integer(selection) rescue nil
81
- device = all.find { |d| d.id == selection }
82
- end
83
- end
84
- device.open(&block)
85
- end
86
-
87
- # returns the first device for this class
88
- def first(&block)
89
- use_device(all.first, &block)
90
- end
91
-
92
- # returns the last device for this class
93
- def last(&block)
94
- use_device(all.last, &block)
95
- end
96
-
97
- # returns all devices in an array
98
- def all
99
- all_by_type.values.flatten
100
- end
101
-
102
- # returns the device at <em>index</em> and opens it
103
- def use(index, &block)
104
- index = case index
105
- when :first then 0
106
- when :last then all.size - 1
107
- else index
108
- end
109
- use_device(all[index], &block)
110
- end
111
- alias_method :open, :use
112
-
113
- # returns the device at <em>index</em>
114
- def [](index)
115
- all[index]
116
- end
117
-
118
- # returns all devices as a hash as such
119
- # { :input => [input devices], :output => [output devices] }
120
- def all_by_type
121
- ensure_initialized
122
- @devices
123
- end
124
-
125
- def defer_to(klass)
126
- @deference ||= {}
127
- @deference[self] = klass
128
- end
129
-
130
- def device_class(klass)
131
- @device_class = klass
132
- end
133
-
134
- def input_class(klass)
135
- @input_class = klass
136
- end
137
-
138
- def output_class(klass)
139
- @output_class = klass
140
- end
141
-
142
- def populate
143
- klass = @deference[self].respond_to?(:all_by_type) ? @deference[self] : @device_class
144
- @devices = {
145
- :input => klass.all_by_type[:input].map { |d| @input_class.new(d) },
146
- :output => klass.all_by_type[:output].map { |d| @output_class.new(d) }
147
- }
148
- end
149
- alias_method :refresh, :populate
150
-
151
- private
152
-
153
- def ensure_initialized
154
- populate unless initialized?
155
- end
156
-
157
- def initialized?
158
- instance_variable_defined?(:@devices) && !@devices.nil?
159
- end
160
-
161
- def use_device(device, &block)
162
- device.open(&block)
163
- device
164
- end
165
-
166
- end
167
-
168
- private
169
-
170
- def populate_type
171
- @type = case @device.type
172
- when :source, :input then :input
173
- when :destination, :output then :output
174
- end
175
- end
176
-
177
- end
178
-
179
- end
180
-
181
- class CongruousApiInput
182
-
183
- include CongruousApiAdapter::Device
184
- extend CongruousApiAdapter::Device::ClassMethods
185
- extend Forwardable
186
-
187
- def_delegators :@device, :buffer
188
-
189
- #
190
- # returns an array of MIDI event hashes as such:
191
- # [
192
- # { :data => [144, 60, 100], :timestamp => 1024 },
193
- # { :data => [128, 60, 100], :timestamp => 1100 },
194
- # { :data => [144, 40, 120], :timestamp => 1200 }
195
- # ]
196
- #
197
- # the data is an array of Numeric bytes
198
- # the timestamp is the number of millis since this input was enabled
199
- #
200
- def gets(*a)
201
- @device.gets(*a)
202
- rescue SystemExit, Interrupt
203
- exit
204
- end
205
-
206
- #
207
- # same as gets but returns message data as string of hex digits as such:
208
- # [
209
- # { :data => "904060", :timestamp => 904 },
210
- # { :data => "804060", :timestamp => 1150 },
211
- # { :data => "90447F", :timestamp => 1300 }
212
- # ]
213
- #
214
- def gets_s(*a)
215
- @device.gets_s(*a)
216
- rescue SystemExit, Interrupt
217
- exit
218
- end
219
- alias_method :gets_bytestr, :gets_s
220
- alias_method :gets_hex, :gets_s
221
-
222
- #
223
- # returns an array of data bytes such as
224
- # [144, 60, 100, 128, 60, 100, 144, 40, 120]
225
- #
226
- def gets_data(*a)
227
- arr = gets
228
- arr.map { |msg| msg[:data] }.inject(:+)
229
- end
230
-
231
- #
232
- # returns a string of data such as
233
- # "90406080406090447F"
234
- #
235
- def gets_data_s(*a)
236
- arr = gets_bytestr
237
- arr.map { |msg| msg[:data] }.join
238
- end
239
- alias_method :gets_data_bytestr, :gets_data_s
240
- alias_method :gets_data_hex, :gets_data_s
241
-
242
- # clears the buffer
243
- def clear_buffer
244
- @device.buffer.clear
245
- end
246
-
247
- # gets any messages in the buffer in the same format as CongruousApiInput#gets
248
- def gets_buffer(*a)
249
- @device.buffer
250
- end
251
-
252
- # gets any messages in the buffer in the same format as CongruousApiInput#gets_s
253
- def gets_buffer_s(*a)
254
- @device.buffer.map { |msg| msg[:data] = TypeConversion.numeric_byte_array_to_hex_string(msg[:data]); msg }
255
- end
256
-
257
- # gets any messages in the buffer in the same format as CongruousApiInput#gets_data
258
- def gets_buffer_data(*a)
259
- @device.buffer.map { |msg| msg[:data] }
260
- end
261
-
262
- # returns all inputs
263
- def self.all
264
- UniMIDI::Device.all_by_type[:input]
265
- end
266
-
267
- end
268
-
269
- class CongruousApiOutput
270
-
271
- include CongruousApiAdapter::Device
272
- extend CongruousApiAdapter::Device::ClassMethods
273
-
274
- # sends a message to the output. the message can be:
275
- #
276
- # bytes eg output.puts(0x90, 0x40, 0x40)
277
- # an array of bytes eg output.puts([0x90, 0x40, 0x40])
278
- # or a string eg output.puts("904040")
279
- # if none of those types are found, unimidi will attempt
280
- # to call to_bytes and then to_a on the object
281
- #
282
- def puts(*a)
283
- case a.first
284
- when Array then puts_bytes(*a.first)
285
- when Numeric then puts_bytes(*a)
286
- when String then puts_s(*a)
287
- else
288
- if a.first.respond_to?(:to_bytes)
289
- puts_bytes(*a.first.to_bytes.flatten)
290
- elsif a.first.respond_to?(:to_a)
291
- puts_bytes(*a.first.to_a.flatten)
292
- end
293
- end
294
- end
295
-
296
- # sends a message to the output in a form of a string eg "904040". this method does not do
297
- # type checking and therefore is more performant than puts
298
- def puts_s(*a)
299
- @device.puts_s(*a)
300
- end
301
- alias_method :puts_bytestr, :puts_s
302
- alias_method :puts_hex, :puts_s
303
-
304
- # sends a message to the output in a form of bytes eg output.puts_bytes(0x90, 0x40, 0x40).
305
- # this method does not do type checking and therefore is more performant than puts
306
- def puts_bytes(*a)
307
- @device.puts_bytes(*a)
308
- end
309
-
310
- # returns all outputs
311
- def self.all
312
- UniMIDI::Device.all_by_type[:output]
313
- end
314
-
315
- end
316
-
317
- class CongruousApiDevice
318
- extend CongruousApiAdapter::Device::ClassMethods
319
- end
320
-
321
- end