basic-sequencer 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sequencer.rb +1 -1
- data/lib/sequencer/core.rb +11 -4
- data/lib/sequencer/event.rb +15 -5
- data/lib/sequencer/loop.rb +19 -2
- data/test/event_test.rb +180 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4893d5a6b3ec06799900f1b5b4e53303d35bc6c8
|
4
|
+
data.tar.gz: 943da273874a7d6f9ad2b38b9a34fa6ae4300eb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bf48f0045b0f43c72f76ab778d0cafd1055cbafec7049eafa152ba036befeba9ffda0ba377b435ef4c9d50e22a6c485166d4447735602acd4da0aa17ca1fa13
|
7
|
+
data.tar.gz: 19668ba5050d6410ffada46a86282d6537beb6fc46b95bbcd9d422b1fad40107a62fae3459585cd28eb17694ef83155a83c2c0bbe4c4ce5d697373c3bd7a464c
|
data/lib/sequencer.rb
CHANGED
data/lib/sequencer/core.rb
CHANGED
@@ -20,7 +20,7 @@ module Sequencer
|
|
20
20
|
perform(sequence) && step(sequence)
|
21
21
|
end
|
22
22
|
|
23
|
-
# Step the sequencer and fire
|
23
|
+
# Step the sequencer and fire Event#step event
|
24
24
|
# @param [Array] sequence
|
25
25
|
# @return [Boolean]
|
26
26
|
def step(sequence)
|
@@ -33,10 +33,17 @@ module Sequencer
|
|
33
33
|
true
|
34
34
|
end
|
35
35
|
|
36
|
-
#
|
37
|
-
#
|
36
|
+
# Represents performance of a single sequence frame
|
37
|
+
#
|
38
|
+
# Order of events:
|
39
|
+
#
|
40
|
+
# 1. If Event#next for the current pointer, fire
|
41
|
+
# 2. If EventTrigger#stop, fire Event#stop, otherwise:
|
42
|
+
# 3. If EventTrigger#reset, fire Event#reset
|
43
|
+
# 4. Fire Event#perform with the sequence frame
|
44
|
+
#
|
38
45
|
# @param [Array] sequence
|
39
|
-
# @return [Boolean]
|
46
|
+
# @return [Boolean] Whether Event#perform event was fired
|
40
47
|
def perform(sequence)
|
41
48
|
data = sequence.at(@pointer)
|
42
49
|
@event.do_next(@pointer, data) if @event.next?(@pointer)
|
data/lib/sequencer/event.rb
CHANGED
@@ -10,23 +10,33 @@ module Sequencer
|
|
10
10
|
@stop = []
|
11
11
|
end
|
12
12
|
|
13
|
+
# Fire an event the next time the pointer reaches the given number
|
14
|
+
# @param [Fixnum, nil] pointer The pointer number when the callback should be fired. If nil, it will be fired whenever Event#do_next is called.
|
15
|
+
# @param [Proc] block
|
16
|
+
# @return [Array<Proc>]
|
13
17
|
def next(pointer = nil, &block)
|
18
|
+
@next[pointer] ||= []
|
14
19
|
if block_given?
|
15
|
-
@next[pointer]
|
20
|
+
@next[pointer].clear
|
16
21
|
@next[pointer] << block
|
17
22
|
end
|
18
|
-
|
23
|
+
@next[pointer]
|
19
24
|
end
|
20
25
|
|
26
|
+
# Whether any callbacks exist for the given pointer (or nil)
|
27
|
+
# @param [Fixnum, nil] pointer
|
28
|
+
# @return [Boolean]
|
21
29
|
def next?(pointer = nil)
|
22
30
|
!@next[pointer].nil?
|
23
31
|
end
|
24
32
|
|
33
|
+
# @param [Fixnum, nil] pointer The pointer number (or nil) to fire callbacks for.
|
34
|
+
# @param [Object] data The data for the current pointer
|
35
|
+
# @return [Array<Object>]
|
25
36
|
def do_next(pointer, data)
|
26
37
|
keys = [pointer, nil]
|
27
38
|
callbacks = keys.map { |key| @next.delete(key) }.flatten.compact
|
28
|
-
callbacks.
|
29
|
-
true
|
39
|
+
callbacks.map(&:call)
|
30
40
|
end
|
31
41
|
|
32
42
|
# Set the step event
|
@@ -43,7 +53,7 @@ module Sequencer
|
|
43
53
|
# Fire the step events
|
44
54
|
# @return [Boolean]
|
45
55
|
def do_step
|
46
|
-
|
56
|
+
@step.map(&:call)
|
47
57
|
end
|
48
58
|
|
49
59
|
# Access the stop events
|
data/lib/sequencer/loop.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Sequencer
|
2
2
|
|
3
|
+
# Define a looping behavior for the sequencer
|
3
4
|
class Loop
|
4
5
|
|
5
6
|
attr_reader :count, :range
|
@@ -17,35 +18,51 @@ module Sequencer
|
|
17
18
|
@range = to_range(value)
|
18
19
|
end
|
19
20
|
|
21
|
+
# The starting pointer position for this loop. For the default loop, position is 0
|
22
|
+
# @return [Fixnum]
|
20
23
|
def start
|
21
24
|
default? ? 0 : @range.begin
|
22
25
|
end
|
23
26
|
|
27
|
+
# Mark a completed loop and return the start position
|
28
|
+
# @return [Fixnum] The loop start position (see Loop#start)
|
24
29
|
def next
|
25
30
|
@count += 1
|
26
31
|
start
|
27
32
|
end
|
28
33
|
|
34
|
+
# Is this a default loop? The default loops around the start and end of the sequence
|
35
|
+
# @return [Boolean]
|
29
36
|
def default?
|
30
37
|
@range.nil?
|
31
38
|
end
|
32
39
|
|
40
|
+
# Is looping disabled?
|
41
|
+
# @return [Boolean]
|
33
42
|
def disabled?
|
34
43
|
@is_disabled
|
35
44
|
end
|
36
45
|
|
46
|
+
# Disable looping
|
47
|
+
# @return [Boolean]
|
37
48
|
def disable
|
38
49
|
@is_disabled = true
|
39
50
|
end
|
40
51
|
|
41
|
-
|
52
|
+
# Is the given pointer position in bounds of the loop?
|
53
|
+
# @param [Fixnum] pointer The pointer position to compare bounds to
|
54
|
+
# @param [Hash] options
|
55
|
+
# @option options [Fixnum] :length The sequence length (required if default loop is being used)
|
56
|
+
# @return [Boolean]
|
57
|
+
def in_bounds?(pointer, options = {})
|
42
58
|
length = options[:length]
|
43
59
|
range = default? ? 0..(length-1) : @range
|
44
|
-
range.include?(
|
60
|
+
range.include?(pointer)
|
45
61
|
end
|
46
62
|
|
47
63
|
private
|
48
64
|
|
65
|
+
# Convert the given value to a range
|
49
66
|
# @param [Array<Fixnum>, Fixnum, Range] value
|
50
67
|
# @return [FalseClass, Range]
|
51
68
|
def to_range(value)
|
data/test/event_test.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class Sequencer::EventTriggerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "EventTrigger" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@trigger = Sequencer::Event.new
|
9
|
+
@cache = []
|
10
|
+
end
|
11
|
+
|
12
|
+
context "#next" do
|
13
|
+
|
14
|
+
should "fire callback" do
|
15
|
+
@trigger.next(3) do |p, d|
|
16
|
+
@cache << d
|
17
|
+
end
|
18
|
+
assert @cache.empty?
|
19
|
+
assert @trigger.next?(3)
|
20
|
+
refute @trigger.next?(2)
|
21
|
+
@trigger.do_next(3, true)
|
22
|
+
refute @cache.empty?
|
23
|
+
assert_equal 1, @cache.size
|
24
|
+
end
|
25
|
+
|
26
|
+
should "replace callback" do
|
27
|
+
@trigger.next(3) do |p, d|
|
28
|
+
@cache << d
|
29
|
+
end
|
30
|
+
assert @trigger.next?(3)
|
31
|
+
@trigger.next(3) do |p, d|
|
32
|
+
@cache << d
|
33
|
+
end
|
34
|
+
assert @cache.empty?
|
35
|
+
assert @trigger.next?(3)
|
36
|
+
refute @trigger.next?(2)
|
37
|
+
@trigger.do_next(3, true)
|
38
|
+
refute @cache.empty?
|
39
|
+
assert_equal 1, @cache.size
|
40
|
+
end
|
41
|
+
|
42
|
+
should "add callback" do
|
43
|
+
3.times do
|
44
|
+
@trigger.next(3) << proc do |p, d|
|
45
|
+
@cache << d
|
46
|
+
end
|
47
|
+
end
|
48
|
+
assert @cache.empty?
|
49
|
+
assert @trigger.next?(3)
|
50
|
+
refute @trigger.next?(2)
|
51
|
+
@trigger.do_next(3, true)
|
52
|
+
refute @cache.empty?
|
53
|
+
assert_equal 3, @cache.size
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
context "#perform" do
|
59
|
+
|
60
|
+
should "fire callback" do
|
61
|
+
@trigger.perform do |d|
|
62
|
+
@cache << d
|
63
|
+
end
|
64
|
+
assert @cache.empty?
|
65
|
+
@trigger.do_perform(true)
|
66
|
+
refute @cache.empty?
|
67
|
+
assert_equal 1, @cache.size
|
68
|
+
end
|
69
|
+
|
70
|
+
should "replace callback" do
|
71
|
+
@trigger.perform do |d|
|
72
|
+
@cache << d
|
73
|
+
end
|
74
|
+
@trigger.perform do |d|
|
75
|
+
@cache << d
|
76
|
+
end
|
77
|
+
assert @cache.empty?
|
78
|
+
@trigger.do_perform(true)
|
79
|
+
refute @cache.empty?
|
80
|
+
assert_equal 1, @cache.size
|
81
|
+
end
|
82
|
+
|
83
|
+
should "add callback" do
|
84
|
+
3.times do
|
85
|
+
@trigger.perform << proc do |p, d|
|
86
|
+
@cache << d
|
87
|
+
end
|
88
|
+
end
|
89
|
+
assert @cache.empty?
|
90
|
+
@trigger.do_perform(true)
|
91
|
+
refute @cache.empty?
|
92
|
+
assert_equal 3, @cache.size
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
context "#step" do
|
98
|
+
|
99
|
+
should "fire callback" do
|
100
|
+
@trigger.step do
|
101
|
+
@cache << true
|
102
|
+
end
|
103
|
+
assert @cache.empty?
|
104
|
+
@trigger.do_step
|
105
|
+
refute @cache.empty?
|
106
|
+
assert_equal 1, @cache.size
|
107
|
+
end
|
108
|
+
|
109
|
+
should "replace callback" do
|
110
|
+
@trigger.step do
|
111
|
+
@cache << true
|
112
|
+
end
|
113
|
+
@trigger.step do
|
114
|
+
@cache << true
|
115
|
+
end
|
116
|
+
assert @cache.empty?
|
117
|
+
@trigger.do_step
|
118
|
+
refute @cache.empty?
|
119
|
+
assert_equal 1, @cache.size
|
120
|
+
end
|
121
|
+
|
122
|
+
should "add callback" do
|
123
|
+
3.times do
|
124
|
+
@trigger.step << proc do
|
125
|
+
@cache << true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
assert @cache.empty?
|
129
|
+
@trigger.do_step
|
130
|
+
refute @cache.empty?
|
131
|
+
assert_equal 3, @cache.size
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
context "#stop" do
|
137
|
+
|
138
|
+
should "fire callback" do
|
139
|
+
@trigger.stop do
|
140
|
+
@cache << true
|
141
|
+
end
|
142
|
+
assert @cache.empty?
|
143
|
+
@trigger.do_stop
|
144
|
+
refute @cache.empty?
|
145
|
+
assert_equal 1, @cache.size
|
146
|
+
end
|
147
|
+
|
148
|
+
should "replace callback" do
|
149
|
+
@trigger.stop do
|
150
|
+
@cache << true
|
151
|
+
end
|
152
|
+
@trigger.stop do
|
153
|
+
@cache << true
|
154
|
+
end
|
155
|
+
assert @cache.empty?
|
156
|
+
@trigger.do_stop
|
157
|
+
refute @cache.empty?
|
158
|
+
assert_equal 1, @cache.size
|
159
|
+
end
|
160
|
+
|
161
|
+
should "add callback" do
|
162
|
+
3.times do
|
163
|
+
@trigger.stop << proc do
|
164
|
+
@cache << true
|
165
|
+
end
|
166
|
+
end
|
167
|
+
assert @cache.empty?
|
168
|
+
@trigger.do_stop
|
169
|
+
refute @cache.empty?
|
170
|
+
assert_equal 3, @cache.size
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
|
180
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: basic-sequencer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: midi-topaz
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/sequencer/loop.rb
|
68
68
|
- test/clock_test.rb
|
69
69
|
- test/core_test.rb
|
70
|
+
- test/event_test.rb
|
70
71
|
- test/event_trigger_test.rb
|
71
72
|
- test/helper.rb
|
72
73
|
- test/loop_test.rb
|