midi-jruby 0.1.6 → 0.2.0

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
- SHA1:
3
- metadata.gz: d37ac746080bbbe99c19459c5a9e8ea5d35f2b44
4
- data.tar.gz: d134b1bcf2c898180152ffd6978f9b46bf8d1522
2
+ SHA256:
3
+ metadata.gz: 01ef785c234f6baaab44700ac5cd1777531a25e3a0f12501f0d5fd1967378149
4
+ data.tar.gz: 5fb7355602cb317dfc63e1bfe874e656463bd7200e4f5a04d9f07aae98422571
5
5
  SHA512:
6
- metadata.gz: 7db8d967508e7e1d9bee502b621fa3b06b542931f4fd22547ae4f3bb1825fe53ffc7bb962c069610a14dbf8e0ec936cd0730e74a28a832341db0fed6f21d9b3a
7
- data.tar.gz: 3e0fbfc184d4db3a8829662cc84c4d5160be02a5dc4ea382fcc00ab5530f6b0dffd3002cd1a380dc2c7d5f48e439ceb256ae65054bb293eab027a564759f3606
6
+ metadata.gz: 1462d234ef4bf16103e519818bd34e364efcb9b698922dd80057870b9bf6d169aa3992e59be3c3ea7841bbd3cafd32504c36372a8ae2007372d8a720e49a199d
7
+ data.tar.gz: 4d2bc64a738362e466497418c3590669509937af9f59b4d22f30ed888d5f5d209a92fe2005458bec038a6a84267213cea90e2f06a2760ad1548eaf431bc24c15
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2011-2017 Ari Russo
1
+ Copyright 2011-2022 Ari Russo
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -38,4 +38,4 @@ There is [an issue](http://stackoverflow.com/questions/8148898/java-midi-in-mac-
38
38
 
39
39
  Apache 2.0, See the file LICENSE
40
40
 
41
- Copyright (c) 2011-2017 [Ari Russo](http://github.com/arirusso)
41
+ Copyright (c) 2011-2022 [Ari Russo](http://github.com/arirusso)
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MIDIJRuby
2
-
3
4
  # Access to javax.sound.midi
4
5
  module API
5
-
6
6
  import javax.sound.midi.MidiSystem
7
7
  import javax.sound.midi.MidiDevice
8
8
  import javax.sound.midi.MidiEvent
@@ -13,17 +13,19 @@ module MIDIJRuby
13
13
 
14
14
  extend self
15
15
 
16
+ SYSEX_STATUS_BYTES = [0xF0, 0xF7].freeze
17
+
16
18
  # Get all MIDI devices that are available via javax.sound.midi
17
19
  # @return [Array<Hash>] A set of hashes for each available device
18
20
  def get_devices
19
21
  MidiSystem.get_midi_device_info.map do |info|
20
22
  jdevice = MidiSystem.get_midi_device(info)
21
- {
22
- :device => jdevice,
23
- :id => get_uuid,
24
- :name => info.get_name,
25
- :description => info.get_description,
26
- :vendor => info.get_vendor
23
+ {
24
+ device: jdevice,
25
+ id: get_uuid,
26
+ name: info.get_name,
27
+ description: info.get_description,
28
+ vendor: info.get_vendor
27
29
  }
28
30
  end
29
31
  end
@@ -31,15 +33,15 @@ module MIDIJRuby
31
33
  # Get all MIDI inputs that are available via javax.sound.midi
32
34
  # @return [Array<Input>]
33
35
  def get_inputs
34
- jinputs = get_devices.select { |device| !device[:device].get_max_transmitters.zero? }
36
+ jinputs = get_devices.reject { |device| device[:device].get_max_transmitters.zero? }
35
37
  jinputs.map { |jinput| Input.new(jinput[:id], jinput[:device], jinput) }
36
38
  end
37
39
 
38
40
  # Get all MIDI outputs that are available via javax.sound.midi
39
41
  # @return [Array<Output>]
40
42
  def get_outputs
41
- joutputs = get_devices.select { |device| !device[:device].get_max_receivers.zero? }
42
- joutputs.map { |joutput| Output.new(joutput[:id], joutput[:device], joutput) }
43
+ joutputs = get_devices.reject { |device| device[:device].get_max_receivers.zero? }
44
+ joutputs.map { |joutput| Output.new(joutput[:id], joutput[:device], joutput) }
43
45
  end
44
46
 
45
47
  # Enable the given input device to receive MIDI messages
@@ -100,9 +102,19 @@ module MIDIJRuby
100
102
  def write_output(device, data)
101
103
  bytes = Java::byte[data.size].new
102
104
  data.each_with_index { |byte, i| bytes.ubyte_set(i, byte) }
103
- message = data.first.eql?(0xF0) ? SysexMessage.new : ShortMessage.new
104
- message.set_message(bytes, data.length.to_java(:int))
105
- @receiver[device].send(message, 0)
105
+ if SYSEX_STATUS_BYTES.include?(data.first)
106
+ message = SysexMessage.new
107
+ message.set_message(bytes, data.length.to_java(:int))
108
+ else
109
+ message = ShortMessage.new
110
+ begin
111
+ message.set_message(*bytes)
112
+ rescue
113
+ # support older java versions
114
+ message.set_message(bytes)
115
+ end
116
+ end
117
+ @receiver[device].send(message, device.get_microsecond_position)
106
118
  true
107
119
  end
108
120
 
@@ -117,15 +129,14 @@ module MIDIJRuby
117
129
 
118
130
  # Input event handler class
119
131
  class InputReceiver
120
-
121
132
  include javax.sound.midi.Receiver
122
-
133
+
123
134
  attr_reader :stream
124
135
 
125
136
  def initialize
126
137
  @buffer = []
127
138
  end
128
-
139
+
129
140
  # Pluck messages from the buffer
130
141
  # @return [Array<Array<Fixnum>>]
131
142
  def read
@@ -133,43 +144,39 @@ module MIDIJRuby
133
144
  @buffer.clear
134
145
  messages
135
146
  end
136
-
147
+
137
148
  # Add a new message to the buffer
138
- # @param [Array<Fixnum>] message
149
+ # @param [javax.sound.midi.MidiMessage] message
139
150
  # @param [Fixnum] timestamp
140
151
  # @return [Array<Array<Fixnum>>]
141
- def send(message, timestamp = -1)
152
+ def send(message, _timestamp = -1)
142
153
  bytes = if message.respond_to?(:get_packed_message)
143
- packed = message.get_packed_message
144
- unpack(packed)
145
- else
146
- string = String.from_java_bytes(message.get_message)
147
- string.unpack("C" * string.length)
148
- end
154
+ packed = message.get_packed_message
155
+ unpack(packed)
156
+ else
157
+ string = String.from_java_bytes(message.get_message)
158
+ string.unpack('C' * string.length)
159
+ end
149
160
  @buffer << bytes
150
161
  end
151
162
 
152
- def close
153
- end
154
-
163
+ def close; end
164
+
155
165
  private
156
-
166
+
157
167
  # @param [String]
158
168
  # @return [Array<Fixnum>]
159
169
  def unpack(message)
160
170
  bytes = []
161
171
  string = message.to_s(16)
162
- string = "0#{s}" if string.length.divmod(2).last > 0
163
- string = string.rjust(6,"0")
164
- while string.length > 0
165
- string_byte = string.slice!(0,2)
172
+ string = "0#{s}" if string.length.divmod(2).last.positive?
173
+ string = string.rjust(6, '0')
174
+ while string.length.positive?
175
+ string_byte = string.slice!(0, 2)
166
176
  bytes << string_byte.hex
167
177
  end
168
- bytes.reverse
178
+ bytes.reverse
169
179
  end
170
-
171
180
  end
172
-
173
181
  end
174
-
175
182
  end
@@ -1,8 +1,8 @@
1
- module MIDIJRuby
1
+ # frozen_string_literal: true
2
2
 
3
+ module MIDIJRuby
3
4
  # Common methods used by both input and output devices
4
5
  module Device
5
-
6
6
  attr_reader :enabled, # has the device been initialized?
7
7
  :id, # unique int id
8
8
  :name, # name property from javax.sound.midi.MidiDevice.Info
@@ -10,7 +10,7 @@ module MIDIJRuby
10
10
  :vendor, # vendor property from javax.sound.midi.MidiDevice.Info
11
11
  :type # :input or :output
12
12
 
13
- alias_method :enabled?, :enabled
13
+ alias enabled? enabled
14
14
 
15
15
  # @param [Fixnum] The uuid for the given device
16
16
  # @param [Java::ComSunMediaSound::MidiInDevice, Java::ComSunMediaSound::MidiOutDevice] device The underlying Java device object
@@ -47,8 +47,8 @@ module MIDIJRuby
47
47
  # @return [Hash]
48
48
  def self.all_by_type
49
49
  @devices ||= {
50
- :input => API.get_inputs,
51
- :output => API.get_outputs
50
+ input: API.get_inputs,
51
+ output: API.get_outputs
52
52
  }
53
53
  end
54
54
 
@@ -62,9 +62,7 @@ module MIDIJRuby
62
62
 
63
63
  # @return [String]
64
64
  def get_type
65
- self.class.name.split("::").last.downcase.to_sym
65
+ self.class.name.split('::').last.downcase.to_sym
66
66
  end
67
-
68
67
  end
69
-
70
68
  end
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MIDIJRuby
2
-
3
4
  # Input device class
4
5
  class Input
5
-
6
6
  include Device
7
-
7
+
8
8
  attr_reader :buffer
9
-
9
+
10
10
  #
11
11
  # An array of MIDI event hashes as such:
12
12
  # [
@@ -25,10 +25,10 @@ module MIDIJRuby
25
25
  @pointer = @buffer.length
26
26
  messages
27
27
  end
28
- alias_method :read, :gets
29
-
28
+ alias read gets
29
+
30
30
  # Same as Input#gets but returns message data as string of hex digits:
31
- # [
31
+ # [
32
32
  # { :data => "904060", :timestamp => 904 },
33
33
  # { :data => "804060", :timestamp => 1150 },
34
34
  # { :data => "90447F", :timestamp => 1300 }
@@ -40,14 +40,14 @@ module MIDIJRuby
40
40
  messages.each { |message| message[:data] = numeric_bytes_to_hex_string(message[:data]) }
41
41
  messages
42
42
  end
43
- alias_method :gets_bytestr, :gets_s
44
- alias_method :gets_hex, :gets_s
43
+ alias gets_bytestr gets_s
44
+ alias gets_hex gets_s
45
45
 
46
46
  # Enable this the input for use; can be passed a block
47
47
  # @param [Hash] options
48
48
  # @param [Proc] block
49
49
  # @return [Input] self
50
- def enable(options = {}, &block)
50
+ def enable(_options = {})
51
51
  unless @enabled
52
52
  initialize_input
53
53
  @enabled = true
@@ -62,8 +62,8 @@ module MIDIJRuby
62
62
  self
63
63
  end
64
64
  end
65
- alias_method :open, :enable
66
- alias_method :start, :enable
65
+ alias open enable
66
+ alias start enable
67
67
 
68
68
  # Close this input
69
69
  # @return [Boolean]
@@ -72,25 +72,25 @@ module MIDIJRuby
72
72
  API.close_input(@device)
73
73
  @enabled = false
74
74
  end
75
-
75
+
76
76
  # Select the first input
77
77
  # @return [Input]
78
78
  def self.first
79
- Device.first(:input)
79
+ Device.first(:input)
80
80
  end
81
81
 
82
82
  # Select the last input
83
83
  # @return [Input]
84
84
  def self.last
85
- Device.last(:input)
85
+ Device.last(:input)
86
86
  end
87
-
87
+
88
88
  # All inputs
89
89
  # @return [Array<Input>]
90
90
  def self.all
91
91
  Device.all_by_type[:input]
92
92
  end
93
-
93
+
94
94
  private
95
95
 
96
96
  # Initialize the input components
@@ -102,7 +102,7 @@ module MIDIJRuby
102
102
  initialize_listener
103
103
  true
104
104
  end
105
-
105
+
106
106
  # Initialize the input buffer
107
107
  # @return [Boolean]
108
108
  def initialize_buffer
@@ -110,46 +110,46 @@ module MIDIJRuby
110
110
  @pointer = 0
111
111
  def @buffer.clear
112
112
  @pointer = 0
113
- super
113
+ super
114
114
  end
115
115
  end
116
-
116
+
117
117
  # Get a timestamp for the current time
118
118
  # @return [Fixnum]
119
119
  def now
120
120
  now = Time.now.to_f - @start_time
121
121
  now * 1000
122
122
  end
123
-
123
+
124
124
  # A hash of a MIDI message and corresponding timestamp
125
125
  # @param [Array<Fixnum>] message
126
126
  # @param [Fixnum] timestamp
127
127
  # @return [Hash]
128
- def get_message_formatted(message, timestamp)
129
- {
130
- :data => message,
131
- :timestamp => timestamp
128
+ def get_message_formatted(message, timestamp)
129
+ {
130
+ data: message,
131
+ timestamp: timestamp
132
132
  }
133
133
  end
134
-
134
+
135
135
  # Messages in the buffer
136
136
  # @return [Array<Array<Fixnum>>]
137
137
  def queued_messages
138
138
  @buffer.slice(@pointer, @buffer.length - @pointer)
139
139
  end
140
-
140
+
141
141
  # Are there any new messages in the buffer?
142
142
  # @return [Boolean]
143
143
  def queued_messages?
144
144
  @pointer < @buffer.length
145
145
  end
146
-
146
+
147
147
  # Launch a background thread that collects messages
148
148
  # @return [Thread]
149
149
  def initialize_listener
150
150
  @listener = Thread.new do
151
151
  begin
152
- loop do
152
+ loop do
153
153
  while (messages = API.read_input(@device)).empty?
154
154
  sleep(1.0/1000)
155
155
  end
@@ -162,11 +162,11 @@ module MIDIJRuby
162
162
  @listener.abort_on_exception = true
163
163
  @listener
164
164
  end
165
-
165
+
166
166
  # @param [Array<Array<Fixnum>>]
167
167
  # @return [Array<Array<Fixnum>>]
168
168
  def add_to_buffer(messages)
169
- @buffer += messages.compact.map do |message|
169
+ @buffer += messages.compact.map do |message|
170
170
  get_message_formatted(message, now)
171
171
  end
172
172
  end
@@ -175,14 +175,12 @@ module MIDIJRuby
175
175
  # @param [Array<Fixnum>] bytes
176
176
  # @return [String]
177
177
  def numeric_bytes_to_hex_string(bytes)
178
- string_bytes = bytes.map do |byte|
178
+ string_bytes = bytes.map do |byte|
179
179
  string = byte.to_s(16).upcase
180
180
  string = "0#{string}" if byte < 0x10
181
181
  string
182
182
  end
183
183
  string_bytes.join
184
- end
185
-
184
+ end
186
185
  end
187
-
188
186
  end
@@ -1,51 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MIDIJRuby
2
-
3
4
  # Output device class
4
5
  class Output
5
-
6
6
  include Device
7
-
7
+
8
8
  # Close this output
9
9
  # @return [Boolean]
10
10
  def close
11
11
  API.close_output(@device)
12
12
  @enabled = false
13
13
  end
14
-
14
+
15
15
  # Output the given MIDI message
16
- # @param [String] data A MIDI message expressed as a string of hex digits
16
+ # @param [String] data A MIDI message expressed as a string of hex digits
17
17
  # @return [Boolean]
18
18
  def puts_s(data)
19
19
  bytes = hex_string_to_numeric_bytes(data)
20
20
  puts_bytes(*bytes)
21
21
  end
22
- alias_method :puts_bytestr, :puts_s
23
- alias_method :puts_hex, :puts_s
22
+ alias puts_bytestr puts_s
23
+ alias puts_hex puts_s
24
24
 
25
25
  # Output the given MIDI message
26
- # @param [*Fixnum] data A MIDI messages expressed as Numeric bytes
26
+ # @param [*Fixnum] data A MIDI messages expressed as Numeric bytes
27
27
  # @return [Boolean]
28
28
  def puts_bytes(*data)
29
29
  API.write_output(@device, data)
30
30
  end
31
-
31
+
32
32
  # Output the given MIDI message
33
- # @param [*Fixnum, *String] args
33
+ # @param [*Fixnum, *String] args
34
34
  # @return [Boolean]
35
35
  def puts(*args)
36
36
  case args.first
37
- when Array then args.each { |arg| puts(*arg) }
38
- when Numeric then puts_bytes(*args)
39
- when String then puts_bytestr(*args)
37
+ when Array then args.each { |arg| puts(*arg) }
38
+ when Numeric then puts_bytes(*args)
39
+ when String then puts_bytestr(*args)
40
40
  end
41
41
  end
42
- alias_method :write, :puts
43
-
42
+ alias write puts
43
+
44
44
  # Enable this device; also takes a block
45
45
  # @param [Hash] options
46
46
  # @param [Proc] block
47
47
  # @return [Output]
48
- def enable(options = {}, &block)
48
+ def enable(_options = {})
49
49
  unless @enabled
50
50
  API.enable_output(@device)
51
51
  @enabled = true
@@ -60,21 +60,21 @@ module MIDIJRuby
60
60
  self
61
61
  end
62
62
  end
63
- alias_method :open, :enable
64
- alias_method :start, :enable
65
-
63
+ alias open enable
64
+ alias start enable
65
+
66
66
  # Select the first output
67
67
  # @return [Output]
68
68
  def self.first
69
- Device.first(:output)
69
+ Device.first(:output)
70
70
  end
71
71
 
72
72
  # Select the last output
73
73
  # @return [Output]
74
74
  def self.last
75
- Device.last(:output)
75
+ Device.last(:output)
76
76
  end
77
-
77
+
78
78
  # All outputs
79
79
  # @return [Array<Output>]
80
80
  def self.all
@@ -89,12 +89,10 @@ module MIDIJRuby
89
89
  def hex_string_to_numeric_bytes(string)
90
90
  string = string.dup
91
91
  bytes = []
92
- until (string_byte = string.slice!(0,2)) == ""
92
+ until (string_byte = string.slice!(0, 2)) == ''
93
93
  bytes << string_byte.hex
94
94
  end
95
95
  bytes
96
96
  end
97
-
98
97
  end
99
-
100
98
  end
data/lib/midi-jruby.rb CHANGED
@@ -1,26 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # MIDI-JRuby
3
5
  # Realtime MIDI IO in JRuby using the javax.sound.midi API
4
6
  #
5
- # (c) 2011-2017 Ari Russo
7
+ # (c) 2011-2022 Ari Russo
6
8
  # Licensed under Apache 2.0
7
9
  # https://github.com/arirusso/midi-jruby
8
10
  #
9
11
 
10
12
  # libs
11
- require "java"
12
- require "forwardable"
13
+ require 'java'
14
+ require 'forwardable'
13
15
 
14
16
  # modules
15
- require "midi-jruby/api"
16
- require "midi-jruby/device"
17
+ require 'midi-jruby/api'
18
+ require 'midi-jruby/device'
17
19
 
18
20
  # classes
19
- require "midi-jruby/input"
20
- require "midi-jruby/output"
21
+ require 'midi-jruby/input'
22
+ require 'midi-jruby/output'
21
23
 
22
24
  module MIDIJRuby
23
-
24
- VERSION = "0.1.6"
25
-
25
+ VERSION = '0.2.0'
26
26
  end
metadata CHANGED
@@ -1,95 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: midi-jruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Russo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-09 00:00:00.000000000 Z
11
+ date: 2022-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '5.5'
18
+ version: '13.0'
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 5.5.0
22
- name: minitest
23
- prerelease: false
24
- type: :development
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
- requirement: !ruby/object:Gem::Requirement
35
- requirements:
36
- - - "~>"
37
- - !ruby/object:Gem::Version
38
- version: '1.1'
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: 1.1.0
42
- name: mocha
21
+ version: 13.0.6
22
+ name: rake
43
23
  prerelease: false
44
24
  type: :development
45
25
  version_requirements: !ruby/object:Gem::Requirement
46
26
  requirements:
47
27
  - - "~>"
48
28
  - !ruby/object:Gem::Version
49
- version: '1.1'
29
+ version: '13.0'
50
30
  - - ">="
51
31
  - !ruby/object:Gem::Version
52
- version: 1.1.0
32
+ version: 13.0.6
53
33
  - !ruby/object:Gem::Dependency
54
34
  requirement: !ruby/object:Gem::Requirement
55
35
  requirements:
56
36
  - - "~>"
57
37
  - !ruby/object:Gem::Version
58
- version: '10.4'
38
+ version: '3.11'
59
39
  - - ">="
60
40
  - !ruby/object:Gem::Version
61
- version: 10.4.2
62
- name: rake
41
+ version: 3.11.0
42
+ name: rspec
63
43
  prerelease: false
64
44
  type: :development
65
45
  version_requirements: !ruby/object:Gem::Requirement
66
46
  requirements:
67
47
  - - "~>"
68
48
  - !ruby/object:Gem::Version
69
- version: '10.4'
49
+ version: '3.11'
70
50
  - - ">="
71
51
  - !ruby/object:Gem::Version
72
- version: 10.4.2
52
+ version: 3.11.0
73
53
  - !ruby/object:Gem::Dependency
74
54
  requirement: !ruby/object:Gem::Requirement
75
55
  requirements:
76
56
  - - "~>"
77
57
  - !ruby/object:Gem::Version
78
- version: '1.2'
58
+ version: '1.10'
79
59
  - - ">="
80
60
  - !ruby/object:Gem::Version
81
- version: 1.2.1
82
- name: shoulda-context
61
+ version: 1.10.0
62
+ name: rubocop
83
63
  prerelease: false
84
64
  type: :development
85
65
  version_requirements: !ruby/object:Gem::Requirement
86
66
  requirements:
87
67
  - - "~>"
88
68
  - !ruby/object:Gem::Version
89
- version: '1.2'
69
+ version: '1.10'
90
70
  - - ">="
91
71
  - !ruby/object:Gem::Version
92
- version: 1.2.1
72
+ version: 1.10.0
93
73
  description: Realtime MIDI IO with JRuby using the javax.sound.midi API
94
74
  email:
95
75
  - ari.russo@gmail.com
@@ -104,9 +84,6 @@ files:
104
84
  - lib/midi-jruby/device.rb
105
85
  - lib/midi-jruby/input.rb
106
86
  - lib/midi-jruby/output.rb
107
- - test/helper.rb
108
- - test/input_buffer_test.rb
109
- - test/io_test.rb
110
87
  homepage: http://github.com/arirusso/midi-jruby
111
88
  licenses:
112
89
  - Apache-2.0
@@ -124,10 +101,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
101
  requirements:
125
102
  - - ">="
126
103
  - !ruby/object:Gem::Version
127
- version: 1.3.6
104
+ version: '0'
128
105
  requirements: []
129
- rubyforge_project: midi-jruby
130
- rubygems_version: 2.6.8
106
+ rubygems_version: 3.2.29
131
107
  signing_key:
132
108
  specification_version: 4
133
109
  summary: Realtime MIDI IO with JRuby
data/test/helper.rb DELETED
@@ -1,58 +0,0 @@
1
- $:.unshift(File.join("..", "lib"))
2
-
3
- require "minitest/autorun"
4
- require "shoulda-context"
5
- require "midi-jruby"
6
-
7
- module TestHelper
8
-
9
- extend self
10
-
11
- # http://stackoverflow.com/questions/8148898/java-midi-in-mac-osx-broken
12
- def sysex_ok?
13
- ENV["_system_name"] != "OSX"
14
- end
15
-
16
- def bytestrs_to_ints(arr)
17
- data = arr.map { |m| m[:data] }.join
18
- output = []
19
- until (bytestr = data.slice!(0,2)).eql?("")
20
- output << bytestr.hex
21
- end
22
- output
23
- end
24
-
25
- def numeric_messages
26
- messages = [
27
- [0x90, 100, 100], # note on
28
- [0x90, 43, 100], # note on
29
- [0x90, 76, 100], # note on
30
- [0x90, 60, 100], # note on
31
- [0x80, 100, 100] # note off
32
- ]
33
- if sysex_ok?
34
- messages << [0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7]
35
- end
36
- messages
37
- end
38
-
39
- def string_messages
40
- messages = [
41
- "906440", # note on
42
- "804340" # note off
43
- ]
44
- if sysex_ok?
45
- messages << "F04110421240007F0041F7"
46
- end
47
- messages
48
- end
49
-
50
- def input
51
- MIDIJRuby::Input.first
52
- end
53
-
54
- def output
55
- MIDIJRuby::Output.all[1]
56
- end
57
-
58
- end
@@ -1,46 +0,0 @@
1
- require "helper"
2
-
3
- class MIDIJRuby::InputBufferTest < Minitest::Test
4
-
5
- context "MIDIJRuby" do
6
-
7
- setup do
8
- @input = TestHelper.input.open
9
- @output = TestHelper.output.open
10
- @input.buffer.clear
11
- @pointer = 0
12
- end
13
-
14
- teardown do
15
- @input.close
16
- @output.close
17
- end
18
-
19
- context "Source#buffer" do
20
-
21
- setup do
22
- @messages = TestHelper.numeric_messages
23
- @messages_arr = @messages.inject(&:+).flatten
24
- @received_arr = []
25
- end
26
-
27
- should "have the correct messages in the buffer" do
28
- bytes = []
29
- @messages.each do |message|
30
- p "sending: #{message}"
31
- @output.puts(message)
32
- bytes += message
33
-
34
- sleep(1)
35
-
36
- buffer = @input.buffer.map { |m| m[:data] }.flatten
37
- p "received: #{buffer.to_s}"
38
- assert_equal(bytes, buffer)
39
- end
40
- assert_equal(bytes.length, @input.buffer.map { |m| m[:data] }.flatten.length)
41
- end
42
-
43
- end
44
-
45
- end
46
- end
data/test/io_test.rb DELETED
@@ -1,80 +0,0 @@
1
- require "helper"
2
-
3
- class MIDIJRuby::IOTest < Minitest::Test
4
-
5
- # These tests assume that TestOutput is connected to TestInput
6
- context "MIDIJRuby" do
7
-
8
- setup do
9
- @input = TestHelper.input.open
10
- @output = TestHelper.output.open
11
- @input.buffer.clear
12
- @pointer = 0
13
- end
14
-
15
- teardown do
16
- @input.close
17
- @output.close
18
- end
19
-
20
- context "full IO" do
21
-
22
- context "using Arrays" do
23
-
24
- setup do
25
- @messages = TestHelper.numeric_messages
26
- @messages_arr = @messages.inject(&:+).flatten
27
- @received_arr = []
28
- end
29
-
30
- should "do IO" do
31
- @messages.each do |message|
32
-
33
- p "sending: #{message}"
34
-
35
- @output.puts(message)
36
- sleep(1)
37
- received = @input.gets.map { |m| m[:data] }.flatten
38
-
39
- p "received: #{received}"
40
-
41
- assert_equal(@messages_arr.slice(@pointer, received.length), received)
42
- @pointer += received.length
43
- @received_arr += received
44
- end
45
- assert_equal(@messages_arr.length, @received_arr.length)
46
- end
47
- end
48
-
49
- context "using byte Strings" do
50
-
51
- setup do
52
- @messages = TestHelper.string_messages
53
- @messages_str = @messages.join
54
- @received_str = ""
55
- end
56
-
57
- should "do IO" do
58
- @messages.each do |message|
59
-
60
- p "sending: #{message}"
61
-
62
- @output.puts(message)
63
- sleep(1)
64
- received = @input.gets_bytestr.map { |m| m[:data] }.flatten.join
65
- p "received: #{received}"
66
-
67
- assert_equal(@messages_str.slice(@pointer, received.length), received)
68
- @pointer += received.length
69
- @received_str += received
70
- end
71
- assert_equal(@messages_str, @received_str)
72
- end
73
-
74
- end
75
-
76
- end
77
-
78
- end
79
-
80
- end