midi-eye 0.3.1 → 0.3.3
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/lib/midi-eye.rb +7 -6
- data/lib/midi-eye/event.rb +93 -0
- data/lib/midi-eye/listener.rb +25 -69
- data/test/listener_test.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 524bf91e8dbac58feee07b0f696a61ac76d7fb4b
|
4
|
+
data.tar.gz: 7441878d91eedc9e9ebaa08a53667e4e58c9d8cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ec47d24161b7c87e59f54bb0250a288e93cff135fcfc5e0dd958c21aacdd618b5f462be17c50835c51491053b2e9a2dedf6108b7c3c5f00c07d7e7e77c7e055
|
7
|
+
data.tar.gz: e33ed2441cc4bebef9e79695345d313d222f8f152a8cad368654383c2e02f84d0c8334624d896308aea36b33d69718cbee8dbcc4db9c805a9aa930c8afa40aa9
|
data/lib/midi-eye.rb
CHANGED
@@ -7,16 +7,17 @@
|
|
7
7
|
#
|
8
8
|
|
9
9
|
# libs
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
10
|
+
require "midi-message"
|
11
|
+
require "nibbler"
|
12
|
+
require "unimidi"
|
13
13
|
|
14
14
|
# classes
|
15
|
-
require
|
16
|
-
require
|
15
|
+
require "midi-eye/event"
|
16
|
+
require "midi-eye/listener"
|
17
|
+
require "midi-eye/source"
|
17
18
|
|
18
19
|
module MIDIEye
|
19
20
|
|
20
|
-
VERSION = "0.3.
|
21
|
+
VERSION = "0.3.3"
|
21
22
|
|
22
23
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module MIDIEye
|
2
|
+
|
3
|
+
class Event
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@event = []
|
7
|
+
@queue = []
|
8
|
+
end
|
9
|
+
|
10
|
+
# Delete an event by name
|
11
|
+
# @param [String, Symbol] name
|
12
|
+
def delete(name)
|
13
|
+
@event.delete_if { |event| event[:listener_name].to_s == name.to_s }
|
14
|
+
end
|
15
|
+
|
16
|
+
def clear
|
17
|
+
@event.clear
|
18
|
+
@queue.clear
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(options = {}, &callback)
|
22
|
+
name = options[:listener_name]
|
23
|
+
options.delete(:listener_name)
|
24
|
+
event = {
|
25
|
+
:conditions => options,
|
26
|
+
:proc => callback,
|
27
|
+
:listener_name => name
|
28
|
+
}
|
29
|
+
@event << event
|
30
|
+
event
|
31
|
+
end
|
32
|
+
|
33
|
+
# Trigger all enqueued events
|
34
|
+
def trigger_enqueued
|
35
|
+
counter = 0
|
36
|
+
while !@queue.empty? do
|
37
|
+
counter += 1
|
38
|
+
trigger(@queue.shift)
|
39
|
+
end
|
40
|
+
counter
|
41
|
+
end
|
42
|
+
|
43
|
+
def enqueue_all(message)
|
44
|
+
@event.each { |name| enqueue(name, message) }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Add an event to the trigger queue
|
48
|
+
def enqueue(action, message)
|
49
|
+
event = {
|
50
|
+
:action => action,
|
51
|
+
:message => message
|
52
|
+
}
|
53
|
+
@queue << event
|
54
|
+
end
|
55
|
+
|
56
|
+
def count
|
57
|
+
@event.count
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Does the given message meet the given conditions?
|
63
|
+
def meets_conditions?(conditions, message)
|
64
|
+
results = conditions.map do |key, value|
|
65
|
+
if message.respond_to?(key)
|
66
|
+
if value.kind_of?(Array)
|
67
|
+
value.include?(message.send(key))
|
68
|
+
else
|
69
|
+
value.eql?(message.send(key))
|
70
|
+
end
|
71
|
+
else
|
72
|
+
false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
results.all?
|
76
|
+
end
|
77
|
+
|
78
|
+
# Trigger an event
|
79
|
+
def trigger(event)
|
80
|
+
action = event[:action]
|
81
|
+
conditions = action[:conditions]
|
82
|
+
if conditions.nil? || meets_conditions?(conditions, event[:message][:message])
|
83
|
+
begin
|
84
|
+
action[:proc].call(event[:message])
|
85
|
+
rescue Exception => exception
|
86
|
+
Thread.main.raise exception
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
data/lib/midi-eye/listener.rb
CHANGED
@@ -2,14 +2,13 @@ module MIDIEye
|
|
2
2
|
|
3
3
|
class Listener
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :event
|
6
6
|
attr_accessor :sources
|
7
7
|
|
8
8
|
# @param [Array<UniMIDI::Input>, UniMIDI::Input] inputs Input(s) to add to the list of sources for this listener
|
9
9
|
def initialize(inputs)
|
10
10
|
@sources = []
|
11
|
-
@
|
12
|
-
@events = []
|
11
|
+
@event = Event.new
|
13
12
|
|
14
13
|
add_input(inputs)
|
15
14
|
end
|
@@ -45,12 +44,7 @@ module MIDIEye
|
|
45
44
|
@sources
|
46
45
|
end
|
47
46
|
alias_method :remove_inputs, :remove_input
|
48
|
-
|
49
|
-
# @param [Symbol] name
|
50
|
-
def delete_event(name)
|
51
|
-
@events.delete_if { |event| event[:listener_name] == name }
|
52
|
-
end
|
53
|
-
|
47
|
+
|
54
48
|
# Start listening for MIDI messages
|
55
49
|
# @params [Hash] options
|
56
50
|
# @option options [Boolean] :background Run in a background thread
|
@@ -65,39 +59,44 @@ module MIDIEye
|
|
65
59
|
# Stop listening for MIDI messages.
|
66
60
|
# @return [MIDIEye::Listener] self
|
67
61
|
def close
|
68
|
-
@listener.kill
|
69
|
-
@
|
62
|
+
@listener.kill if running?
|
63
|
+
@event.clear
|
70
64
|
@sources.clear
|
71
|
-
@event_queue.clear
|
72
65
|
self
|
73
66
|
end
|
74
67
|
alias_method :stop, :close
|
68
|
+
|
69
|
+
# Is the listener running?
|
70
|
+
# @return [Boolean]
|
71
|
+
def running?
|
72
|
+
!@listener.nil?
|
73
|
+
end
|
75
74
|
|
76
75
|
# Join the listener if it's being run in the background.
|
77
76
|
# @return [MIDIEye::Listener] self
|
78
77
|
def join
|
79
78
|
begin
|
80
79
|
@listener.join
|
81
|
-
rescue
|
80
|
+
rescue Exception => exception
|
82
81
|
@listener.kill
|
83
|
-
raise
|
82
|
+
raise exception
|
84
83
|
end
|
85
84
|
self
|
86
85
|
end
|
86
|
+
|
87
|
+
# Deletes the event with the given name (for backwards compat)
|
88
|
+
# @param [String, Symbol] event_name
|
89
|
+
# @return [Boolean]
|
90
|
+
def delete_event(event_name)
|
91
|
+
!@event.delete(event_name).nil?
|
92
|
+
end
|
87
93
|
|
88
94
|
# Add an event to listen for
|
89
95
|
# @param [Hash] options
|
90
96
|
# @return [MIDIEye::Listener] self
|
91
97
|
def listen_for(options = {}, &callback)
|
92
98
|
raise "Listener must have a block" if callback.nil?
|
93
|
-
|
94
|
-
options.delete(:listener_name)
|
95
|
-
event = {
|
96
|
-
:conditions => options,
|
97
|
-
:proc => callback,
|
98
|
-
:listener_name => name
|
99
|
-
}
|
100
|
-
@events << event
|
99
|
+
@event.add(options, &callback)
|
101
100
|
self
|
102
101
|
end
|
103
102
|
alias_method :on_message, :listen_for
|
@@ -112,7 +111,7 @@ module MIDIEye
|
|
112
111
|
messages.each do |message|
|
113
112
|
unless message.nil?
|
114
113
|
data = { :message => message, :timestamp => batch[:timestamp] }
|
115
|
-
@
|
114
|
+
@event.enqueue_all(data)
|
116
115
|
end
|
117
116
|
end
|
118
117
|
end
|
@@ -127,61 +126,18 @@ module MIDIEye
|
|
127
126
|
interval = 1.0/1000
|
128
127
|
loop do
|
129
128
|
poll
|
130
|
-
|
129
|
+
@event.trigger_enqueued
|
131
130
|
sleep(interval)
|
132
131
|
end
|
133
132
|
end
|
134
133
|
|
135
134
|
# Start the background listener thread
|
136
135
|
def listen
|
137
|
-
@listener = Thread.new { listen_loop }
|
136
|
+
@listener = Thread.new { listen_loop }
|
138
137
|
@listener.abort_on_exception = true
|
139
138
|
true
|
140
139
|
end
|
141
|
-
|
142
|
-
# Trigger all queued events
|
143
|
-
def trigger_queued_events
|
144
|
-
@event_queue.length.times { trigger_event(@event_queue.shift) }
|
145
|
-
end
|
146
|
-
|
147
|
-
# Does the given message meet the given conditions?
|
148
|
-
def meets_conditions?(conditions, message)
|
149
|
-
results = conditions.map do |key, value|
|
150
|
-
if message.respond_to?(key)
|
151
|
-
if value.kind_of?(Array)
|
152
|
-
value.include?(message.send(key))
|
153
|
-
else
|
154
|
-
value.eql?(message.send(key))
|
155
|
-
end
|
156
|
-
else
|
157
|
-
false
|
158
|
-
end
|
159
|
-
end
|
160
|
-
results.all?
|
161
|
-
end
|
162
|
-
|
163
|
-
# Trigger an event
|
164
|
-
def trigger_event(event)
|
165
|
-
action = event[:action]
|
166
|
-
conditions = action[:conditions]
|
167
|
-
if conditions.nil? || meets_conditions?(conditions, event[:message][:message])
|
168
|
-
begin
|
169
|
-
action[:proc].call(event[:message])
|
170
|
-
rescue
|
171
|
-
# help
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
# Add an event to the trigger queue
|
177
|
-
def queue_event(action, message)
|
178
|
-
event = {
|
179
|
-
:action => action,
|
180
|
-
:message => message
|
181
|
-
}
|
182
|
-
@event_queue << event
|
183
|
-
end
|
184
|
-
|
140
|
+
|
185
141
|
end
|
186
142
|
|
187
143
|
end
|
data/test/listener_test.rb
CHANGED
@@ -53,9 +53,9 @@ class ListenerTest < Test::Unit::TestCase
|
|
53
53
|
input = $test_device[:input]
|
54
54
|
listener = Listener.new(input)
|
55
55
|
listener.listen_for(:listener_name => :test) do |event|
|
56
|
-
assert_equal(1, listener.
|
56
|
+
assert_equal(1, listener.event.count)
|
57
57
|
listener.delete_event(:test)
|
58
|
-
assert_equal(0, listener.
|
58
|
+
assert_equal(0, listener.event.count)
|
59
59
|
close_all(input, output, listener)
|
60
60
|
end
|
61
61
|
listener.start(:background => true)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midi-eye
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
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-
|
11
|
+
date: 2014-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: midi-message
|
@@ -62,6 +62,7 @@ files:
|
|
62
62
|
- LICENSE
|
63
63
|
- README.md
|
64
64
|
- lib/midi-eye.rb
|
65
|
+
- lib/midi-eye/event.rb
|
65
66
|
- lib/midi-eye/listener.rb
|
66
67
|
- lib/midi-eye/source.rb
|
67
68
|
- test/helper.rb
|