midi-jruby 0.1.6 → 0.2.0

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