midiops 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/midiops.svg)](https://rubygems.org/gems/midiops)
|
4
|
+
[![Circle CI](https://circleci.com/gh/polamjag/midiops.svg?style=svg)](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
|