musa-dsl 0.23.11 → 0.23.13
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/musa-dsl/datasets/gdv.rb +2 -2
- data/lib/musa-dsl/datasets/gdvd.rb +2 -1
- data/lib/musa-dsl/datasets/helper.rb +1 -1
- data/lib/musa-dsl/datasets/score/queriable.rb +43 -42
- data/lib/musa-dsl/datasets/score/render.rb +24 -20
- data/lib/musa-dsl/datasets/score/to-mxml/to-mxml.rb +120 -122
- data/lib/musa-dsl/generative/backboner.rb +2 -2
- data/lib/musa-dsl/generative/generative-grammar.rb +2 -0
- data/lib/musa-dsl/generative/markov.rb +1 -2
- data/lib/musa-dsl/generative/variatio.rb +6 -10
- data/lib/musa-dsl/logger/logger.rb +22 -22
- data/lib/musa-dsl/matrix/matrix.rb +3 -5
- data/lib/musa-dsl/midi/midi-recorder.rb +3 -4
- data/lib/musa-dsl/midi/midi-voices.rb +3 -3
- data/lib/musa-dsl/music/chords.rb +26 -29
- data/lib/musa-dsl/musicxml/builder/direction.rb +2 -2
- data/lib/musa-dsl/neumalang/neumalang.rb +25 -67
- data/lib/musa-dsl/neumas/array-to-neumas.rb +2 -2
- data/lib/musa-dsl/repl/repl.rb +1 -1
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-every.rb +8 -8
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-move.rb +49 -49
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-helper.rb +2 -2
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-timed.rb +2 -2
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play.rb +2 -2
- data/lib/musa-dsl/sequencer/base-sequencer-implementation.rb +2 -2
- data/lib/musa-dsl/sequencer/base-sequencer-tick-based.rb +4 -3
- data/lib/musa-dsl/sequencer/base-sequencer.rb +5 -5
- data/lib/musa-dsl/series/array-to-serie.rb +5 -3
- data/lib/musa-dsl/series/base-series.rb +2 -2
- data/lib/musa-dsl/series/buffer-serie.rb +0 -5
- data/lib/musa-dsl/series/main-serie-constructors.rb +6 -4
- data/lib/musa-dsl/series/main-serie-operations.rb +2 -2
- data/lib/musa-dsl/series/quantizer-serie.rb +46 -50
- data/lib/musa-dsl/series/series-composer.rb +6 -5
- data/lib/musa-dsl/series/timed-serie.rb +49 -48
- data/lib/musa-dsl/transcription/from-gdv-to-midi.rb +5 -7
- data/lib/musa-dsl/transcription/from-gdv-to-musicxml.rb +1 -4
- data/lib/musa-dsl/transcription/from-gdv.rb +1 -3
- data/lib/musa-dsl/transcription/transcription.rb +2 -4
- data/lib/musa-dsl/transport/input-midi-clock.rb +7 -4
- data/lib/musa-dsl/transport/transport.rb +10 -12
- data/lib/musa-dsl.rb +1 -1
- data/musa-dsl.gemspec +2 -2
- metadata +2 -2
@@ -7,7 +7,7 @@ module Musa
|
|
7
7
|
refine Array do
|
8
8
|
def to_neumas
|
9
9
|
if length > 1
|
10
|
-
MERGE(*collect { |e| convert_to_neumas(e) })
|
10
|
+
Musa::Series::Constructors.MERGE(*collect { |e| convert_to_neumas(e) })
|
11
11
|
else
|
12
12
|
convert_to_neumas(first)
|
13
13
|
end
|
@@ -21,7 +21,7 @@ module Musa
|
|
21
21
|
def convert_to_neumas(e)
|
22
22
|
case e
|
23
23
|
when Musa::Neumas::Neuma::Serie then e
|
24
|
-
when Musa::Neumas::Neuma::Parallel then S(e).extend(Musa::Neumas::Neuma::Serie)
|
24
|
+
when Musa::Neumas::Neuma::Parallel then Musa::Series::Constructors.S(e).extend(Musa::Neumas::Neuma::Serie)
|
25
25
|
when String then e.to_neumas
|
26
26
|
else
|
27
27
|
raise ArgumentError, "Don't know how to convert to neumas #{e}"
|
data/lib/musa-dsl/repl/repl.rb
CHANGED
@@ -13,7 +13,7 @@ module Musa
|
|
13
13
|
@block_source = nil
|
14
14
|
|
15
15
|
if binder.receiver.respond_to?(:sequencer) &&
|
16
|
-
|
16
|
+
binder.receiver.sequencer.respond_to?(:on_error)
|
17
17
|
|
18
18
|
binder.receiver.sequencer.on_error do |e|
|
19
19
|
send_exception e, output: @connection
|
@@ -10,8 +10,9 @@ module Musa::Sequencer
|
|
10
10
|
control._start_position ||= position
|
11
11
|
control._execution_counter ||= 0
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
if interval && control.duration_value
|
14
|
+
duration_exceeded = (control._start_position + control.duration_value - interval) <= position
|
15
|
+
end
|
15
16
|
|
16
17
|
till_exceeded = control.till_value - interval <= position if interval && control.till_value
|
17
18
|
|
@@ -23,17 +24,16 @@ module Musa::Sequencer
|
|
23
24
|
end
|
24
25
|
|
25
26
|
|
26
|
-
|
27
|
-
_numeric_at control._start_position + control._execution_counter * interval, control do
|
28
|
-
_every interval, control, block_procedure_binder: block_procedure_binder
|
29
|
-
end
|
30
|
-
|
31
|
-
else
|
27
|
+
if control.stopped? || duration_exceeded || till_exceeded || condition_failed || interval.nil?
|
32
28
|
control.do_on_stop.each(&:call)
|
33
29
|
|
34
30
|
control.do_after.each do |do_after|
|
35
31
|
_numeric_at position + (interval || 0) + do_after[:bars], control, &do_after[:block]
|
36
32
|
end
|
33
|
+
else
|
34
|
+
_numeric_at control._start_position + control._execution_counter * interval, control do
|
35
|
+
_every interval, control, block_procedure_binder: block_procedure_binder
|
36
|
+
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require_relative '../core-ext/arrayfy'
|
2
2
|
require_relative '../core-ext/inspect-nice'
|
3
3
|
|
4
|
-
using Musa::Extension::Arrayfy
|
5
|
-
using Musa::Extension::InspectNice
|
6
|
-
|
7
4
|
module Musa::Sequencer
|
8
5
|
class BaseSequencer
|
6
|
+
using Musa::Extension::Arrayfy
|
7
|
+
using Musa::Extension::InspectNice
|
8
|
+
|
9
9
|
private def _move(every: nil,
|
10
10
|
from:, to: nil,
|
11
11
|
step: nil,
|
@@ -110,11 +110,11 @@ module Musa::Sequencer
|
|
110
110
|
steps = (to[i] - from[i]) / step[i]
|
111
111
|
|
112
112
|
# When to == from don't need to do any iteration with every
|
113
|
-
if steps + right_open_offset[i] > 0
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
every[i] = if steps + right_open_offset[i] > 0
|
114
|
+
Rational(effective_duration, steps + right_open_offset[i])
|
115
|
+
else
|
116
|
+
nil
|
117
|
+
end
|
118
118
|
|
119
119
|
elsif to[i] && !step[i] && !every[i]
|
120
120
|
|
@@ -167,7 +167,7 @@ module Musa::Sequencer
|
|
167
167
|
#
|
168
168
|
# Prepare yield block, parameters to yield block and coincident moving interval groups
|
169
169
|
#
|
170
|
-
binder = SmartProcBinder.new(block)
|
170
|
+
binder = Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
|
171
171
|
|
172
172
|
every_groups = {}
|
173
173
|
group_counter = {}
|
@@ -300,46 +300,46 @@ module Musa::Sequencer
|
|
300
300
|
# Adapt values to array/hash/value mode
|
301
301
|
#
|
302
302
|
value_parameters, key_parameters =
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
303
|
+
if array_mode
|
304
|
+
binder.apply(effective_values, effective_next_values,
|
305
|
+
control: control,
|
306
|
+
duration: _durations(every_groups, effective_duration),
|
307
|
+
quantized_duration: q_durations.dup,
|
308
|
+
started_ago: _started_ago(last_position, position, process_indexes),
|
309
|
+
position_jitter: position_jitters.dup,
|
310
|
+
duration_jitter: duration_jitters.dup,
|
311
|
+
right_open: right_open.dup)
|
312
|
+
elsif hash_mode
|
313
|
+
binder.apply(_hash_from_keys_and_values(hash_keys, effective_values),
|
314
|
+
_hash_from_keys_and_values(hash_keys, effective_next_values),
|
315
|
+
control: control,
|
316
|
+
duration: _hash_from_keys_and_values(
|
317
|
+
hash_keys,
|
318
|
+
_durations(every_groups, effective_duration)),
|
319
|
+
quantized_duration: _hash_from_keys_and_values(
|
320
|
+
hash_keys,
|
321
|
+
q_durations),
|
322
|
+
started_ago: _hash_from_keys_and_values(
|
323
|
+
hash_keys,
|
324
|
+
_started_ago(last_position, position, process_indexes)),
|
325
|
+
position_jitter: _hash_from_keys_and_values(
|
326
|
+
hash_keys,
|
327
|
+
position_jitters),
|
328
|
+
duration_jitter: _hash_from_keys_and_values(
|
329
|
+
hash_keys,
|
330
|
+
duration_jitters),
|
331
|
+
right_open: _hash_from_keys_and_values(hash_keys, right_open))
|
332
|
+
else
|
333
|
+
binder.apply(effective_values.first,
|
334
|
+
effective_next_values.first,
|
335
|
+
control: control,
|
336
|
+
duration: _durations(every_groups, effective_duration).first,
|
337
|
+
quantized_duration: q_durations.first,
|
338
|
+
position_jitter: position_jitters.first,
|
339
|
+
duration_jitter: duration_jitters.first,
|
340
|
+
started_ago: nil,
|
341
|
+
right_open: right_open.first)
|
342
|
+
end
|
343
343
|
|
344
344
|
#
|
345
345
|
# Do the REAL thing
|
@@ -268,7 +268,7 @@ module Musa
|
|
268
268
|
|
269
269
|
when Array
|
270
270
|
{ current_operation: :no_eval_play,
|
271
|
-
current_parameter: S(*element) }
|
271
|
+
current_parameter: Musa::Series::Constructors.S(*element) }
|
272
272
|
else
|
273
273
|
case element[:kind]
|
274
274
|
when :value
|
@@ -292,7 +292,7 @@ module Musa
|
|
292
292
|
|
293
293
|
if _value.is_a?(Array)
|
294
294
|
{ current_operation: :no_eval_play,
|
295
|
-
current_parameter: S(*_value) }
|
295
|
+
current_parameter: Musa::Series::Constructors.S(*_value) }
|
296
296
|
else
|
297
297
|
{ current_operation: :block,
|
298
298
|
current_parameter: _value,
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require_relative '../core-ext/inspect-nice'
|
2
2
|
|
3
|
-
using Musa::Extension::InspectNice
|
4
|
-
|
5
3
|
module Musa::Sequencer
|
6
4
|
class BaseSequencer
|
5
|
+
using Musa::Extension::InspectNice
|
6
|
+
|
7
7
|
private def _play_timed(timed_serie, control, &block)
|
8
8
|
|
9
9
|
if first_value_sample = timed_serie.peek_next_value
|
@@ -18,8 +18,8 @@ module Musa::Sequencer
|
|
18
18
|
|
19
19
|
__play_eval ||= PlayEval.create \
|
20
20
|
mode,
|
21
|
-
SmartProcBinder.new(block,
|
22
|
-
|
21
|
+
Musa::Extension::SmartProcBinder::SmartProcBinder.new(block,
|
22
|
+
on_rescue: proc { |e| _rescue_error(e) }),
|
23
23
|
decoder,
|
24
24
|
neumalang_context
|
25
25
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require_relative '../core-ext/smart-proc-binder'
|
2
2
|
require_relative '../core-ext/inspect-nice'
|
3
3
|
|
4
|
-
using Musa::Extension::InspectNice
|
5
|
-
|
6
4
|
module Musa::Sequencer
|
5
|
+
using Musa::Extension::InspectNice
|
6
|
+
|
7
7
|
class BaseSequencer
|
8
8
|
private def _tick(position_to_run)
|
9
9
|
@before_tick.each { |block| block.call position_to_run }
|
@@ -2,7 +2,6 @@ module Musa
|
|
2
2
|
module Sequencer
|
3
3
|
class BaseSequencer
|
4
4
|
module TickBasedTiming
|
5
|
-
|
6
5
|
using Musa::Extension::InspectNice
|
7
6
|
|
8
7
|
attr_reader :position, :ticks_per_bar, :tick_duration
|
@@ -49,9 +48,11 @@ module Musa
|
|
49
48
|
position = ticks_position.round * @tick_duration
|
50
49
|
|
51
50
|
if warn
|
52
|
-
@logger.warn('BaseSequencer')
|
51
|
+
@logger.warn('BaseSequencer') do
|
52
|
+
'_check_position: rounding ' \
|
53
53
|
"position #{original_position.inspect} (#{original_position.to_f.round(5)}) "\
|
54
|
-
"to tick precision: #{position.inspect} (#{position.to_f.round(5)})"
|
54
|
+
"to tick precision: #{position.inspect} (#{position.to_f.round(5)})"
|
55
|
+
end
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -97,19 +97,19 @@ module Musa
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def on_debug_at(&block)
|
100
|
-
@on_debug_at << SmartProcBinder.new(block)
|
100
|
+
@on_debug_at << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
|
101
101
|
end
|
102
102
|
|
103
103
|
def on_error(&block)
|
104
|
-
@on_error << SmartProcBinder.new(block)
|
104
|
+
@on_error << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
|
105
105
|
end
|
106
106
|
|
107
107
|
def on_fast_forward(&block)
|
108
|
-
@on_fast_forward << SmartProcBinder.new(block)
|
108
|
+
@on_fast_forward << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
|
109
109
|
end
|
110
110
|
|
111
111
|
def before_tick(&block)
|
112
|
-
@before_tick << SmartProcBinder.new(block)
|
112
|
+
@before_tick << Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
|
113
113
|
end
|
114
114
|
|
115
115
|
def on(event, &block)
|
@@ -132,7 +132,7 @@ module Musa
|
|
132
132
|
bars_delay = Series::S(*bars_delay) if bars_delay.is_a?(Array)
|
133
133
|
bars_delay = bars_delay.instance if bars_delay
|
134
134
|
|
135
|
-
_serie_at bars_delay.
|
135
|
+
_serie_at bars_delay.with { |delay| position + delay }, control, debug: debug, &block
|
136
136
|
end
|
137
137
|
|
138
138
|
@event_handlers.pop
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require_relative '../series'
|
2
2
|
|
3
|
+
# TODO: esto sería un refinement, no?
|
4
|
+
|
3
5
|
class Array
|
4
6
|
def to_serie(of_series: nil, recursive: nil)
|
5
7
|
of_series ||= false
|
@@ -8,11 +10,11 @@ class Array
|
|
8
10
|
raise ArgumentError, 'Cannot convert to serie of_series and recursive simultaneously' if recursive && of_series
|
9
11
|
|
10
12
|
if recursive
|
11
|
-
S(*(collect { |_| _.is_a?(Array) ? _.to_serie(recursive: true) : _ }))
|
13
|
+
Musa::Series::Constructors.S(*(collect { |_| _.is_a?(Array) ? _.to_serie(recursive: true) : _ }))
|
12
14
|
elsif of_series
|
13
|
-
S(*(collect { |_| S(*_) }))
|
15
|
+
Musa::Series::Constructors.S(*(collect { |_| Musa::Series::Constructors.S(*_) }))
|
14
16
|
else
|
15
|
-
S(*self)
|
17
|
+
Musa::Series::Constructors.S(*self)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require_relative '../core-ext/deep-copy'
|
2
2
|
require_relative '../generative/generative-grammar'
|
3
3
|
|
4
|
-
using Musa::Extension::DeepCopy
|
5
|
-
|
6
4
|
module Musa
|
7
5
|
module Series
|
8
6
|
module Constructors; extend self; end
|
@@ -338,6 +336,8 @@ module Musa
|
|
338
336
|
include Prototyping
|
339
337
|
include Operations
|
340
338
|
|
339
|
+
using Musa::Extension::DeepCopy
|
340
|
+
|
341
341
|
def init
|
342
342
|
@_have_peeked_next_value = false
|
343
343
|
@_peeked_next_value = nil
|
@@ -206,11 +206,6 @@ module Musa
|
|
206
206
|
@index -= offset
|
207
207
|
end
|
208
208
|
|
209
|
-
# private def _init
|
210
|
-
# @source.prototype.singleton._register(self) if instance?
|
211
|
-
# @index = @last_nil_index
|
212
|
-
# end
|
213
|
-
#
|
214
209
|
private def _sources_resolved
|
215
210
|
@source.singleton._register(self) if instance?
|
216
211
|
@index = @last_nil_index
|
@@ -3,13 +3,12 @@ require_relative '../core-ext/smart-proc-binder'
|
|
3
3
|
|
4
4
|
require_relative 'base-series'
|
5
5
|
|
6
|
-
using Musa::Extension::Arrayfy
|
7
|
-
using Musa::Extension::ExplodeRanges
|
8
|
-
|
9
6
|
# TODO: añadir en for: steps: (nº de pasos en los que repartir el incremento)
|
10
7
|
|
11
8
|
module Musa
|
12
9
|
module Series::Constructors
|
10
|
+
using Musa::Extension::ExplodeRanges
|
11
|
+
|
13
12
|
def UNDEFINED
|
14
13
|
UndefinedSerie.new
|
15
14
|
end
|
@@ -119,7 +118,8 @@ module Musa
|
|
119
118
|
end
|
120
119
|
end
|
121
120
|
|
122
|
-
|
121
|
+
# UndefinedSerie is not private because is used in Composer
|
122
|
+
# private_constant :UndefinedSerie
|
123
123
|
|
124
124
|
class NilSerie
|
125
125
|
include Series::Serie.base
|
@@ -136,6 +136,8 @@ module Musa
|
|
136
136
|
class FromArray
|
137
137
|
include Series::Serie.base
|
138
138
|
|
139
|
+
using Musa::Extension::Arrayfy
|
140
|
+
|
139
141
|
def initialize(values = nil, extends = nil)
|
140
142
|
@values = values
|
141
143
|
mark_as_prototype!
|
@@ -84,11 +84,11 @@ module Musa
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def after(*series)
|
87
|
-
|
87
|
+
Musa::Series::Constructors.MERGE self, *series
|
88
88
|
end
|
89
89
|
|
90
90
|
def +(other)
|
91
|
-
|
91
|
+
Musa::Series::Constructors.MERGE self, other
|
92
92
|
end
|
93
93
|
|
94
94
|
def cut(length)
|
@@ -4,8 +4,6 @@ require_relative '../core-ext/inspect-nice'
|
|
4
4
|
require_relative 'base-series'
|
5
5
|
|
6
6
|
# TODO remove debugging puts, intermediate hash comments on :info and InspectNice
|
7
|
-
using Musa::Extension::InspectNice
|
8
|
-
|
9
7
|
module Musa
|
10
8
|
module Series::Operations
|
11
9
|
def quantize(reference: nil, step: nil,
|
@@ -70,7 +68,7 @@ module Musa
|
|
70
68
|
time = n[0].rationalize
|
71
69
|
value = n[1].rationalize
|
72
70
|
else
|
73
|
-
raise
|
71
|
+
raise "Don't know how to process #{n}"
|
74
72
|
end
|
75
73
|
|
76
74
|
return time, value
|
@@ -115,9 +113,8 @@ module Musa
|
|
115
113
|
end
|
116
114
|
|
117
115
|
private def _next_value
|
116
|
+
i = 2
|
118
117
|
if @stops
|
119
|
-
i = 2
|
120
|
-
|
121
118
|
loop do
|
122
119
|
while @segments.size < i && process2; end
|
123
120
|
|
@@ -142,17 +139,16 @@ module Musa
|
|
142
139
|
return { time: first[:time],
|
143
140
|
@value_attribute => first[:value],
|
144
141
|
duration: durations_to_sum.sum { |_| _[:duration] } }
|
145
|
-
|
146
|
-
|
142
|
+
.extend(Musa::Datasets::AbsTimed)
|
143
|
+
.extend(Musa::Datasets::AbsD)
|
147
144
|
else
|
148
145
|
i += 1
|
149
146
|
end
|
150
147
|
end
|
151
148
|
|
152
|
-
|
149
|
+
nil
|
153
150
|
|
154
151
|
else
|
155
|
-
i = 2
|
156
152
|
# puts "\n\n"
|
157
153
|
loop do
|
158
154
|
while @segments.size < i && process2; end
|
@@ -179,8 +175,8 @@ module Musa
|
|
179
175
|
return { time: first[:time],
|
180
176
|
@value_attribute => first[:value],
|
181
177
|
duration: durations_to_sum.sum { |_| _[:duration] } }
|
182
|
-
|
183
|
-
|
178
|
+
.extend(Musa::Datasets::AbsTimed)
|
179
|
+
.extend(Musa::Datasets::AbsD)
|
184
180
|
else
|
185
181
|
i += 1
|
186
182
|
end
|
@@ -211,7 +207,7 @@ module Musa
|
|
211
207
|
|
212
208
|
# puts "process2: from_time #{from_time} from_value #{from_value} to_time #{to_time} to_value #{to_value} to_last #{to_point_is_last || 'nil'} sign #{sign}"
|
213
209
|
|
214
|
-
if sign
|
210
|
+
if sign.zero?
|
215
211
|
if @segments.last && @segments.last[:time] == from_time
|
216
212
|
|
217
213
|
@segments.last[:duration] = to_time - from_time
|
@@ -261,8 +257,8 @@ module Musa
|
|
261
257
|
|
262
258
|
loop_from_value.step(loop_to_value, step_value_increment) do |value|
|
263
259
|
if @segments.last &&
|
264
|
-
|
265
|
-
|
260
|
+
@segments.last[:time] == intermediate_point_time &&
|
261
|
+
@segments.last[:value] == value
|
266
262
|
|
267
263
|
@segments.last[:duration] = step_time_increment
|
268
264
|
@segments.last[:info] += '; edited on b'
|
@@ -294,7 +290,7 @@ module Musa
|
|
294
290
|
|
295
291
|
private def process(time, value, last_time_value)
|
296
292
|
if time && value
|
297
|
-
raise
|
293
|
+
raise 'time only can go forward' if @last_processed_time && time <= @last_processed_time
|
298
294
|
|
299
295
|
q_value = round_quantize(value)
|
300
296
|
|
@@ -399,23 +395,23 @@ module Musa
|
|
399
395
|
if @first
|
400
396
|
@first = false
|
401
397
|
|
402
|
-
if time > first_time
|
403
|
-
|
398
|
+
result = if time > first_time
|
399
|
+
{ time: first_time,
|
404
400
|
@value_attribute => round_to_nearest_quantize(first_value, value),
|
405
401
|
duration: time - first_time }
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
402
|
+
.extend(Musa::Datasets::AbsD)
|
403
|
+
.extend(Musa::Datasets::AbsTimed)
|
404
|
+
else
|
405
|
+
_next_value
|
406
|
+
end
|
411
407
|
else
|
412
408
|
if @crossings[1]
|
413
409
|
next_time = @crossings[1][:time]
|
414
410
|
result = { time: time,
|
415
411
|
@value_attribute => value,
|
416
412
|
duration: next_time - time }
|
417
|
-
|
418
|
-
|
413
|
+
.extend(Musa::Datasets::AbsD)
|
414
|
+
.extend(Musa::Datasets::AbsTimed)
|
419
415
|
|
420
416
|
@crossings.shift
|
421
417
|
|
@@ -424,8 +420,8 @@ module Musa
|
|
424
420
|
result = { time: @crossings[0][:time],
|
425
421
|
@value_attribute => @crossings[0][@value_attribute],
|
426
422
|
duration: @last_time - @crossings[0][:time] }
|
427
|
-
|
428
|
-
|
423
|
+
.extend(Musa::Datasets::AbsD)
|
424
|
+
.extend(Musa::Datasets::AbsTimed)
|
429
425
|
|
430
426
|
@last_time = nil
|
431
427
|
end
|
@@ -436,8 +432,8 @@ module Musa
|
|
436
432
|
result = { time: first_time,
|
437
433
|
value: round_to_nearest_quantize(first_value),
|
438
434
|
duration: @last_time - first_time }
|
439
|
-
|
440
|
-
|
435
|
+
.extend(Musa::Datasets::AbsD)
|
436
|
+
.extend(Musa::Datasets::AbsTimed)
|
441
437
|
|
442
438
|
@first = false
|
443
439
|
@last_time = false
|
@@ -453,8 +449,8 @@ module Musa
|
|
453
449
|
if @last_time.nil? || c[:time] > @last_time
|
454
450
|
|
455
451
|
if c[:stop] &&
|
456
|
-
|
457
|
-
|
452
|
+
@crossings.dig(-1, :stop) &&
|
453
|
+
@crossings.dig(-1, @value_attribute) == c[@value_attribute]
|
458
454
|
|
459
455
|
c[:stops] = (@crossings[-1][:stops] || 0) + 1
|
460
456
|
|
@@ -473,7 +469,7 @@ module Musa
|
|
473
469
|
from_time, from_value = get_time_value(@source.next_value)
|
474
470
|
|
475
471
|
if from_time && from_value
|
476
|
-
raise
|
472
|
+
raise 'time only can go forward' if @last_time && from_time <= @last_time
|
477
473
|
|
478
474
|
@last_time = from_time
|
479
475
|
|
@@ -500,36 +496,36 @@ module Musa
|
|
500
496
|
delta_time = to_time - from_time
|
501
497
|
|
502
498
|
crossings =
|
503
|
-
|
504
|
-
|
499
|
+
from_step.step(last_step, sign).collect do |i|
|
500
|
+
value = @crossing_reference + i * @step_size
|
505
501
|
|
506
|
-
|
507
|
-
|
508
|
-
|
502
|
+
{ time: from_time + (delta_time / delta_value) * (value - from_value),
|
503
|
+
@value_attribute => value + sign * @halfway_offset }
|
504
|
+
end
|
509
505
|
|
510
506
|
if @include_stops
|
511
507
|
first_crossing_time = crossings.dig(0, :time)
|
512
508
|
last_crossing_time = crossings.dig(-1, :time)
|
513
509
|
|
514
|
-
if first_crossing_time.nil? || from_time < first_crossing_time
|
515
|
-
|
510
|
+
stop_before = if first_crossing_time.nil? || from_time < first_crossing_time
|
511
|
+
[ { time: from_time,
|
516
512
|
@value_attribute =>
|
517
|
-
|
518
|
-
|
513
|
+
round_to_nearest_quantize(from_value,
|
514
|
+
crossings.dig(0, @value_attribute)),
|
519
515
|
stop: true } ]
|
520
|
-
|
521
|
-
|
522
|
-
|
516
|
+
else
|
517
|
+
[]
|
518
|
+
end
|
523
519
|
|
524
|
-
if last_crossing_time.nil? || to_time > last_crossing_time
|
525
|
-
|
520
|
+
stop_after = if last_crossing_time.nil? || to_time > last_crossing_time
|
521
|
+
[ { time: to_time,
|
526
522
|
@value_attribute =>
|
527
|
-
|
528
|
-
|
523
|
+
round_to_nearest_quantize(to_value,
|
524
|
+
crossings.dig(-1, @value_attribute)),
|
529
525
|
stop: true } ]
|
530
|
-
|
531
|
-
|
532
|
-
|
526
|
+
else
|
527
|
+
[]
|
528
|
+
end
|
533
529
|
|
534
530
|
stop_before + crossings + stop_after
|
535
531
|
else
|