basic-sequencer 0.0.4 → 0.0.5
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/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
|