xi-midi 0.1.0 → 0.1.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/Gemfile +0 -2
- data/lib/xi/midi.rb +2 -0
- data/lib/xi/midi/proxy.rb +1 -6
- data/lib/xi/midi/stream.rb +35 -23
- data/lib/xi/midi/version.rb +1 -1
- data/lib/xi/midi/volca_bass.rb +22 -0
- data/lib/xi/midi/volca_beats.rb +52 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e744c9b11148667886a22d33a97854d6965dfd82
|
4
|
+
data.tar.gz: 98ae2827a7f5ae07629f254a706aa7fc7cf72b0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ec2b45575d310e0cd2d9d748155c885bb410ab3196a762f8227bf6694967faa05e80c462a84b546b329384d92c6a54a0df8289df3097bfb1e6537663e9b2509
|
7
|
+
data.tar.gz: ec55b9d6864031e17007b7d908b82958d728d87f3f4c43b980587d22ba8d55bd6149c33e5b05d8622007464cff0b8d74ee184f0986638f1f2bdb48f2b40ba158
|
data/Gemfile
CHANGED
data/lib/xi/midi.rb
CHANGED
data/lib/xi/midi/proxy.rb
CHANGED
@@ -73,13 +73,8 @@ module Xi::MIDI
|
|
73
73
|
def send_bytes(device, *bytes)
|
74
74
|
return unless open?(device)
|
75
75
|
|
76
|
-
|
76
|
+
debug(:send_bytes, device, bytes)
|
77
77
|
@mutex.synchronize { @outputs[device].write(bytes) }
|
78
78
|
end
|
79
|
-
|
80
|
-
def logger
|
81
|
-
# FIXME this should be configurable
|
82
|
-
@logger ||= Logger.new("/tmp/xi.log")
|
83
|
-
end
|
84
79
|
end
|
85
80
|
end
|
data/lib/xi/midi/stream.rb
CHANGED
@@ -2,23 +2,22 @@ require 'xi/stream'
|
|
2
2
|
require 'xi/midi/proxy'
|
3
3
|
|
4
4
|
module Xi::MIDI
|
5
|
-
class Stream < ::Stream
|
5
|
+
class Stream < Xi::Stream
|
6
6
|
attr_accessor :device, :channel
|
7
7
|
|
8
|
-
def initialize(clock, device: 0, channel: 0)
|
9
|
-
super
|
8
|
+
def initialize(name, clock, device: 0, channel: 0)
|
9
|
+
super
|
10
10
|
|
11
11
|
@device = device
|
12
12
|
@channel = channel
|
13
13
|
@playing_notes = {}
|
14
14
|
|
15
|
-
midi.open(device)
|
15
|
+
midi.open(device) unless midi.open?(device)
|
16
16
|
at_exit { kill_playing_notes }
|
17
17
|
end
|
18
18
|
|
19
19
|
def set(**params)
|
20
|
-
|
21
|
-
super(params)
|
20
|
+
super(gate: :midinote, **params)
|
22
21
|
end
|
23
22
|
|
24
23
|
def stop
|
@@ -37,38 +36,47 @@ module Xi::MIDI
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
40
|
-
def do_gate_on_change(
|
39
|
+
def do_gate_on_change(changes)
|
40
|
+
debug "Gate on change: #{changes}"
|
41
|
+
|
41
42
|
channel = Array(@state[:channel] || 0)
|
42
43
|
midinote = Array(@state[:midinote] || 60)
|
43
44
|
velocity = Array(@state[:velocity] || 127)
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
changes.each do |change|
|
47
|
+
change.fetch(:so_ids).each.with_index do |so_id, i|
|
48
|
+
channel_i = channel[i % channel.size]
|
49
|
+
midinote_i = midinote[i % midinote.size]
|
50
|
+
velocity_i = velocity[i % velocity.size]
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
+
debug "MIDI Note on: #{[channel_i, midinote_i, velocity_i]}"
|
53
|
+
midi.note_on(@device, channel_i, midinote_i, velocity_i)
|
52
54
|
|
53
|
-
|
55
|
+
@playing_notes[so_id] = {channel: channel_i, midinote: midinote_i}
|
56
|
+
end
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
|
-
def do_gate_off_change(
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
def do_gate_off_change(changes)
|
61
|
+
debug "Gate off change: #{changes}"
|
62
|
+
|
63
|
+
changes.each do |change|
|
64
|
+
change.fetch(:so_ids).each do |so_id|
|
65
|
+
note = @playing_notes.delete(so_id)
|
66
|
+
if note
|
67
|
+
debug "MIDI Note off: #{[note[:channel], note[:midinote]]}"
|
68
|
+
midi.note_off(@device, note[:channel], note[:midinote])
|
69
|
+
end
|
63
70
|
end
|
64
71
|
end
|
65
72
|
end
|
66
73
|
|
67
74
|
def do_state_change
|
68
|
-
|
69
|
-
|
75
|
+
debug "State change: #{changed_state}"
|
76
|
+
|
77
|
+
changed_state.each do |p, vs|
|
70
78
|
cc_id = cc_parameters[p]
|
71
|
-
midi.cc(@device, channel, cc_id, v) if cc_id
|
79
|
+
Array(vs).each { |v| midi.cc(@device, channel, cc_id, v.to_i) } if cc_id
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
@@ -80,5 +88,9 @@ module Xi::MIDI
|
|
80
88
|
def midi
|
81
89
|
Proxy.instance
|
82
90
|
end
|
91
|
+
|
92
|
+
def latency_sec
|
93
|
+
0.01
|
94
|
+
end
|
83
95
|
end
|
84
96
|
end
|
data/lib/xi/midi/version.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Xi::MIDI
|
2
|
+
module VolcaBass
|
3
|
+
CC = {
|
4
|
+
slide: 5,
|
5
|
+
expression: 11,
|
6
|
+
octave: 40,
|
7
|
+
lforate: 41,
|
8
|
+
lfoint: 42,
|
9
|
+
pitch1: 43,
|
10
|
+
pitch2: 44,
|
11
|
+
pitch3: 45,
|
12
|
+
attack: 46,
|
13
|
+
decay: 47,
|
14
|
+
cutoffegint: 48,
|
15
|
+
bgate: 49
|
16
|
+
}
|
17
|
+
|
18
|
+
def cc_parameters
|
19
|
+
CC
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Xi::MIDI
|
2
|
+
module VolcaBeats
|
3
|
+
CC = {
|
4
|
+
lKick: 40,
|
5
|
+
lSnare: 41,
|
6
|
+
lLoTom: 42,
|
7
|
+
lHiTom: 43,
|
8
|
+
lClHat: 44,
|
9
|
+
lOpHat: 45,
|
10
|
+
lClap: 46,
|
11
|
+
lClaves: 47,
|
12
|
+
lAgogo: 48,
|
13
|
+
lCrash: 49,
|
14
|
+
sClap: 50,
|
15
|
+
sClaves: 51,
|
16
|
+
sAgogo: 52,
|
17
|
+
sCrash: 53,
|
18
|
+
stutterTime: 54,
|
19
|
+
stutterDepth: 55,
|
20
|
+
tomDecay: 56,
|
21
|
+
clHatDecay: 57,
|
22
|
+
opHatDecay: 58,
|
23
|
+
hatGrain: 59,
|
24
|
+
}
|
25
|
+
|
26
|
+
DRUMS = {
|
27
|
+
bd: 36,
|
28
|
+
sn: 38,
|
29
|
+
lt: 43,
|
30
|
+
ht: 50,
|
31
|
+
ch: 42,
|
32
|
+
oh: 46,
|
33
|
+
cp: 39,
|
34
|
+
cl: 75,
|
35
|
+
ag: 67,
|
36
|
+
cr: 49,
|
37
|
+
}
|
38
|
+
|
39
|
+
def cc_parameters
|
40
|
+
CC
|
41
|
+
end
|
42
|
+
|
43
|
+
def transform_state
|
44
|
+
super
|
45
|
+
|
46
|
+
if !changed_param?(:midinote) && changed_param?(:drum)
|
47
|
+
@state[:midinote] = Array(@state[:drum]).map { |n| DRUMS[n.to_sym] }.compact
|
48
|
+
@changed_params << :midinote
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xi-midi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Damián Silvani
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -84,6 +84,8 @@ files:
|
|
84
84
|
- lib/xi/midi/proxy.rb
|
85
85
|
- lib/xi/midi/stream.rb
|
86
86
|
- lib/xi/midi/version.rb
|
87
|
+
- lib/xi/midi/volca_bass.rb
|
88
|
+
- lib/xi/midi/volca_beats.rb
|
87
89
|
- lib/xi/midi/volca_keys.rb
|
88
90
|
- xi-midi.gemspec
|
89
91
|
homepage: https://github.com/xi-livecode/xi-midi
|