musa-dsl 0.22.5 → 0.22.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77d95cd844364ae8dce08779712a34fdb0e8e349336717ffc7e49580c293b647
4
- data.tar.gz: 16b7d33203bdd273acd5f235189025fa15797e7d09a1bee498151d521c0109d3
3
+ metadata.gz: e85f0a7bc9ddbb82ea9b6b36741a87c1dc04f2feb1c10ea0f5fcb92e4dfc7a37
4
+ data.tar.gz: 13ad3537ac0a2e03c07c589174a12a8dd9af5013be79f5bd1ee769820cd94347
5
5
  SHA512:
6
- metadata.gz: bad2f753e7c62c93276dd5a019f57ff8eb2b5c23c38a20989e4dcc5f7a3a4365dfdd1532750da0cbb8dbe0a08c459fb02f8f62b0fd1246f1a5f8da8c755c49c5
7
- data.tar.gz: a7a7e3d32b7a723c206ec098585cbbad76d2ef377ad55007a722537ef0b1070a9a43a4a18740758db82167193b55e1b524e7bb7f3bdf5251e7beba1c2effd6d5
6
+ metadata.gz: 06f58c414bbbd873179850c378f3022e1bc40eba16325b787824e1cb88b27229c7ac19d08032c8b0385c792ae38324c982970dcc94c91e7fd3d924208b640aa4
7
+ data.tar.gz: 63398fc18d40799119742df1587735f9736abec4a0c1d97e9a9b29202395b6f4223cea7c01075e95d6f0ae4d752dd7297ba88c9df8c2ac7c76dea439732a8435
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.22.5'
2
+ VERSION = '0.22.6'
3
3
  end
4
4
 
5
5
  require_relative 'musa-dsl/core-ext'
@@ -12,7 +12,6 @@ module Musa
12
12
  alias to_s inspect
13
13
  end
14
14
 
15
-
16
15
  refine Rational.singleton_class do
17
16
  attr_accessor :to_s_as_inspect
18
17
  end
@@ -43,7 +42,7 @@ module Musa
43
42
  end
44
43
 
45
44
  def to_s
46
- inspect simple: true # !Rational.to_s_as_inspect
45
+ inspect simple: !Rational.to_s_as_inspect
47
46
  end
48
47
  end
49
48
  end
@@ -28,20 +28,7 @@ module Musa::Datasets
28
28
 
29
29
  base_duration ||= 1/4r # TODO review incoherence between neumalang 1/4r base duration for quarter notes and general 1r size of bar
30
30
 
31
- # TODO if instead of using clone (needed because of p.shift) we use index counter the P elements would be evaluated on the last moment
32
-
33
- Musa::Series::E(clone, base_duration, context: { time: time_start }) do |p, base_duration, context: |
34
- value = p.shift
35
-
36
- if value
37
- r = { time: context[:time], value: value } if !value.nil?
38
-
39
- delta_time = p.shift
40
- context[:time] += delta_time * base_duration if delta_time
41
-
42
- r&.extend(AbsTimed)
43
- end
44
- end
31
+ PtoTimedSerie.new(self, base_duration, time_start)
45
32
  end
46
33
 
47
34
  def map(&block)
@@ -57,5 +44,37 @@ module Musa::Datasets
57
44
  end
58
45
  end
59
46
  end
47
+
48
+ class PtoTimedSerie
49
+ include Musa::Series::Serie
50
+
51
+ attr_reader :origin
52
+
53
+ def initialize(origin, base_duration, time_start)
54
+ @origin = origin
55
+ @base_duration = base_duration
56
+ @time_start = time_start
57
+
58
+ _restart
59
+
60
+ mark_as_prototype!
61
+ end
62
+
63
+ def _restart
64
+ @p = @origin.clone
65
+ @time = @time_start
66
+ end
67
+
68
+ def _next_value
69
+ if value = @p.shift
70
+ r = { time: @time, value: value }.extend(AbsTimed)
71
+
72
+ delta_time = @p.shift
73
+ @time += delta_time * @base_duration if delta_time
74
+
75
+ r
76
+ end
77
+ end
78
+ end
60
79
  end
61
80
  end
@@ -1,9 +1,9 @@
1
1
  require 'prime'
2
2
 
