nerpin 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +47 -0
- data/Rakefile +10 -0
- data/data/nrpn/micron.json +1172 -0
- data/lib/nerpin/controller.rb +39 -0
- data/lib/nerpin/nrpn/micron.rb +14 -0
- data/lib/nerpin/nrpn.rb +52 -0
- data/lib/nerpin/util.rb +36 -0
- data/lib/nerpin/version.rb +3 -0
- data/lib/nerpin.rb +19 -0
- data/nerpin.gemspec +25 -0
- data/spec/micron.html +1693 -0
- data/spec/nerpin/controller_spec.rb +59 -0
- data/spec/nerpin/micron_spec.rb +15 -0
- data/spec/nerpin/nrpn/micron_spec.rb +66 -0
- data/spec/nerpin/util_spec.rb +36 -0
- data/spec/spec_helper.rb +21 -0
- metadata +175 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
module Nerpin
|
2
|
+
class Controller
|
3
|
+
def initialize(destination, nrpn_class)
|
4
|
+
@destination = destination
|
5
|
+
@nrpn_class = nrpn_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def puts(id, value)
|
9
|
+
mutex.synchronize do
|
10
|
+
[
|
11
|
+
[0x63, (id >> 7) & 0b1111111],
|
12
|
+
[0x62, id & 0b1111111],
|
13
|
+
[0x06, value[:v0x06]],
|
14
|
+
[0x26, value[:v0x26]]
|
15
|
+
].each do |message|
|
16
|
+
@destination.puts(0b10110000, message[0], message[1])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def nrpns
|
22
|
+
@nrpn_class.instance_variable_get('@nrpns')
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def mutex
|
28
|
+
@mutex ||= Mutex.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing(name, *args)
|
32
|
+
if nrpn = @nrpn_class.find_by_key(name)
|
33
|
+
puts(nrpn.id, nrpn.value(args.first))
|
34
|
+
else
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Nerpin
|
4
|
+
module Nrpn
|
5
|
+
class Micron < Base
|
6
|
+
def value(value)
|
7
|
+
{
|
8
|
+
:v0x06 => (value >= 0) ? value / 128 : 127 - (value.abs / 128),
|
9
|
+
:v0x26 => (value >= 0) ? value % 128 : 128 - (value.abs % 128)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/nerpin/nrpn.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Nerpin
|
4
|
+
module Nrpn
|
5
|
+
class Base
|
6
|
+
attr_reader :id, :key, :min, :max
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def find_by_key(key)
|
10
|
+
nrpns[key]
|
11
|
+
end
|
12
|
+
|
13
|
+
def nrpns
|
14
|
+
return @nrpns if @nrpns
|
15
|
+
|
16
|
+
data = JSON.parse(
|
17
|
+
open(
|
18
|
+
File.dirname(
|
19
|
+
File.expand_path(__FILE__)
|
20
|
+
) + '/../../data/nrpn/%s.json' % self.name.split(/::/).last.downcase
|
21
|
+
).read
|
22
|
+
)
|
23
|
+
|
24
|
+
@nrpns = Hash[
|
25
|
+
data.map do |k, v|
|
26
|
+
[k.to_sym, new(v['id'], k.to_sym, v['min'], v['max'])]
|
27
|
+
end
|
28
|
+
].freeze
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(id, key, min, max)
|
33
|
+
@id = id
|
34
|
+
@key = key
|
35
|
+
@min = min
|
36
|
+
@max = max
|
37
|
+
end
|
38
|
+
|
39
|
+
def value(value)
|
40
|
+
raise 'subclass must override this'
|
41
|
+
end
|
42
|
+
|
43
|
+
def value_at(scale)
|
44
|
+
value((((min.abs + max) * scale) - min.abs).to_i)
|
45
|
+
end
|
46
|
+
|
47
|
+
def sample
|
48
|
+
value(rand(min.abs + max + (min < 0 ? 2 : 1)) - min.abs - (min < 0 ? 1 : 0))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/nerpin/util.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module Nerpin
|
5
|
+
module Util
|
6
|
+
# ruby -rnerpin -rjson -e "puts JSON.pretty_generate(Nerpin::Util.parse_spec_for_micron)"
|
7
|
+
def self.parse_spec_for_micron
|
8
|
+
spec_url = 'http://ion-micron-miniak.wikia.com/wiki/Common_FAQ'
|
9
|
+
doc = Nokogiri::HTML(open(spec_url))
|
10
|
+
table = doc.xpath('//table').last
|
11
|
+
|
12
|
+
table.xpath('tr').drop(1).inject({}) do |result, tr|
|
13
|
+
id, key, min, max = tr.children.map do |el|
|
14
|
+
el.text.strip
|
15
|
+
end
|
16
|
+
|
17
|
+
unless key.empty?
|
18
|
+
key = key.downcase.
|
19
|
+
gsub(/\-/, 'minus').
|
20
|
+
gsub(/[\W]+/, '_').
|
21
|
+
split('_').
|
22
|
+
join('_').
|
23
|
+
to_sym
|
24
|
+
|
25
|
+
result[key] = {
|
26
|
+
:id => id.to_i,
|
27
|
+
:min => min.to_i,
|
28
|
+
:max => max.to_i
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
result
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/nerpin.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "nerpin/nrpn"
|
2
|
+
require "nerpin/nrpn/micron"
|
3
|
+
require "nerpin/controller"
|
4
|
+
require "nerpin/util"
|
5
|
+
require "nerpin/version"
|
6
|
+
|
7
|
+
module Nerpin
|
8
|
+
ObjectSpace.each_object(class << Nrpn::Base; self; end) do |m|
|
9
|
+
if m != Nrpn::Base
|
10
|
+
name = m.name.split(/::/).last.to_sym
|
11
|
+
|
12
|
+
define_method(name) do |destination|
|
13
|
+
Controller.new(destination, m)
|
14
|
+
end
|
15
|
+
|
16
|
+
module_function name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/nerpin.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/nerpin/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["youpy"]
|
6
|
+
gem.email = ["youpy@buycheapviagraonlinenow.com"]
|
7
|
+
gem.description = %q{A Ruby library to send manufacturer-specific or instrument-specific MIDI messages}
|
8
|
+
gem.summary = %q{A Ruby library to send manufacturer-specific or instrument-specific MIDI messages}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "nerpin"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Nerpin::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency('rspec', ['~> 2.12'])
|
19
|
+
gem.add_development_dependency('rake')
|
20
|
+
gem.add_development_dependency('webmock')
|
21
|
+
gem.add_development_dependency('nerpin')
|
22
|
+
|
23
|
+
gem.add_dependency('nokogiri')
|
24
|
+
gem.add_dependency('json')
|
25
|
+
end
|