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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/lib/musa-dsl.rb +14 -8
  4. data/lib/musa-dsl/core-ext/deep-copy.rb +12 -1
  5. data/lib/musa-dsl/core-ext/inspect-nice.rb +1 -2
  6. data/lib/musa-dsl/core-ext/smart-proc-binder.rb +13 -11
  7. data/lib/musa-dsl/datasets/p.rb +41 -16
  8. data/lib/musa-dsl/datasets/score/to-mxml/process-pdv.rb +14 -12
  9. data/lib/musa-dsl/datasets/score/to-mxml/process-ps.rb +32 -6
  10. data/lib/musa-dsl/datasets/score/to-mxml/to-mxml.rb +24 -10
  11. data/lib/musa-dsl/generative/backboner.rb +6 -11
  12. data/lib/musa-dsl/generative/generative-grammar.rb +1 -3
  13. data/lib/musa-dsl/generative/markov.rb +10 -6
  14. data/lib/musa-dsl/logger/logger.rb +6 -1
  15. data/lib/musa-dsl/matrix/matrix.rb +9 -7
  16. data/lib/musa-dsl/midi/midi-voices.rb +8 -7
  17. data/lib/musa-dsl/music/scales.rb +1 -1
  18. data/lib/musa-dsl/neumalang/neumalang.rb +1 -1
  19. data/lib/musa-dsl/neumas/array-to-neumas.rb +1 -1
  20. data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-helper.rb +9 -4
  21. data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-timed.rb +30 -129
  22. data/lib/musa-dsl/sequencer/base-sequencer-implementation.rb +10 -24
  23. data/lib/musa-dsl/sequencer/base-sequencer-tick-based.rb +9 -9
  24. data/lib/musa-dsl/sequencer/base-sequencer-tickless-based.rb +3 -5
  25. data/lib/musa-dsl/sequencer/base-sequencer.rb +14 -23
  26. data/lib/musa-dsl/sequencer/sequencer-dsl.rb +9 -7
  27. data/lib/musa-dsl/sequencer/sequencer.rb +7 -0
  28. data/lib/musa-dsl/series/base-series.rb +293 -144
  29. data/lib/musa-dsl/series/buffer-serie.rb +237 -0
  30. data/lib/musa-dsl/series/hash-or-array-serie-splitter.rb +136 -105
  31. data/lib/musa-dsl/series/main-serie-constructors.rb +251 -156
  32. data/lib/musa-dsl/series/main-serie-operations.rb +308 -303
  33. data/lib/musa-dsl/series/proxy-serie.rb +21 -41
  34. data/lib/musa-dsl/series/quantizer-serie.rb +44 -46
  35. data/lib/musa-dsl/series/queue-serie.rb +39 -43
  36. data/lib/musa-dsl/series/series-composer.rb +149 -0
  37. data/lib/musa-dsl/series/series.rb +6 -3
  38. data/lib/musa-dsl/series/timed-serie.rb +343 -0
  39. data/musa-dsl.gemspec +13 -3
  40. metadata +10 -11
  41. data/lib/musa-dsl/series/flattener-timed-serie.rb +0 -61
  42. data/lib/musa-dsl/series/holder-serie.rb +0 -87
  43. 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