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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 69fcf47b967d669ca28420c35c71dd4a642229da
4
- data.tar.gz: 96e296ed53e0f27a539dcfb8f32a9ebf461fc519
3
+ metadata.gz: 4893d5a6b3ec06799900f1b5b4e53303d35bc6c8
4
+ data.tar.gz: 943da273874a7d6f9ad2b38b9a34fa6ae4300eb3
5
5
  SHA512:
6
- metadata.gz: 79b566c5927160eead43d655a1a06c08eea322f63b6ec12bb1bcbf5ed64cfd48ad75aaa9210107829ef39fac244a42f6350278cd9fe3cc96d4084de9bc03d303
7
- data.tar.gz: dae58578dc14438b6133954e076679ad6bad8da0606ece4b222cf3488a80b7b934997ca93ffda0693425a8983f0e9286d0267ba5adb47da185e590e8c2286512
6
+ metadata.gz: 3bf48f0045b0f43c72f76ab778d0cafd1055cbafec7049eafa152ba036befeba9ffda0ba377b435ef4c9d50e22a6c485166d4447735602acd4da0aa17ca1fa13
7
+ data.tar.gz: 19668ba5050d6410ffada46a86282d6537beb6fc46b95bbcd9d422b1fad40107a62fae3459585cd28eb17694ef83155a83c2c0bbe4c4ce5d697373c3bd7a464c
data/lib/sequencer.rb CHANGED
@@ -19,6 +19,6 @@ require "sequencer/loop"
19
19
 
20
20
  module Sequencer
21
21
 
22
- VERSION = "0.0.4"
22
+ VERSION = "0.0.5"
23
23
 
24
24
  end
@@ -20,7 +20,7 @@ module Sequencer
20
20
  perform(sequence) && step(sequence)
21
21
  end
22
22
 
23
- # Step the sequencer and fire the step event
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
- # If a stop is triggered, stop. Otherwise if reset is triggered, reset. Finally,
37
- # fire the perform event on the current step of the sequence
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] True if perform event was fired
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)
@@ -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
- hash
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.each(&:call)
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
- !@step.empty? && @step.map(:call)
56
+ @step.map(&:call)
47
57
  end
48
58
 
49
59
  # Access the stop events
@@ -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
- def in_bounds?(num, options = {})
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?(num)
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)
@@ -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
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-15 00:00:00.000000000 Z
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