midiops 0.1.1 → 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 +4 -4
- data/README.md +9 -14
- data/circle.yml +3 -0
- data/lib/midiops/handler.rb +29 -22
- data/lib/midiops/note.rb +40 -0
- data/lib/midiops/observer.rb +22 -4
- data/lib/midiops/version.rb +2 -2
- data/lib/midiops.rb +1 -1
- data/midiops.gemspec +2 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c863cc841a88dc2ba892df7a86cd3c8d7eef9f6f
|
4
|
+
data.tar.gz: bec221cd5ffb9874547dabb2418f81565141df4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da6ff6e7f9533fc5c1540b47c4a8d507e02e114975836cb8b640329556a48a6fb0116d3d9285651cb55dd6a03537026a9f67957a327f850392b78c78ff228325
|
7
|
+
data.tar.gz: d8062bdbbd76083eb7a4ee9e7a12f8c067a16e4893b36c13b166dbd75407f17e0750cfc2adcf00df373e9019e97a519991b8ac318f64e82c442e28822bf623b7
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# MIDIOps
|
2
2
|
|
3
3
|
[](https://rubygems.org/gems/midiops)
|
4
|
+
[](https://circleci.com/gh/polamjag/midiops)
|
4
5
|
|
5
|
-
MIDI
|
6
|
+
MIDI Operations. Heavily inspired by [this blog entry](http://hitode909.hatenablog.com/entry/2015/07/28/134304) and [hitode909/sketch-midi](https://github.com/hitode909/sketch-midi).
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -27,28 +28,22 @@ Or install it yourself as:
|
|
27
28
|
This is a super simple example:
|
28
29
|
|
29
30
|
```ruby
|
30
|
-
require '
|
31
|
+
require 'midiops'
|
31
32
|
|
32
33
|
observer = MIDIOps::Observer.new
|
33
34
|
|
34
|
-
observer.
|
35
|
+
observer.on_key 0, :C, 5 do
|
35
36
|
puts "Ch.0.C5 pressed!"
|
36
37
|
end
|
37
38
|
|
39
|
+
observer.on_key 0, :D, 5 do |vel|
|
40
|
+
puts "Ch.0.C5 pressed with velocity #{vel}!"
|
41
|
+
end
|
42
|
+
|
38
43
|
observer.listen_first
|
39
44
|
```
|
40
45
|
|
41
|
-
|
42
|
-
|
43
|
-
Optionally, you can set number of worker thread for massive parallelism like this:
|
44
|
-
|
45
|
-
```ruby
|
46
|
-
require 'unimidi'
|
47
|
-
|
48
|
-
observer = MIDIOps::Observer.new 3 # three workers
|
49
|
-
|
50
|
-
# ...
|
51
|
-
```
|
46
|
+
Connect some MIDI keyboard and execute the script, then press key C5 or D5 on your midi device. Hooray!
|
52
47
|
|
53
48
|
See `/examples` for more materials.
|
54
49
|
|
data/circle.yml
ADDED
data/lib/midiops/handler.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'core_ext/hash'
|
2
|
+
require 'eventmachine'
|
2
3
|
|
3
4
|
module MIDIOps
|
4
5
|
class Handler
|
@@ -11,41 +12,47 @@ module MIDIOps
|
|
11
12
|
def initialize worker_number
|
12
13
|
@handlers = {}
|
13
14
|
@events = []
|
14
|
-
@
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
res.call
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
15
|
+
@waiting_param = false
|
16
|
+
end
|
17
|
+
|
18
|
+
def push_job job
|
22
19
|
end
|
23
20
|
|
24
21
|
def add event, handler
|
25
22
|
@handlers.set_by_keys event, handler
|
26
23
|
end
|
27
24
|
|
28
|
-
def has_handler?
|
29
|
-
if @handlers.keys?(
|
30
|
-
unless @handlers.get_by_keys(*events).is_a? Hash
|
31
|
-
Status::HAS_HANDLER
|
32
|
-
else
|
33
|
-
Status::HANDLER_INDEFINITE
|
34
|
-
end
|
35
|
-
else
|
25
|
+
def has_handler?
|
26
|
+
if @handlers.keys?(*@events).nil?
|
36
27
|
Status::NO_HANDLERS
|
28
|
+
elsif @handlers.get_by_keys(*@events).is_a? Hash
|
29
|
+
@waiting_param = true unless @handlers.get_by_keys(*@events)[:ARG].nil?
|
30
|
+
Status::HANDLER_INDEFINITE
|
31
|
+
else
|
32
|
+
Status::HAS_HANDLER
|
37
33
|
end
|
38
34
|
end
|
39
35
|
|
40
36
|
def handle event
|
41
|
-
@
|
37
|
+
if @waiting_param
|
38
|
+
prc = @handlers.get_by_keys(*@events)[:ARG]
|
39
|
+
EM.defer(Proc.new { prc.call(event) })
|
42
40
|
|
43
|
-
case has_handler?(@events)
|
44
|
-
when Status::HAS_HANDLER
|
45
|
-
@q.push @handlers.get_by_keys(*@events)
|
46
|
-
@events.clear
|
47
|
-
when Status::NO_HANDLERS
|
48
41
|
@events.clear
|
42
|
+
@waiting_param = false
|
43
|
+
else
|
44
|
+
@events << event
|
45
|
+
|
46
|
+
case has_handler?
|
47
|
+
when Status::HAS_HANDLER
|
48
|
+
EM.defer(@handlers.get_by_keys(*@events)) unless @handlers.get_by_keys(*@events).nil?
|
49
|
+
|
50
|
+
@events.clear
|
51
|
+
when Status::NO_HANDLERS
|
52
|
+
@events.clear
|
53
|
+
when Status::HANDLER_INDEFINITE
|
54
|
+
# do nothing
|
55
|
+
end
|
49
56
|
end
|
50
57
|
end
|
51
58
|
end
|
data/lib/midiops/note.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module MIDIOps
|
2
|
+
module Note
|
3
|
+
KEY_OFFSETS = {
|
4
|
+
C: 0,
|
5
|
+
|
6
|
+
Csharp: 1,
|
7
|
+
Dflat: 1,
|
8
|
+
|
9
|
+
D: 2,
|
10
|
+
|
11
|
+
Dsharp: 3,
|
12
|
+
Eflat: 3,
|
13
|
+
|
14
|
+
E: 4,
|
15
|
+
|
16
|
+
F: 5,
|
17
|
+
|
18
|
+
Fsharp: 6,
|
19
|
+
Gflat: 6,
|
20
|
+
|
21
|
+
G: 7,
|
22
|
+
|
23
|
+
Gsharp: 8,
|
24
|
+
Aflat: 8,
|
25
|
+
|
26
|
+
A: 9,
|
27
|
+
|
28
|
+
Asharp: 10,
|
29
|
+
Bflat: 10,
|
30
|
+
|
31
|
+
B: 11
|
32
|
+
}
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def key_to_code key, octave
|
36
|
+
KEY_OFFSETS[key] + 12 + (12 * octave)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/midiops/observer.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'midiops/handler'
|
2
|
+
require 'midiops/note'
|
3
|
+
require 'eventmachine'
|
4
|
+
|
2
5
|
require 'unimidi'
|
3
6
|
|
4
7
|
module MIDIOps
|
@@ -11,11 +14,26 @@ module MIDIOps
|
|
11
14
|
@handler.add event, handler
|
12
15
|
end
|
13
16
|
|
17
|
+
def on_cc ch, number, &handler
|
18
|
+
@handler.add [176+ch, number, :ARG], handler
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_key_press ch, key, octave, &handler
|
22
|
+
@handler.add [144+ch, MIDIOps::Note.key_to_code(key, octave), :ARG], handler
|
23
|
+
end
|
24
|
+
alias_method :on_key, :on_key_press
|
25
|
+
|
26
|
+
def on_key_release ch, key, octave, &handler
|
27
|
+
@handler.add [128+ch, MIDIOps::Note.key_to_code(key, octave), :ARG], handler
|
28
|
+
end
|
29
|
+
|
14
30
|
def listen input
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
31
|
+
EM.run do
|
32
|
+
loop do
|
33
|
+
input.gets.each do |events|
|
34
|
+
events[:data].each do |ev|
|
35
|
+
@handler.handle ev
|
36
|
+
end
|
19
37
|
end
|
20
38
|
end
|
21
39
|
end
|
data/lib/midiops/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.
|
1
|
+
module MIDIOps
|
2
|
+
VERSION = "0.2.0"
|
3
3
|
end
|
data/lib/midiops.rb
CHANGED
data/midiops.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'midiops/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "midiops"
|
8
|
-
spec.version =
|
8
|
+
spec.version = MIDIOps::VERSION
|
9
9
|
spec.authors = ["polamjag"]
|
10
10
|
spec.email = ["s@polamjag.info"]
|
11
11
|
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.add_dependency "unimidi"
|
23
|
+
spec.add_dependency "eventmachine"
|
23
24
|
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.10"
|
25
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midiops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- polamjag
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: unimidi
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: eventmachine
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,11 +111,13 @@ files:
|
|
97
111
|
- Rakefile
|
98
112
|
- bin/console
|
99
113
|
- bin/setup
|
114
|
+
- circle.yml
|
100
115
|
- example/notify-send.rb
|
101
116
|
- example/say.rb
|
102
117
|
- lib/core_ext/hash.rb
|
103
118
|
- lib/midiops.rb
|
104
119
|
- lib/midiops/handler.rb
|
120
|
+
- lib/midiops/note.rb
|
105
121
|
- lib/midiops/observer.rb
|
106
122
|
- lib/midiops/version.rb
|
107
123
|
- midiops.gemspec
|