midi-topaz 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -30
- data/lib/topaz/timer.rb +30 -17
- data/lib/topaz.rb +4 -4
- data/test/clock_test.rb +1 -2
- data/test/helper.rb +3 -3
- data/test/midi_clock_input_test.rb +2 -6
- data/test/midi_clock_output_test.rb +26 -11
- data/test/tempo_calculator_test.rb +3 -4
- data/test/tempo_source_test.rb +4 -6
- data/test/timer_test.rb +12 -11
- metadata +100 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9f83fa43c38e0489f38bec2e2270421bd87d2e6
|
4
|
+
data.tar.gz: 2c4f5c820ce0eaf0fd330b8c232a47f6fcca0d5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2a78d859d6e086983421936fb68e7ccf7a780adf79eefa82189fc9c1380cac3bc0bd19187053c54c384b415dca482b83996f0e86ddb30f7f3f8045a3f8ba3de
|
7
|
+
data.tar.gz: 37ab0b21755412718141df5d1cf21c2ecdaadc68ba8b5e0b4e6e33cd880a0da041d39140002eea7fea09e7618aba23e41df27b4e592305fe136e65e293c79c16
|
data/README.md
CHANGED
@@ -33,74 +33,63 @@ end
|
|
33
33
|
sequencer = Sequencer.new
|
34
34
|
```
|
35
35
|
|
36
|
-
The
|
36
|
+
The Topaz clock can now be used to step that sequencer. Timed by Topaz, the passed in block will be called repeatedly at 130 BPM
|
37
37
|
|
38
38
|
```ruby
|
39
|
-
@
|
39
|
+
@clock = Topaz::Clock.new(130) { sequencer.step }
|
40
40
|
```
|
41
41
|
|
42
|
-
|
42
|
+
A MIDI device can be used to time and control the tempo. To accomplish this, pass a [unimidi](https://github.com/arirusso/unimidi) input to the Clock constructor
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
@input = UniMIDI::Input.
|
45
|
+
@input = UniMIDI::Input.gets # select a midi input
|
46
46
|
|
47
|
-
@
|
47
|
+
@clock = Topaz::Clock.new(@input) { sequencer.step }
|
48
48
|
```
|
49
49
|
|
50
|
-
Topaz can also act as a master clock. If a MIDI output is passed to Topaz, MIDI
|
50
|
+
Topaz can also act as a MIDI master clock. If a MIDI output is passed to Topaz, MIDI clock messages will automatically be sent to that output at the appropriate time
|
51
51
|
|
52
52
|
```ruby
|
53
|
-
@output = UniMIDI::Output.
|
53
|
+
@output = UniMIDI::Output.gets # select a midi output
|
54
54
|
|
55
|
-
@
|
55
|
+
@clock = Topaz::Clock.new(120, :midi => @output) do
|
56
56
|
sequencer.step
|
57
57
|
end
|
58
58
|
```
|
59
59
|
|
60
|
-
Input and multiple outputs can be used simultaneously
|
60
|
+
Input and multiple outputs can be used simultaneously, for MIDI thru
|
61
61
|
|
62
62
|
```ruby
|
63
|
-
@
|
63
|
+
@clock = Topaz::Clock.new(@input, :midi => [@output1, @output2]) do
|
64
64
|
sequencer.step
|
65
65
|
end
|
66
66
|
```
|
67
67
|
|
68
|
-
Once the
|
68
|
+
Once the Clock object is initialized, start the clock
|
69
69
|
|
70
70
|
```ruby
|
71
|
-
@
|
71
|
+
@clock.start
|
72
72
|
```
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
#### Other things to note
|
77
|
-
|
78
|
-
Whether or not you are using an internal or external clock source, the event block will be called at quarter note intervals by default. If you wish to change this set the option :interval. In this case, the event will be fired 4 times per beat (16th notes) at 138 BPM
|
74
|
+
Topaz will run in a background thread if the option `:background => true` is passed in.
|
79
75
|
|
80
76
|
```ruby
|
81
|
-
@
|
82
|
-
sequencer.step
|
83
|
-
end
|
77
|
+
@clock.start(:background => true)
|
84
78
|
```
|
79
|
+
|
80
|
+
If you are syncing to an external MIDI source, this will start the listener waiting for MIDI clock messages.
|
85
81
|
|
86
|
-
|
87
|
-
(this feature is currently in-progress and may return some low values - 5/26/2011)
|
82
|
+
You can view the current tempo:
|
88
83
|
|
89
84
|
```ruby
|
90
|
-
@
|
85
|
+
@clock.tempo
|
91
86
|
=> 132.422000
|
92
87
|
```
|
93
|
-
|
94
|
-
Run the generator in a background thread by passing :background => true to Tempo#start
|
95
|
-
|
96
|
-
```ruby
|
97
|
-
@tempo.start(:background => true)
|
98
|
-
```
|
99
88
|
|
100
89
|
Pass in a block that will stop the clock when it evaluates to true
|
101
90
|
|
102
91
|
```ruby
|
103
|
-
@
|
92
|
+
@clock.trigger.stop { @i == 20 }
|
104
93
|
```
|
105
94
|
|
106
95
|
## Documentation
|
data/lib/topaz/timer.rb
CHANGED
@@ -69,10 +69,7 @@ module Topaz
|
|
69
69
|
@thread = Thread.new do
|
70
70
|
begin
|
71
71
|
initialize_running_state
|
72
|
-
loop
|
73
|
-
dispatch
|
74
|
-
advance
|
75
|
-
end
|
72
|
+
loop { perform }
|
76
73
|
rescue Exception => exception
|
77
74
|
Thread.main.raise(exception)
|
78
75
|
end
|
@@ -88,22 +85,38 @@ module Topaz
|
|
88
85
|
# @return [Boolean]
|
89
86
|
def dispatch
|
90
87
|
# Stuff to do on every tick
|
91
|
-
if
|
92
|
-
# look for stop
|
93
|
-
!@event.nil? && @event.do_clock
|
94
|
-
@last_midi_clock = (@phase * 24).to_i
|
95
|
-
true
|
96
|
-
end
|
88
|
+
clock if clock?
|
97
89
|
# Stuff to do on @interval
|
98
|
-
if
|
99
|
-
|
100
|
-
@last_tick_event = (@phase * @interval).to_i
|
101
|
-
true
|
102
|
-
end
|
90
|
+
tick if tick?
|
91
|
+
true
|
103
92
|
end
|
104
93
|
|
105
94
|
private
|
106
95
|
|
96
|
+
# Perform the timer function
|
97
|
+
# @return [Boolean]
|
98
|
+
def perform
|
99
|
+
dispatch
|
100
|
+
advance
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
# Perform a tick
|
105
|
+
# @return [Boolean]
|
106
|
+
def tick
|
107
|
+
!@event.nil? && !@pause && @event.do_tick
|
108
|
+
@last_tick_event = (@phase * @interval).to_i
|
109
|
+
true
|
110
|
+
end
|
111
|
+
|
112
|
+
# Perform MIDI clock
|
113
|
+
# @return [Boolean]
|
114
|
+
def clock
|
115
|
+
!@event.nil? && @event.do_clock
|
116
|
+
@last_midi_clock = (@phase * 24).to_i
|
117
|
+
true
|
118
|
+
end
|
119
|
+
|
107
120
|
# Initialize the variables that handle the running process of the timer
|
108
121
|
# @return [Boolean]
|
109
122
|
def initialize_running_state
|
@@ -115,14 +128,14 @@ module Topaz
|
|
115
128
|
|
116
129
|
# Is the current phase appropriate for MIDI clock output?
|
117
130
|
# @return [Boolean]
|
118
|
-
def
|
131
|
+
def clock?
|
119
132
|
phase = (@phase * 24).to_i
|
120
133
|
!@last_midi_clock.eql?(phase)
|
121
134
|
end
|
122
135
|
|
123
136
|
# Is the current phase appropriate for the tick event?
|
124
137
|
# @return [Boolean]
|
125
|
-
def
|
138
|
+
def tick?
|
126
139
|
phase = (@phase * @interval).to_i
|
127
140
|
!@last_tick_event.eql?(phase)
|
128
141
|
end
|
data/lib/topaz.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# MIDI syncable tempo module in Ruby
|
3
3
|
# (c)2011-2014 Ari Russo and licensed under the Apache 2.0 License
|
4
|
-
#
|
4
|
+
#
|
5
5
|
|
6
6
|
# libs
|
7
7
|
require "forwardable"
|
@@ -22,7 +22,7 @@ require "topaz/tempo_calculator"
|
|
22
22
|
require "topaz/timer"
|
23
23
|
|
24
24
|
module Topaz
|
25
|
-
|
26
|
-
VERSION = "0.2.
|
27
|
-
|
25
|
+
|
26
|
+
VERSION = "0.2.2"
|
27
|
+
|
28
28
|
end
|
data/test/clock_test.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
dir = File.dirname(File.expand_path(__FILE__))
|
2
2
|
$LOAD_PATH.unshift dir + "/../lib"
|
3
3
|
|
4
|
-
require "
|
4
|
+
require "minitest/autorun"
|
5
5
|
require "mocha/test_unit"
|
6
6
|
require "shoulda-context"
|
7
7
|
require "topaz"
|
8
8
|
|
9
9
|
module TestHelper
|
10
|
-
|
10
|
+
|
11
11
|
def self.select_devices
|
12
12
|
$test_device ||= {}
|
13
13
|
{ :input => UniMIDI::Input, :output => UniMIDI::Output }.each do |type, klass|
|
14
14
|
$test_device[type] = klass.gets
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
end
|
19
19
|
|
20
20
|
TestHelper.select_devices
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
|
-
class Topaz::MIDIClockInputTest < Test
|
3
|
+
class Topaz::MIDIClockInputTest < Minitest::Test
|
4
4
|
|
5
5
|
context "MIDIClockInput" do
|
6
6
|
|
@@ -32,7 +32,7 @@ class Topaz::MIDIClockInputTest < Test::Unit::TestCase
|
|
32
32
|
|
33
33
|
should "tick when counter has reached tick threshold" do
|
34
34
|
assert_equal 4, @clock.interval
|
35
|
-
23.times do
|
35
|
+
23.times do
|
36
36
|
refute @clock.send(:tick?)
|
37
37
|
@clock.send(:advance)
|
38
38
|
end
|
@@ -45,7 +45,3 @@ class Topaz::MIDIClockInputTest < Test::Unit::TestCase
|
|
45
45
|
end
|
46
46
|
|
47
47
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
|
-
class Topaz::MIDIClockOutputTest < Test
|
3
|
+
class Topaz::MIDIClockOutputTest < Minitest::Test
|
4
4
|
|
5
5
|
context "MIDIClockOutput" do
|
6
6
|
|
@@ -10,34 +10,52 @@ class Topaz::MIDIClockOutputTest < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
context "#do_start" do
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
setup do
|
15
15
|
@output.expects(:puts).once.with(250)
|
16
|
+
end
|
17
|
+
|
18
|
+
teardown do
|
19
|
+
@output.unstub(:puts)
|
20
|
+
end
|
21
|
+
|
22
|
+
should "emit start message" do
|
16
23
|
result = @clock.do_start
|
17
24
|
assert result
|
18
|
-
@output.unstub(:puts)
|
19
25
|
end
|
20
26
|
|
21
27
|
end
|
22
28
|
|
23
29
|
context "#do_stop" do
|
24
30
|
|
25
|
-
|
31
|
+
setup do
|
26
32
|
@output.expects(:puts).once.with(252)
|
33
|
+
end
|
34
|
+
|
35
|
+
teardown do
|
36
|
+
@output.unstub(:puts)
|
37
|
+
end
|
38
|
+
|
39
|
+
should "emit stop message" do
|
27
40
|
result = @clock.do_stop
|
28
41
|
assert result
|
29
|
-
@output.unstub(:puts)
|
30
42
|
end
|
31
43
|
|
32
44
|
end
|
33
45
|
|
34
46
|
context "#do_clock" do
|
35
47
|
|
36
|
-
|
48
|
+
setup do
|
37
49
|
@output.expects(:puts).once.with(248)
|
50
|
+
end
|
51
|
+
|
52
|
+
teardown do
|
53
|
+
@output.unstub(:puts)
|
54
|
+
end
|
55
|
+
|
56
|
+
should "emit clock message" do
|
38
57
|
result = @clock.do_clock
|
39
58
|
assert result
|
40
|
-
@output.unstub(:puts)
|
41
59
|
end
|
42
60
|
|
43
61
|
end
|
@@ -45,6 +63,3 @@ class Topaz::MIDIClockOutputTest < Test::Unit::TestCase
|
|
45
63
|
end
|
46
64
|
|
47
65
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
|
-
class Topaz::TempoCalculatorTest < Test
|
3
|
+
class Topaz::TempoCalculatorTest < Minitest::Test
|
4
4
|
|
5
5
|
context "TempoCalculator" do
|
6
6
|
|
@@ -15,7 +15,7 @@ class Topaz::TempoCalculatorTest < Test::Unit::TestCase
|
|
15
15
|
assert_nil @calc.calculate
|
16
16
|
@calc.timestamps << 2
|
17
17
|
@calc.timestamps << 3
|
18
|
-
|
18
|
+
refute_nil @calc.calculate
|
19
19
|
end
|
20
20
|
|
21
21
|
should "limit timestamps do within the threshold" do
|
@@ -27,7 +27,7 @@ class Topaz::TempoCalculatorTest < Test::Unit::TestCase
|
|
27
27
|
should "express tempo" do
|
28
28
|
5.times { |i| @calc.timestamps << Time.now.to_f; sleep(1.0 / 24.0) }
|
29
29
|
result = @calc.calculate
|
30
|
-
|
30
|
+
refute_nil result
|
31
31
|
assert (58..62).include?(result)
|
32
32
|
end
|
33
33
|
|
@@ -36,4 +36,3 @@ class Topaz::TempoCalculatorTest < Test::Unit::TestCase
|
|
36
36
|
end
|
37
37
|
|
38
38
|
end
|
39
|
-
|
data/test/tempo_source_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
|
-
class Topaz::TempoSourceTest < Test
|
3
|
+
class Topaz::TempoSourceTest < Minitest::Test
|
4
4
|
|
5
5
|
context "TempoSource" do
|
6
6
|
|
@@ -8,18 +8,18 @@ class Topaz::TempoSourceTest < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
should "construct a timer" do
|
10
10
|
result = Topaz::TempoSource.new(120)
|
11
|
-
|
11
|
+
refute_nil result
|
12
12
|
assert_equal Topaz::Timer, result.class
|
13
13
|
end
|
14
14
|
|
15
15
|
should "construct a midi input clock" do
|
16
16
|
result = Topaz::TempoSource.new($test_device[:input])
|
17
|
-
|
17
|
+
refute_nil result
|
18
18
|
assert_equal Topaz::MIDIClockInput, result.class
|
19
19
|
end
|
20
20
|
|
21
21
|
should "throw an exception" do
|
22
|
-
|
22
|
+
assert_raises RuntimeError do
|
23
23
|
Topaz::TempoSource.new("something")
|
24
24
|
end
|
25
25
|
end
|
@@ -29,5 +29,3 @@ class Topaz::TempoSourceTest < Test::Unit::TestCase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
end
|
32
|
-
|
33
|
-
|
data/test/timer_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
|
3
|
-
class Topaz::TimerTest < Test
|
3
|
+
class Topaz::TimerTest < Minitest::Test
|
4
4
|
|
5
5
|
context "Timer" do
|
6
6
|
|
@@ -14,15 +14,16 @@ class Topaz::TimerTest < Test::Unit::TestCase
|
|
14
14
|
@event = Object.new
|
15
15
|
@timer = Topaz::Timer.new(120, :event => @event)
|
16
16
|
@timer.send(:initialize_running_state)
|
17
|
+
@event.expects(:do_clock).once.returns(true)
|
18
|
+
@event.expects(:do_tick).once.returns(true)
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
@event.
|
21
|
-
@
|
21
|
+
teardown do
|
22
|
+
@event.unstub(:do_clock)
|
23
|
+
@event.unstub(:do_tick)
|
22
24
|
end
|
23
25
|
|
24
|
-
should "fire tick
|
25
|
-
@event.expects(:do_tick).once.returns(true)
|
26
|
+
should "fire MIDI clock/tick events" do
|
26
27
|
@timer.send(:dispatch)
|
27
28
|
end
|
28
29
|
|
@@ -36,8 +37,8 @@ class Topaz::TimerTest < Test::Unit::TestCase
|
|
36
37
|
loop until @timer.running?
|
37
38
|
|
38
39
|
assert @timer.running?
|
39
|
-
|
40
|
-
|
40
|
+
refute_nil @timer.phase
|
41
|
+
refute_equal 0.0, @timer.phase
|
41
42
|
end
|
42
43
|
|
43
44
|
end
|
@@ -53,14 +54,14 @@ class Topaz::TimerTest < Test::Unit::TestCase
|
|
53
54
|
end
|
54
55
|
|
55
56
|
should "stop running" do
|
56
|
-
|
57
|
-
|
57
|
+
refute_nil @timer.phase
|
58
|
+
refute_equal 0.0, @timer.phase
|
58
59
|
@timer.stop
|
59
60
|
refute @timer.running?
|
60
61
|
end
|
61
62
|
|
62
63
|
end
|
63
|
-
|
64
|
+
|
64
65
|
context "#interval=" do
|
65
66
|
|
66
67
|
should "change interval" do
|
metadata
CHANGED
@@ -1,15 +1,95 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midi-topaz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.5'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.5.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.5'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.5.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mocha
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.1'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.1.0
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.1'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.1.0
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rake
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '10.4'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 10.4.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.4'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 10.4.2
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: shoulda-context
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.2'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.1
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.2.1
|
13
93
|
- !ruby/object:Gem::Dependency
|
14
94
|
name: gamelan
|
15
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -17,6 +97,9 @@ dependencies:
|
|
17
97
|
- - "~>"
|
18
98
|
- !ruby/object:Gem::Version
|
19
99
|
version: '0'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0.3'
|
20
103
|
type: :runtime
|
21
104
|
prerelease: false
|
22
105
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,66 +107,69 @@ dependencies:
|
|
24
107
|
- - "~>"
|
25
108
|
- !ruby/object:Gem::Version
|
26
109
|
version: '0'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0.3'
|
27
113
|
- !ruby/object:Gem::Dependency
|
28
114
|
name: midi-message
|
29
115
|
requirement: !ruby/object:Gem::Requirement
|
30
116
|
requirements:
|
31
117
|
- - "~>"
|
32
118
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
119
|
+
version: '0.4'
|
34
120
|
- - ">="
|
35
121
|
- !ruby/object:Gem::Version
|
36
|
-
version: 0.
|
122
|
+
version: 0.4.4
|
37
123
|
type: :runtime
|
38
124
|
prerelease: false
|
39
125
|
version_requirements: !ruby/object:Gem::Requirement
|
40
126
|
requirements:
|
41
127
|
- - "~>"
|
42
128
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0.
|
129
|
+
version: '0.4'
|
44
130
|
- - ">="
|
45
131
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
132
|
+
version: 0.4.4
|
47
133
|
- !ruby/object:Gem::Dependency
|
48
134
|
name: midi-eye
|
49
135
|
requirement: !ruby/object:Gem::Requirement
|
50
136
|
requirements:
|
51
137
|
- - "~>"
|
52
138
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0.
|
139
|
+
version: '0.3'
|
54
140
|
- - ">="
|
55
141
|
- !ruby/object:Gem::Version
|
56
|
-
version: 0.
|
142
|
+
version: 0.3.7
|
57
143
|
type: :runtime
|
58
144
|
prerelease: false
|
59
145
|
version_requirements: !ruby/object:Gem::Requirement
|
60
146
|
requirements:
|
61
147
|
- - "~>"
|
62
148
|
- !ruby/object:Gem::Version
|
63
|
-
version: '0.
|
149
|
+
version: '0.3'
|
64
150
|
- - ">="
|
65
151
|
- !ruby/object:Gem::Version
|
66
|
-
version: 0.
|
152
|
+
version: 0.3.7
|
67
153
|
- !ruby/object:Gem::Dependency
|
68
154
|
name: unimidi
|
69
155
|
requirement: !ruby/object:Gem::Requirement
|
70
156
|
requirements:
|
71
157
|
- - "~>"
|
72
158
|
- !ruby/object:Gem::Version
|
73
|
-
version: '0.
|
159
|
+
version: '0.4'
|
74
160
|
- - ">="
|
75
161
|
- !ruby/object:Gem::Version
|
76
|
-
version: 0.
|
162
|
+
version: 0.4.6
|
77
163
|
type: :runtime
|
78
164
|
prerelease: false
|
79
165
|
version_requirements: !ruby/object:Gem::Requirement
|
80
166
|
requirements:
|
81
167
|
- - "~>"
|
82
168
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0.
|
169
|
+
version: '0.4'
|
84
170
|
- - ">="
|
85
171
|
- !ruby/object:Gem::Version
|
86
|
-
version: 0.
|
172
|
+
version: 0.4.6
|
87
173
|
description: A flexible tempo source that is capable of synchronizing with MIDI clocks.
|
88
174
|
email:
|
89
175
|
- ari.russo@gmail.com
|