mmplayer 0.0.9 → 0.0.10
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 +4 -4
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/lib/mmplayer.rb +2 -2
- data/lib/mmplayer/context.rb +6 -1
- data/lib/mmplayer/midi/wrapper.rb +19 -6
- data/test/midi/wrapper_test.rb +92 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7506ea91a4204c4c6a54de79d645e80315559b98
|
4
|
+
data.tar.gz: 531967ac3622fc501eab6162d1e63afae815cb69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 737adfeadb792fb1ea7643530635556dd12efe935a047701186c40b43bfdd608ad8b47124c742f1fc33dd4421117c3b506f13d69644499a770498452dad79569
|
7
|
+
data.tar.gz: b6d88d0809f7b443f136b07ba242f22368fdf14f37ed23ec4581f49d4b05c2c83124867201908c91161e7d003ec0a9f5adc99855f8f25849dbba8261c30df9ca
|
data/LICENSE
CHANGED
data/README.md
CHANGED
data/lib/mmplayer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# MMPlayer
|
2
2
|
# Control MPlayer with MIDI
|
3
3
|
#
|
4
|
-
# (c)2015 Ari Russo
|
4
|
+
# (c)2015-2017 Ari Russo
|
5
5
|
# Apache 2.0 License
|
6
6
|
|
7
7
|
# libs
|
@@ -24,7 +24,7 @@ require "mmplayer/context"
|
|
24
24
|
|
25
25
|
module MMPlayer
|
26
26
|
|
27
|
-
VERSION = "0.0.
|
27
|
+
VERSION = "0.0.10"
|
28
28
|
|
29
29
|
# Shortcut to Context constructor
|
30
30
|
def self.new(*args, &block)
|
data/lib/mmplayer/context.rb
CHANGED
@@ -11,11 +11,16 @@ module MMPlayer
|
|
11
11
|
|
12
12
|
# @param [UniMIDI::Input, Array<UniMIDI::Input>] midi_input
|
13
13
|
# @param [Hash] options
|
14
|
+
# @option options [Fixnum] :midi_buffer_length Length of MIDI message buffer in seconds
|
14
15
|
# @option options [String] :mplayer_flags The command-line flags to invoke MPlayer with
|
15
16
|
# @option options [Fixnum] :receive_channel (also: :rx_channel) A MIDI channel to subscribe to. By default, responds to all
|
16
17
|
# @yield
|
17
18
|
def initialize(midi_input, options = {}, &block)
|
18
|
-
|
19
|
+
midi_options = {
|
20
|
+
:buffer_length => options[:midi_buffer_length],
|
21
|
+
:receive_channel => options[:receive_channel] || options[:rx_channel]
|
22
|
+
}
|
23
|
+
@midi = MIDI.new(midi_input, midi_options)
|
19
24
|
@player = Player.new(:flags => options[:mplayer_flags])
|
20
25
|
instance_eval(&block) if block_given?
|
21
26
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module MMPlayer
|
2
2
|
|
3
3
|
module MIDI
|
4
|
-
|
4
|
+
|
5
5
|
# Wrapper for MIDI functionality
|
6
6
|
class Wrapper
|
7
7
|
|
@@ -9,9 +9,12 @@ module MMPlayer
|
|
9
9
|
|
10
10
|
# @param [UniMIDI::Input, Array<UniMIDI::Input>] input
|
11
11
|
# @param [Hash] options
|
12
|
+
# @option options [Fixnum] :buffer_length Length of MIDI message buffer in seconds
|
12
13
|
# @option options [Fixnum] :receive_channel A MIDI channel to subscribe to. By default, responds to all
|
13
14
|
def initialize(input, options = {})
|
15
|
+
@buffer_length = options[:buffer_length]
|
14
16
|
@channel = options[:receive_channel]
|
17
|
+
|
15
18
|
@message_handler = MessageHandler.new
|
16
19
|
@listener = MIDIEye::Listener.new(input)
|
17
20
|
end
|
@@ -52,14 +55,14 @@ module MMPlayer
|
|
52
55
|
def channel=(channel)
|
53
56
|
@listener.event.clear
|
54
57
|
@channel = channel
|
55
|
-
|
58
|
+
initialize_listener if @listener.running?
|
56
59
|
@channel
|
57
60
|
end
|
58
61
|
|
59
62
|
# Start the MIDI listener
|
60
63
|
# @return [Boolean]
|
61
64
|
def start
|
62
|
-
|
65
|
+
initialize_listener
|
63
66
|
@listener.start(:background => true)
|
64
67
|
true
|
65
68
|
end
|
@@ -72,14 +75,24 @@ module MMPlayer
|
|
72
75
|
|
73
76
|
private
|
74
77
|
|
75
|
-
#
|
76
|
-
|
77
|
-
|
78
|
+
# Handle a new MIDI event received
|
79
|
+
# @param [Hash] event
|
80
|
+
# @return [Hash]
|
81
|
+
def handle_new_event(event)
|
82
|
+
if @buffer_length.nil? || event[:timestamp].nil? || event[:timestamp] >= Time.now.to_i - @buffer_length
|
78
83
|
message = event[:message]
|
79
84
|
@message_handler.process(@channel, message)
|
85
|
+
event
|
80
86
|
end
|
81
87
|
end
|
82
88
|
|
89
|
+
# Populate the MIDI listener callback
|
90
|
+
# @return [MIDIEye::Listener]
|
91
|
+
def initialize_listener
|
92
|
+
@listener.on_message { |event| handle_new_event(event) }
|
93
|
+
@listener
|
94
|
+
end
|
95
|
+
|
83
96
|
end
|
84
97
|
|
85
98
|
end
|
data/test/midi/wrapper_test.rb
CHANGED
@@ -9,6 +9,98 @@ class MMPlayer::MIDI::WrapperTest < Minitest::Test
|
|
9
9
|
@midi = MMPlayer::MIDI::Wrapper.new(@input)
|
10
10
|
end
|
11
11
|
|
12
|
+
context "#handle_new_event" do
|
13
|
+
|
14
|
+
context "with no buffer length" do
|
15
|
+
|
16
|
+
setup do
|
17
|
+
@midi.message_handler.expects(:process).once
|
18
|
+
@event = {
|
19
|
+
:message => MIDIMessage::NoteOn.new(0, 64, 120),
|
20
|
+
:timestamp=> 9266.395330429077
|
21
|
+
}
|
22
|
+
@result = @midi.send(:handle_new_event, @event)
|
23
|
+
end
|
24
|
+
|
25
|
+
teardown do
|
26
|
+
@midi.message_handler.unstub(:process)
|
27
|
+
end
|
28
|
+
|
29
|
+
should "return event" do
|
30
|
+
refute_nil @result
|
31
|
+
assert_equal @event, @result
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with buffer length" do
|
37
|
+
|
38
|
+
context "recent message" do
|
39
|
+
|
40
|
+
setup do
|
41
|
+
@midi.message_handler.expects(:process).once
|
42
|
+
@event = {
|
43
|
+
:message => MIDIMessage::NoteOn.new(0, 64, 120),
|
44
|
+
:timestamp=> 9266.395330429077
|
45
|
+
}
|
46
|
+
@result = @midi.send(:handle_new_event, @event)
|
47
|
+
end
|
48
|
+
|
49
|
+
teardown do
|
50
|
+
@midi.message_handler.unstub(:process)
|
51
|
+
end
|
52
|
+
|
53
|
+
should "return event" do
|
54
|
+
refute_nil @result
|
55
|
+
assert_equal @event, @result
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context "with too-old message" do
|
61
|
+
|
62
|
+
setup do
|
63
|
+
@midi.instance_variable_set("@buffer_length", 1)
|
64
|
+
@midi.message_handler.expects(:process).never
|
65
|
+
@event = {
|
66
|
+
:message => MIDIMessage::NoteOn.new(0, 64, 120),
|
67
|
+
:timestamp=> 4.395330429077
|
68
|
+
}
|
69
|
+
@result = @midi.send(:handle_new_event, @event)
|
70
|
+
end
|
71
|
+
|
72
|
+
teardown do
|
73
|
+
@midi.message_handler.unstub(:process)
|
74
|
+
end
|
75
|
+
|
76
|
+
should "not return event" do
|
77
|
+
assert_nil @result
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context "#initialize_listener" do
|
87
|
+
|
88
|
+
setup do
|
89
|
+
@midi.listener.expects(:on_message).once
|
90
|
+
@result = @midi.send(:initialize_listener)
|
91
|
+
end
|
92
|
+
|
93
|
+
teardown do
|
94
|
+
@midi.listener.unstub(:on_message)
|
95
|
+
end
|
96
|
+
|
97
|
+
should "return listener" do
|
98
|
+
refute_nil @result
|
99
|
+
assert_equal MIDIEye::Listener, @result.class
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
12
104
|
context "#start" do
|
13
105
|
|
14
106
|
setup do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mmplayer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|