musa-dsl 0.22.3 → 0.23.1
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/Gemfile +3 -1
- data/lib/musa-dsl.rb +14 -8
- data/lib/musa-dsl/core-ext/deep-copy.rb +12 -1
- data/lib/musa-dsl/core-ext/inspect-nice.rb +1 -2
- data/lib/musa-dsl/core-ext/smart-proc-binder.rb +13 -11
- data/lib/musa-dsl/datasets/p.rb +41 -16
- data/lib/musa-dsl/datasets/score/to-mxml/process-pdv.rb +14 -12
- data/lib/musa-dsl/datasets/score/to-mxml/process-ps.rb +32 -6
- data/lib/musa-dsl/datasets/score/to-mxml/to-mxml.rb +24 -10
- data/lib/musa-dsl/generative/backboner.rb +6 -11
- data/lib/musa-dsl/generative/generative-grammar.rb +1 -3
- data/lib/musa-dsl/generative/markov.rb +10 -6
- data/lib/musa-dsl/logger/logger.rb +6 -1
- data/lib/musa-dsl/matrix/matrix.rb +9 -7
- data/lib/musa-dsl/midi/midi-voices.rb +8 -7
- data/lib/musa-dsl/music/scales.rb +1 -1
- data/lib/musa-dsl/neumalang/neumalang.rb +1 -1
- data/lib/musa-dsl/neumas/array-to-neumas.rb +1 -1
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-helper.rb +9 -4
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-timed.rb +30 -129
- data/lib/musa-dsl/sequencer/base-sequencer-implementation.rb +10 -24
- data/lib/musa-dsl/sequencer/base-sequencer-tick-based.rb +9 -9
- data/lib/musa-dsl/sequencer/base-sequencer-tickless-based.rb +3 -5
- data/lib/musa-dsl/sequencer/base-sequencer.rb +14 -23
- data/lib/musa-dsl/sequencer/sequencer-dsl.rb +9 -7
- data/lib/musa-dsl/sequencer/sequencer.rb +7 -0
- data/lib/musa-dsl/series/base-series.rb +293 -144
- data/lib/musa-dsl/series/buffer-serie.rb +237 -0
- data/lib/musa-dsl/series/hash-or-array-serie-splitter.rb +136 -105
- data/lib/musa-dsl/series/main-serie-constructors.rb +251 -156
- data/lib/musa-dsl/series/main-serie-operations.rb +308 -303
- data/lib/musa-dsl/series/proxy-serie.rb +21 -41
- data/lib/musa-dsl/series/quantizer-serie.rb +44 -46
- data/lib/musa-dsl/series/queue-serie.rb +39 -43
- data/lib/musa-dsl/series/series-composer.rb +149 -0
- data/lib/musa-dsl/series/series.rb +6 -3
- data/lib/musa-dsl/series/timed-serie.rb +343 -0
- data/musa-dsl.gemspec +13 -3
- metadata +10 -11
- data/lib/musa-dsl/series/flattener-timed-serie.rb +0 -61
- data/lib/musa-dsl/series/holder-serie.rb +0 -87
- data/lib/musa-dsl/series/union-timed-series.rb +0 -109
@@ -1,61 +0,0 @@
|
|
1
|
-
require_relative '../datasets/e'
|
2
|
-
|
3
|
-
module Musa
|
4
|
-
module Series
|
5
|
-
|
6
|
-
module SerieOperations
|
7
|
-
def flatten_timed
|
8
|
-
TimedFlattener.new(self)
|
9
|
-
end
|
10
|
-
|
11
|
-
class TimedFlattener
|
12
|
-
include Serie
|
13
|
-
|
14
|
-
attr_reader :source
|
15
|
-
|
16
|
-
def initialize(serie)
|
17
|
-
@source = serie
|
18
|
-
mark_regarding! @source
|
19
|
-
end
|
20
|
-
|
21
|
-
def _restart
|
22
|
-
@source.restart
|
23
|
-
end
|
24
|
-
|
25
|
-
def _next_value
|
26
|
-
source_value = @source.next_value
|
27
|
-
|
28
|
-
if !source_value.nil?
|
29
|
-
time = source_value[:time]
|
30
|
-
source_value_value = source_value[:value]
|
31
|
-
|
32
|
-
case source_value_value
|
33
|
-
when Hash
|
34
|
-
result = {}
|
35
|
-
source_value_value.each_pair do |key, value|
|
36
|
-
result[key] = { time: time, value: value }.extend(Musa::Datasets::AbsTimed)
|
37
|
-
end
|
38
|
-
when Array
|
39
|
-
result = []
|
40
|
-
source_value_value.each_index do |index|
|
41
|
-
result[index] = { time: time, value: source_value_value[index] }.extend(Musa::Datasets::AbsTimed)
|
42
|
-
end
|
43
|
-
else
|
44
|
-
raise RuntimeError, "Don't know how to handle #{source_value_value}"
|
45
|
-
end
|
46
|
-
|
47
|
-
result
|
48
|
-
else
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def infinite?
|
54
|
-
@source.infinite?
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
private_constant :TimedFlattener
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
module Musa
|
2
|
-
module Series
|
3
|
-
# TODO: adapt to series prototyping
|
4
|
-
|
5
|
-
def HOLDER(serie = nil)
|
6
|
-
Holder.new(serie)
|
7
|
-
end
|
8
|
-
|
9
|
-
class Holder
|
10
|
-
include Serie
|
11
|
-
|
12
|
-
attr_reader :hold, :next
|
13
|
-
|
14
|
-
def initialize(serie)
|
15
|
-
@hold = serie.instance if serie
|
16
|
-
@next = []
|
17
|
-
|
18
|
-
mark_as_instance!
|
19
|
-
end
|
20
|
-
|
21
|
-
def hold=(serie)
|
22
|
-
@hold = serie.instance
|
23
|
-
end
|
24
|
-
|
25
|
-
def <<(serie)
|
26
|
-
if @hold.nil?
|
27
|
-
@hold = serie.instance
|
28
|
-
else
|
29
|
-
@next << serie.instance
|
30
|
-
end
|
31
|
-
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def _prototype!
|
36
|
-
raise PrototypingSerieError, 'Cannot get prototype of a proxy serie'
|
37
|
-
end
|
38
|
-
|
39
|
-
def restart
|
40
|
-
if @next.empty? && @hold
|
41
|
-
@hold.restart
|
42
|
-
else
|
43
|
-
@hold = @next.shift
|
44
|
-
end
|
45
|
-
|
46
|
-
self
|
47
|
-
end
|
48
|
-
|
49
|
-
def current_value
|
50
|
-
@hold.current_value if @hold
|
51
|
-
end
|
52
|
-
|
53
|
-
def next_value
|
54
|
-
@hold.next_value if @hold
|
55
|
-
end
|
56
|
-
|
57
|
-
def peek_next_value
|
58
|
-
@hold.peek_next_value if @hold
|
59
|
-
end
|
60
|
-
|
61
|
-
def infinite?
|
62
|
-
@hold.infinite? if @hold
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def method_missing(method_name, *args, **key_args, &block)
|
68
|
-
if @hold && @hold.respond_to?(method_name)
|
69
|
-
@hold.send method_name, *args, **key_args, &block
|
70
|
-
else
|
71
|
-
super
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def respond_to_missing?(method_name, include_private)
|
76
|
-
@hold && @hold.respond_to?(method_name, include_private) || super
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
module SerieOperations
|
82
|
-
# TODO add test case
|
83
|
-
def hold
|
84
|
-
Series::Holder.new self
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
require_relative '../datasets/e'
|
2
|
-
|
3
|
-
module Musa
|
4
|
-
module Series
|
5
|
-
|
6
|
-
extend self
|
7
|
-
|
8
|
-
def TIMED_UNION(*timed_series)
|
9
|
-
TimedUnion.new(timed_series)
|
10
|
-
end
|
11
|
-
|
12
|
-
class TimedUnion
|
13
|
-
include Serie
|
14
|
-
|
15
|
-
attr_reader :sources
|
16
|
-
|
17
|
-
def initialize(series)
|
18
|
-
@sources = if series[0].prototype?
|
19
|
-
series.collect(&:prototype).freeze
|
20
|
-
else
|
21
|
-
series.collect(&:instance)
|
22
|
-
end
|
23
|
-
|
24
|
-
_restart false
|
25
|
-
|
26
|
-
mark_regarding! series[0]
|
27
|
-
end
|
28
|
-
|
29
|
-
private def _restart(restart_sources = true)
|
30
|
-
@sources.each { |serie| serie.restart } if restart_sources
|
31
|
-
@sources_next_values = Array.new(@sources.size)
|
32
|
-
|
33
|
-
@components = nil
|
34
|
-
@hash_mode = @array_mode = nil
|
35
|
-
end
|
36
|
-
|
37
|
-
private def _next_value
|
38
|
-
sources_values = @sources_next_values.each_index.collect do |i|
|
39
|
-
@sources_next_values[i] || (@sources_next_values[i] = @sources[i].next_value)
|
40
|
-
end
|
41
|
-
|
42
|
-
infer_components(sources_values) if !@components
|
43
|
-
|
44
|
-
time = sources_values.collect { |_| _&.[](:time) }.compact.min
|
45
|
-
|
46
|
-
if time
|
47
|
-
selected_values = sources_values.collect { |_| _ if _&.[](:time) == time }
|
48
|
-
|
49
|
-
@sources_next_values.each_index do |i|
|
50
|
-
if @sources_next_values[i]&.[](:time) == time
|
51
|
-
@sources_next_values[i] = nil
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
if @hash_mode
|
56
|
-
result = {}
|
57
|
-
elsif @array_mode
|
58
|
-
result = []
|
59
|
-
else # value mode
|
60
|
-
result = []
|
61
|
-
end
|
62
|
-
|
63
|
-
@components.each do |target_key_or_index, source_placement|
|
64
|
-
result[target_key_or_index] = selected_values.dig(*source_placement)
|
65
|
-
end
|
66
|
-
|
67
|
-
{ time: time,
|
68
|
-
value: result }
|
69
|
-
else
|
70
|
-
nil
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def infinite?
|
75
|
-
!!@sources.find(&:infinite?)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
private def infer_components(sources_values)
|
80
|
-
@components = {}
|
81
|
-
target_index = 0
|
82
|
-
|
83
|
-
sources_values.each_with_index do |source_value, i|
|
84
|
-
case source_value[:value]
|
85
|
-
when Hash
|
86
|
-
@hash_mode = true
|
87
|
-
|
88
|
-
source_value[:value].keys.each do |key|
|
89
|
-
@components[key] = [i, :value, key]
|
90
|
-
end
|
91
|
-
when Array
|
92
|
-
@array_mode = true
|
93
|
-
|
94
|
-
(0..source_value[:value].size - 1).each do |index|
|
95
|
-
@components[target_index] = [i, :value, index]
|
96
|
-
target_index += 1
|
97
|
-
end
|
98
|
-
else
|
99
|
-
@components[target_index] = [i, :value]
|
100
|
-
target_index += 1
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
raise RuntimeError, "source series values are of incompatible type (can't combine Hash and Array values)" if @array_mode && @hash_mode
|
105
|
-
end
|
106
|
-
|
107
|
-
private_constant :TimedUnion
|
108
|
-
end
|
109
|
-
end
|