3
3
  module Musa::Datasets::Score::ToMXML
4
- private
4
+ using Musa::Extension::InspectNice
5
5
 
6
- def process_pdv(measure, bar, divisions_per_bar, element, pointer, logger, do_log)
6
+ private def process_pdv(measure, bar, divisions_per_bar, element, pointer, logger, do_log)
7
7
 
8
8
  pitch, octave, sharps = pitch_and_octave_and_sharps(element[:dataset])
9
9
 
@@ -21,24 +21,26 @@ module Musa::Datasets::Score::ToMXML
21
21
  decompose_as_sum_of_simple_durations(effective_duration))
22
22
 
23
23
  if do_log
24
- logger.debug "\nprocess_pdv #{element}"
25
- logger.debug ""
26
- logger.debug " pointer #{pointer} continue_from_previous #{continue_from_previous_bar} continue_to_next #{continue_to_next_bar}"
27
- logger.debug " effective_start #{effective_start} effective_duration #{effective_duration}"
28
- logger.debug " duration decomposition #{effective_duration_decomposition}"
24
+ logger.debug ''
25
+ logger.debug('process_pdv') { "processing #{element.inspect}" }
26
+ logger.debug { "" }
27
+ logger.debug { " pointer #{pointer.inspect} continue_from_previous #{continue_from_previous_bar} continue_to_next #{continue_to_next_bar}" }
28
+ logger.debug { " effective_start #{effective_start.inspect} effective_duration #{effective_duration.inspect}" }
29
+ logger.debug { " duration decomposition #{effective_duration_decomposition}" }
29
30
  end
30
31
 
31
32
  if pointer > effective_start
32
33
  duration_to_go_back = (pointer - effective_start)
33
34
 
34
- logger.debug "\n -> adding backup #{duration_to_go_back * divisions_per_bar}" if do_log
35
+ logger.debug ''
36
+ logger.debug { " -> adding backup #{duration_to_go_back * divisions_per_bar}" } if do_log
35
37
 
36
38
  measure.add_backup(duration_to_go_back * divisions_per_bar)
37
39
  pointer -= duration_to_go_back
38
40
 
39
41
 
40
42
  elsif pointer < effective_start
41
- warn "\n -> adding start rest duration #{effective_start - pointer} start #{bar + pointer} finish #{bar + effective_start}" if do_log
43
+ logger.warn { " -> adding start rest duration #{effective_start - pointer} start #{bar + pointer} finish #{bar + effective_start}" } if do_log
42
44
 
