musa-dsl 0.22.3 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|