43
45
  pointer = process_pdv(measure, bar, divisions_per_bar,
44
46
  { start: bar + pointer,
@@ -125,7 +127,7 @@ module Musa::Datasets::Score::ToMXML
125
127
  pointer
126
128
  end
127
129
 
128
- def pitch_and_octave_and_sharps(pdv)
130
+ private def pitch_and_octave_and_sharps(pdv)
129
131
  if pdv[:pitch] == :silence
130
132
  [:silence, nil, nil]
131
133
  else
@@ -143,7 +145,7 @@ module Musa::Datasets::Score::ToMXML
143
145
  end
144
146
  end
145
147
 
146
- def dynamics_index_of(midi_velocity)
148
+ private def dynamics_index_of(midi_velocity)
147
149
  return nil unless midi_velocity
148
150
 
149
151
  # ppp = midi 16 ... fff = midi 127
@@ -153,7 +155,7 @@ module Musa::Datasets::Score::ToMXML
153
155
  .index { |r| r.cover? midi_velocity.round.to_i }
154
156
  end
155
157
 
156
- def dynamics_to_string(dynamics_index)
158
+ private def dynamics_to_string(dynamics_index)
157
159
  return nil unless dynamics_index
158
160
  ['pppppp', 'ppppp', 'pppp', 'ppp', 'pp', 'p', 'mp', 'mf', 'f', 'ff', 'fff'][dynamics_index.round.to_i]
159
161
  end
@@ -1,13 +1,14 @@
1
1
  module Musa::Datasets::Score::ToMXML
2
- private
2
+ using Musa::Extension::InspectNice
3
3
 
4
4
  DynamicsContext = Struct.new(:last_dynamics)
5
5
  private_constant :DynamicsContext
6
6
 
7
- def process_ps(measure, element, context, logger, do_log)
7
+ private def process_ps(measure, element, context, logger, do_log)
8
8
  context ||= DynamicsContext.new
9
9
 
10
- logger.debug "\nprocess_ps #{element}" if do_log
10
+ logger.debug ''
11
+ logger.debug('process_ps') { "processing #{element.inspect}" } if do_log
11
12
 
12
13
  case element[:dataset][:type]
13
14
  when :crescendo, :diminuendo
@@ -15,7 +16,14 @@ module Musa::Datasets::Score::ToMXML
15
16
  dynamics = dynamics_to_string(element[:dataset][:from])
16
17
 
17
18
  if dynamics != context.last_dynamics
18
- measure.add_dynamics dynamics, placement: 'below' if dynamics && element[:dataset][:from] > 0
19
+ if dynamics
20
+ if element[:dataset][:from] < 0
21
+ logger.warn { "dynamics #{element[:dataset][:from]} not renderizable" } if do_log
22
+ elsif element[:dataset][:from] > 0
23
+ measure.add_dynamics dynamics, placement: 'below'
24
+ end
25
+ end
26
+
19
27
  context.last_dynamics = dynamics
20
28
  end
21
29
 
@@ -29,7 +37,16 @@ module Musa::Datasets::Score::ToMXML
29
37
 
30
38
  dynamics = dynamics_to_string(element[:dataset][:to])
31
39
 
32
- measure.add_dynamics dynamics, placement: 'below' if dynamics && element[:dataset][:to] > 0
40
+ if dynamics != context.last_dynamics
41
+ if dynamics
42
+ if element[:dataset][:to] < 0
43
+ logger.warn { "dynamics #{element[:dataset][:to]} not renderizable" } if do_log
44
+ elsif element[:dataset][:to] > 0
45
+ measure.add_dynamics dynamics, placement: 'below'
46
+ end
47
+ end
48
+ end
49
+
33
50
  context.last_dynamics = dynamics
34
51
  end
35
52
 
@@ -37,7 +54,16 @@ module Musa::Datasets::Score::ToMXML
37
54
  dynamics = dynamics_to_string(element[:dataset][:from])
38
55
 
39
56
  if dynamics != context.last_dynamics
40
- measure.add_dynamics dynamics, placement: 'below'
57
+
58
+
59
+ if dynamics
60
+ if element[:dataset][:from] < 0
61
+ logger.warn { "dynamics #{element[:dataset][:to]} not renderizable" } if do_log
62
+ elsif element[:dataset][:from] > 0
63
+ measure.add_dynamics dynamics, placement: 'below'
64
+ end
65
+ end
66
+
41
67
  context.last_dynamics = dynamics
42
68
  end
43
69
 
@@ -1,5 +1,6 @@
1
1
  require_relative '../../../logger'
2
2
  require_relative '../../../musicxml'
3
+ require_relative '../../../core-ext/inspect-nice'
3
4
 
4
5
  require_relative 'process-time'
5
6
  require_relative 'process-pdv'
@@ -10,6 +11,8 @@ module Musa::Datasets; class Score
10
11
  include Musa::MusicXML::Builder
11
12
  include Musa::Datasets
12
13
 
14
+ using Musa::Extension::InspectNice
15
+
13
16
  def to_mxml(beats_per_bar, ticks_per_beat,
14
17
  bpm: nil,
15
18
  title: nil,
@@ -22,7 +25,12 @@ module Musa::Datasets; class Score
22
25
  bpm ||= 90
23
26
  title ||= 'Untitled'
24
27
  creators ||= { composer: 'Unknown' }
25
- logger ||= Musa::Logger::Logger.new
28
+
29
+ if logger.nil?
30
+ logger = Musa::Logger::Logger.new
31
+ logger.debug! if do_log
32
+ end
33
+
26
34
  do_log ||= nil
27
35
 
28
36
  mxml = ScorePartwise.new do |_|
@@ -54,12 +62,16 @@ module Musa::Datasets; class Score
54
62
  end
55
63
 
56
64
  if do_log
57
- logger.debug"\nscore.to_mxl log:"
58
- logger.debug "-----------------"
65
+ logger.debug ""
66
+ logger.debug"score.to_mxml log:"
67
+ logger.debug"------------------"
59
68
  end
60
69
 
61
70
  parts.each_key do |part_id|
62
- fill_part mxml.parts[part_id], beats_per_bar * ticks_per_beat, (parts.size > 1 ? part_id : nil), logger, do_log
71
+ fill_part mxml.parts[part_id],
72
+ beats_per_bar * ticks_per_beat,
73
+ (parts.size > 1 ? part_id : nil),
74
+ logger, do_log
63
75
  end
64
76
 
65
77
  mxml
@@ -74,7 +86,7 @@ module Musa::Datasets; class Score
74
86
  (1..finish || 0).each do |bar|
75
87
  if do_log
76
88
  logger.debug ""
77
- logger.debug msg = "filling part #{part.name} (#{instrument}): processing bar #{bar}"
89
+ logger.debug msg = "filling part #{part.name} (#{instrument || 'nil'}): processing bar #{bar}"
78
90
  logger.debug "-" * msg.size
79
91
  end
80
92
 
@@ -83,7 +95,7 @@ module Musa::Datasets; class Score
83
95
 
84
96
  pointer = 0r
85
97
 
86
- instrument_score = subset { |dataset| dataset[:instrument] == instrument }
98
+ instrument_score = subset { |dataset| instrument.nil? || dataset[:instrument] == instrument }
87
99
 
88
100
  bar_elements = \
89
101
  (instrument_score.changes_between(bar, bar + 1).select { |p| p[:dataset].is_a?(PS) } +
@@ -92,7 +104,7 @@ module Musa::Datasets; class Score
92
104
  e[:dataset].is_a?(PS) ? 0 : 1 ] }
93
105
 
94
106
  if pdvs.empty?
95
- logger.debug "\nadded full bar silence" if do_log
107
+ logger.debug "\nadding full bar silence..." if do_log
96
108
 
97
109
  process_pdv(measure, bar, divisions_per_bar,
98
110
  { start: bar,
@@ -104,7 +116,7 @@ module Musa::Datasets; class Score
104
116
  else
105
117
  first = bar_elements.first
106
118
 
107
- logger.debug "\nfirst element #{first}" if do_log
119
+ logger.debug "\nfirst element #{first.inspect}" if do_log
108
120
 
109
121
  # TODO habrá que arreglar el cálculo de pointer cuando haya avances y retrocesos para que
110
122
  # TODO no añada silencios incorrectos al principio o al final
@@ -113,7 +125,7 @@ module Musa::Datasets; class Score
113
125
 
114
126
  silence_duration = first[:start_in_interval] - bar
115
127
 
116
- logger.debug "\nadded initial silence for duration #{silence_duration}" if do_log
128
+ logger.debug "\nadding initial silence for duration #{silence_duration}..." if do_log
117
129
 
118
130
  pointer = process_pdv(measure, bar, divisions_per_bar,
119
131
  { start: bar,
@@ -124,6 +136,8 @@ module Musa::Datasets; class Score
124
136
  do_log)
125
137
  end
126
138
 
139
+ logger.debug "\nadding PDV and PS elements..." if do_log
140
+
127
141
  bar_elements.each do |element|
128
142
  case element[:dataset]
129
143
  when PDV
@@ -140,7 +154,7 @@ module Musa::Datasets; class Score
140
154
  if pointer < 1r
141
155
  silence_duration = 1r - pointer
142
156
 
143
- logger.debug "\nadded ending silence for duration #{silence_duration}" if do_log
157
+ logger.debug "\nadded ending silence for duration #{silence_duration}..." if do_log
144
158
 
145
159
  process_pdv(measure, bar, divisions_per_bar,
146
160
  { start: bar + pointer,
@@ -1,7 +1,12 @@
1
1
  require 'logger'
2
2
 
3
+ require_relative '../core-ext/inspect-nice'
4
+
5
+
3
6
  module Musa; module Logger
4
7
  class Logger < ::Logger
8
+ using Musa::Extension::InspectNice
9
+
5
10
  def initialize(sequencer: nil, position_format: nil)
6
11
  super STDERR, level: WARN
7
12
 
@@ -22,7 +27,7 @@ module Musa; module Logger
22
27
 
23
28
  progname = "[#{progname}]" if progname
24
29
 
25
- "#{position}#{level}#{progname} #{msg}\n"
30
+ "#{position}#{level}#{progname}#{' ' if position || level || progname}#{msg}\n"
26
31
  else
27
32
  "\n"
28
33
  end
@@ -169,6 +169,7 @@ module Musa
169
169
  private_constant :ControllersControl
170
170
 
171
171
  class NoteControl
172
+ attr_reader :voice, :pitch, :velocity, :velocity_off, :duration
172
173
  attr_reader :start_position, :end_position
173
174
 
174
175
  def initialize(voice, pitch:, velocity: nil, duration: nil, velocity_off: nil)
@@ -303,7 +303,7 @@ module Musa
303
303
 
304
304
  def [](grade_or_symbol)
305
305
 
306
- raise ArgumentError, "grade_or_symbol '#{grade_or_symbol}' should be a Numeric, String or Symbol" unless grade_or_symbol.is_a?(Symbol) || grade_or_symbol.is_a?(String) || grade_or_symbol.is_a?(Integer)
306
+ raise ArgumentError, "grade_or_symbol '#{grade_or_symbol}' should be a Integer, String or Symbol" unless grade_or_symbol.is_a?(Symbol) || grade_or_symbol.is_a?(String) || grade_or_symbol.is_a?(Integer)
307
307
 
308
308
  wide_grade, sharps = grade_of(grade_or_symbol)
309
309
 
@@ -66,9 +66,10 @@ module Musa; module Sequencer
66
66
  end
67
67
  end
68
68
 
69
- _numeric_at start_position + _quantize_position(time, warn: false), control do
69
+ _numeric_at _quantize_position(start_position + time, warn: true), control do
70
70
  binder.call(values,
71
71
  **extra_attributes,
72
+ time: start_position + time,
72
73
  started_ago: started_ago,
73
74
  control: control)
74
75
 
@@ -9,6 +9,8 @@ module Musa; module Sequencer
9
9
  include Musa::Extension::SmartProcBinder
10
10
  include Musa::Extension::DeepCopy
11
11
 
12
+ using Musa::Extension::InspectNice
13
+
12
14
  private def _tick(position_to_run)
13
15
  @before_tick.each { |block| block.call position_to_run }
14
16
  queue = @timeslots[position_to_run]
@@ -3,6 +3,8 @@ module Musa
3
3
  class BaseSequencer
4
4
  module TickBasedTiming
5
5
 
6
+ using Musa::Extension::InspectNice
7
+
6
8
  attr_reader :position, :ticks_per_bar, :tick_duration
7
9
 
8
10
  def tick
@@ -48,8 +50,8 @@ module Musa
48
50
 
49
51
  if warn
50
52
  @logger.warn('BaseSequencer') { "_check_position: rounding "\
51
- "position #{original_position} (#{original_position.to_f.round(5)}) "\
52
- "to tick precision: #{position} (#{position.to_f.round(5)})" }
53
+ "position #{original_position.inspect} (#{original_position.to_f.round(5)}) "\
54
+ "to tick precision: #{position.inspect} (#{position.to_f.round(5)})" }
53
55
  end
54
56
  end
55
57
 
@@ -130,7 +130,7 @@ module Musa
130
130
  def peek_next_value
131
131
  raise PrototypingSerieError unless @is_instance
132
132
 
133
- unless @_have_peeked_next_value
133
+ if !@_have_peeked_next_value
134
134
  @_have_peeked_next_value = true
135
135
  @_peeked_next_value = _next_value
136
136
  end
@@ -53,7 +53,7 @@ module Musa
53
53
  end
54
54
  end
55
55
 
56
- def to_array
56
+ def to_ary
57
57
  if @proxy.array_mode?
58
58
  [].tap { |_| @proxy.components.each { |i| _[i] = self[i] } }
59
59
  else
@@ -66,6 +66,9 @@ module Musa
66
66
 
67
67
  def initialize(hash_or_array_serie)
68
68
  @source = hash_or_array_serie
69
+
70
+ infer_components
71
+
69
72
  restart restart_source: false
70
73
 
71
74
  mark_regarding! @source
@@ -76,14 +79,20 @@ module Musa
76
79
  def hash_mode?; @hash_mode; end
77
80
  def array_mode?; @array_mode; end
78
81
 
79
- protected def _instance!
80
- super
81
- restart
82
- end
82
+ def restart(key_or_index = nil, restart_source: true)
83
+ if key_or_index
84
+ @asked_to_restart[key_or_index] = true
85
+ else
86
+ @components.each { |c| @asked_to_restart[c] = true }
87
+ end
83
88
 
84
- def restart(restart_source: true)
85
- @source.restart if restart_source
89
+ if @asked_to_restart.values.all?
90
+ @source.restart if restart_source
91
+ infer_components
92
+ end
93
+ end
86
94
 
95
+ private def infer_components
87
96
  source = @source.instance
88
97
  sample = source.current_value || source.peek_next_value
89
98
 
@@ -103,10 +112,17 @@ module Musa
103
112
  @values = nil
104
113
  @array_mode = @hash_mode = false
105
114
  end
115
+
116
+ @asked_to_restart = {}
117
+
118
+ @components.each do |component|
119
+ @asked_to_restart[component] = false
120
+ end
106
121
  end
107
122
 
108
123
  def next_value(key_or_index)
109
124
  if @values[key_or_index].nil? || @values[key_or_index].empty?
125
+
110
126
  hash_or_array_value = @source.next_value
111
127
 
112
128
  case hash_or_array_value
@@ -142,7 +158,7 @@ module Musa
142
158
  end
143
159
 
144
160
  def _restart
145
- @source.restart
161
+ @source.restart @key_or_index
146
162
  end
147
163
 
148
164
  def _next_value
@@ -192,11 +192,11 @@ module Musa
192
192
  private_constant :Sequence
193
193
 
194
194
  class FromEvalBlockWithParameters
195
- using Musa::Extension::DeepCopy
196
-
197
195
  include Serie
198
196
  include Musa::Extension::SmartProcBinder
199
197
 
198
+ using Musa::Extension::DeepCopy
199
+
200
200
  attr_reader :block
201
201
 
202
202
  def initialize(*values, **key_values, &block)
@@ -222,7 +222,7 @@ module Musa
222
222
 
223
223
  def _next_value
224
224
  @value = if !@value.nil? || @value.nil? && @first
225
- @value = @block.call(*@value_parameters, last_value: @value, **@key_parameters)
225
+ @value = @block.call(*@value_parameters, last_value: @value, caller: self, **@key_parameters)
226
226
  else
227
227
  nil
228
228
  end
@@ -190,10 +190,15 @@ module Musa
190
190
  end
191
191
 
192
192
  def _next_value
193
+ previous_value = @source.current_value
193
194
  value = @source.next_value
194
195
  peek_next_value = @source.peek_next_value
195
196
 
196
- @block.call(value, peek_next_value)
197
+ if value.nil?
198
+ nil
199
+ else
200
+ @block.call(previous_value, value, peek_next_value)
201
+ end
197
202
  end
198
203
 
199
204
  def infinite?
@@ -962,7 +967,7 @@ module Musa
962
967
 
963
968
  def _next_value
964
969
  if value = @source.next_value
965
- while @block.call(value, @history)
970
+ while value && @block.call(value, @history)
966
971
  @history << value
967
972
  value = @source.next_value
968
973
  end
@@ -8,15 +8,15 @@ module Musa
8
8
  raise ArgumentError, 'Can\'t union an array of series with a hash of series' if array_of_timed_series.any? && hash_of_timed_series.any?
9
9
 
10
10
  if array_of_timed_series.any?
11
- TimedUnionOfArrayOfSeries.new(array_of_timed_series)
11
+ TimedUnionOfArrayOfTimedSeries.new(array_of_timed_series)
12
12
  elsif hash_of_timed_series.any?
13
- TimedUnionOfHashOfSeries.new(hash_of_timed_series)
13
+ TimedUnionOfHashOfTimedSeries.new(hash_of_timed_series)
14
14
  else
15
15
  raise ArgumentError, 'Missing argument series'
16
16
  end
17
17
  end
18
18
 
19
- class TimedUnionOfArrayOfSeries
19
+ class TimedUnionOfArrayOfTimedSeries
20
20
  include Serie
21
21
 
22
22
  attr_reader :sources
@@ -34,7 +34,7 @@ module Musa
34
34
  end
35
35
 
36
36
  private def _restart(restart_sources = true)
37
- @sources.each { |serie| serie.restart } if restart_sources
37
+ @sources.each(&:restart) if restart_sources
38
38
  @sources_next_values = Array.new(@sources.size)
39
39
 
40
40
  @components = nil
@@ -74,7 +74,7 @@ module Musa
74
74
  end
75
75
  end
76
76
 
77
- result
77
+ result.extend(Musa::Datasets::AbsTimed)
78
78
  else
79
79
  nil
80
80
  end
@@ -146,9 +146,9 @@ module Musa
146
146
  return components, hash_mode, array_mode
147
147
  end
148
148
 
149
- private_constant :TimedUnionOfArrayOfSeries
149
+ private_constant :TimedUnionOfArrayOfTimedSeries
150
150
 
151
- class TimedUnionOfHashOfSeries
151
+ class TimedUnionOfHashOfTimedSeries
152
152
  include Serie
153
153
 
154
154
  attr_reader :sources
@@ -168,15 +168,17 @@ module Musa
168
168
  end
169
169
 
170
170
  private def _restart(restart_sources = true)
171
- @sources.each_value { |serie| serie.restart } if restart_sources
171
+ @sources.each_value(&:restart) if restart_sources
172
172
  @sources_next_values = @components.collect { |k| [k, nil] }.to_h
173
173
  @other_attributes = nil
174
174
  end
175
175
 
176
176
  private def _next_value
177
- sources_values = @sources_next_values.collect do |key, _|
178
- [key, @sources_next_values[key] || (@sources_next_values[key] = @sources[key].next_value)]
179
- end.to_h
177
+ sources_values = {}
178
+
179
+ @components.each do |key|
180
+ sources_values[key] = @sources_next_values[key] || (@sources_next_values[key] = @sources[key].next_value)
181
+ end
180
182
 
181
183
  @other_attributes = infer_other_attributes(sources_values) unless @other_attributes
182
184
 
@@ -205,7 +207,7 @@ module Musa
205
207
  end
206
208
  end
207
209
 
208
- result
210
+ result.extend(Musa::Datasets::AbsTimed)
209
211
  else
210
212
  nil
211
213
  end
@@ -228,7 +230,7 @@ module Musa
228
230
  end
229
231
  end
230
232
 
231
- private_constant :TimedUnionOfHashOfSeries
233
+ private_constant :TimedUnionOfHashOfTimedSeries
232
234
 
233
235
  module SerieOperations
234
236
  def flatten_timed
@@ -300,7 +302,7 @@ module Musa
300
302
  result = source_value.clone.extend(Musa::Datasets::AbsTimed)
301
303
  end
302
304
 
303
- result
305
+ result.extend(Musa::Datasets::AbsTimed)
304
306
  else
305
307
  nil
306
308
  end
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'musa-dsl'
3
- s.version = '0.22.5'
4
- s.date = '2020-11-18'
3
+ s.version = '0.22.6'
4
+ s.date = '2020-11-25'
5
5
  s.summary = 'A simple Ruby DSL for making complex music'
6
- s.description = 'Musa-DSL: A Ruby DSL for algorithmic music composition, device language neutral (MIDI, OSC, etc)'
6
+ s.description = 'Musa-DSL: A Ruby framework and DSL for algorithmic sound and musical thinking and composition'
7
7
  s.authors = ['Javier Sánchez Yeste']
8
8
  s.email = 'javier.sy@gmail.com'
9
9
  s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|samples)/}) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: musa-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.5
4
+ version: 0.22.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Javier Sánchez Yeste
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-18 00:00:00.000000000 Z
11
+ date: 2020-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: citrus
@@ -70,8 +70,8 @@ dependencies:
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
72
  version: 0.2.4
73
- description: 'Musa-DSL: A Ruby DSL for algorithmic music composition, device language
74
- neutral (MIDI, OSC, etc)'
73
+ description: 'Musa-DSL: A Ruby framework and DSL for algorithmic sound and musical
74
+ thinking and composition'
75
75
  email: javier.sy@gmail.com
76
76
  executables: []
77
77
  extensions: []