musa-dsl 0.22.2 → 0.23.0

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.
Files changed (42) 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 +1 -0
  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-public.rb → base-sequencer.rb} +15 -23
  26. data/lib/musa-dsl/sequencer/sequencer-dsl.rb +9 -7
  27. data/lib/musa-dsl/sequencer/sequencer.rb +8 -1
  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 +139 -60
  31. data/lib/musa-dsl/series/main-serie-constructors.rb +254 -165
  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 -2
  38. data/lib/musa-dsl/series/timed-serie.rb +343 -0
  39. data/musa-dsl.gemspec +13 -3
  40. metadata +11 -11
  41. data/lib/musa-dsl/series/flattener-timed-serie.rb +0 -61
  42. data/lib/musa-dsl/series/holder-serie.rb +0 -87
@@ -1,15 +1,15 @@
1
1
  require_relative '../core-ext/arrayfy'
2
2
  require_relative '../core-ext/smart-proc-binder'
3
3
 
4
+ require_relative 'base-series'
5
+
4
6
  using Musa::Extension::Arrayfy
5
7
  using Musa::Extension::ExplodeRanges
6
8
 
7
9
  # TODO: añadir en for: steps: (nº de pasos en los que repartir el incremento)
8
10
 
9
11
  module Musa
10
- module Series
11
- extend self
12
-
12
+ module Series::Constructors
13
13
  def NIL
14
14
  NilSerie.new
15
15
  end
@@ -18,10 +18,6 @@ module Musa
18
18
  FromArray.new values.explode_ranges
19
19
  end
20
20
 
21
- def _SE(values, extends:)
22
- FromArray.new values.explode_ranges, extends
23
- end
24
-
25
21
  def H(**series_hash)
26
22
  FromHashOfSeries.new series_hash, false
27
23
  end
@@ -63,8 +59,8 @@ module Musa
63
59
  end
64
60
  end
65
61
 
66
- def MERGE(*values)
67
- Sequence.new(values)
62
+ def MERGE(*series)
63
+ Sequence.new(series)
68
64
  end
69
65
 
70
66
  def RND1(*values, from: nil, to: nil, step: nil, random: nil)
@@ -104,33 +100,35 @@ module Musa
104
100
  ###
105
101
 
106
102
  class NilSerie
107
- include Serie
108
- def _next_value
109
- nil
110
- end
103
+ include Musa::Series::Serie.base
104
+
105
+ def _next_value; nil; end
111
106
  end
112
107
 
113
108
  private_constant :NilSerie
114
109
 
115
110
  class FromArray
116
- include Serie
117
-
118
- attr_reader :values
111
+ include Musa::Series::Serie.base
119
112
 
120
113
  def initialize(values = nil, extends = nil)
121
- @values = values.clone.freeze
122
- @index = 0
114
+ @values = values
115
+ mark_as_prototype!
123
116
 
124
- extends.arrayfy.each { |e| extend(e) }
117
+ x = self
118
+ extends.arrayfy.each do |e|
119
+ x.extend(e)
120
+ end
125
121
 
126
- mark_as_prototype!
122
+ init
127
123
  end
128
124
 
129
- def _restart
125
+ attr_accessor :values
126
+
127
+ private def _init
130
128
  @index = 0
131
129
  end
132
130
 
133
- def _next_value
131
+ private def _next_value
134
132
  if @values && @index < @values.size
135
133
  value = @values[@index]
136
134
  @index += 1
@@ -142,31 +140,30 @@ module Musa
142
140
  end
143
141
  end
144
142
 
145
- private_constant :FromArray
143
+ # private_constant :FromArray
146
144
 
147
145
  class Sequence
148
- include Serie
149
-
150
- attr_reader :sources
146
+ include Musa::Series::Serie.with(sources: true)
151
147
 
152
148
  def initialize(series)
153
- @sources = if series[0].prototype?
154
- series.collect(&:prototype).freeze
155
- else
156
- series.collect(&:instance)
157
- end
158
-
159
- _restart false
149
+ self.sources = series
160
150
 
161
- mark_regarding! series[0]
151
+ init
162
152
  end
163
153
 
164
- def _restart(restart_sources = true)
154
+ attr_accessor :sources
155
+
156
+ private def _init
165
157
  @index = 0
166
- @sources[@index].restart if restart_sources
158
+ @restart_sources = false
167
159
  end
168
160
 
169
- def _next_value
161
+ private def _restart
162
+ @sources[0].restart
163
+ @restart_sources = true
164
+ end
165
+
166
+ private def _next_value
170
167
  value = nil
171
168
 
172
169
  if @index < @sources.size
@@ -175,7 +172,7 @@ module Musa
175
172
  if value.nil?
176
173
  @index += 1
177
174
  if @index < @sources.size
178
- @sources[@index].restart
175
+ @sources[@index].restart if @restart_sources
179
176
  value = next_value
180
177
  end
181
178
  end
@@ -192,35 +189,50 @@ module Musa
192
189
  private_constant :Sequence
193
190
 
194
191
  class FromEvalBlockWithParameters
195
- include Serie
196
- include Musa::Extension::SmartProcBinder
192
+ include Musa::Series::Serie.with(smart_block: true)
197
193
 
198
- attr_reader :block
194
+ using Musa::Extension::DeepCopy
199
195
 
200
- def initialize(*values, **key_values, &block)
196
+ def initialize(*parameters, **key_parameters, &block)
201
197
  raise ArgumentError, 'Yield block is undefined' unless block
202
198
 
203
- @original_value_parameters = values
204
- @original_key_parameters = key_values
205
-
206
- @block = SmartProcBinder.new(block)
199
+ @original_value_parameters = parameters
200
+ @original_key_parameters = key_parameters
207
201
 
208
- _restart
202
+ self.proc = block
209
203
 
210
204
  mark_as_prototype!
205
+
206
+ init
207
+ end
208
+
209
+ def parameters
210
+ @original_value_parameters
211
+ end
212
+
213
+ def parameters=(values)
214
+ @original_value_parameters = values
215
+ end
216
+
217
+ def key_parameters
218
+ @original_key_parameters
219
+ end
220
+
221
+ def key_parameters=(key_values)
222
+ @original_key_parameters = key_values
211
223
  end
212
224
 
213
- def _restart
214
- @value_parameters = @original_value_parameters.collect(&:clone)
215
- @key_parameters = @original_key_parameters.transform_values(&:clone)
225
+ private def _init
226
+ @value_parameters = @original_value_parameters.clone(deep: true)
227
+ @key_parameters = @original_key_parameters.clone(deep: true)
216
228
 
217
229
  @first = true
218
230
  @value = nil
219
231
  end
220
232
 
221
- def _next_value
233
+ private def _next_value
222
234
  @value = if !@value.nil? || @value.nil? && @first
223
- @value = @block.call(*@value_parameters, last_value: @value, **@key_parameters)
235
+ @value = @block.call(*@value_parameters, last_value: @value, caller: self, **@key_parameters)
224
236
  else
225
237
  nil
226
238
  end
@@ -233,9 +245,7 @@ module Musa
233
245
  private_constant :FromEvalBlockWithParameters
234
246
 
235
247
  class ForLoop
236
- include Serie
237
-
238
- attr_reader :from, :to, :step
248
+ include Musa::Series::Serie.base
239
249
 
240
250
  def initialize(from, to, step)
241
251
  @from = from
@@ -244,22 +254,39 @@ module Musa
244
254
 
245
255
  sign_adjust_step
246
256
 
247
- _restart
248
-
249
257
  mark_as_prototype!
258
+
259
+ init
250
260
  end
251
261
 
252
- def _restart
253
- @value = @from
262
+ attr_reader :from, :to, :step
263
+
264
+ def from=(value)
265
+ @from = value
266
+ sign_adjust_step
254
267
  end
255
268
 
256
- def _next_value
269
+ def to=(value)
270
+ @to = value
271
+ sign_adjust_step
272
+ end
273
+
274
+ def step=(value)
275
+ @step = value
276
+ sign_adjust_step
277
+ end
278
+
279
+ private def _init
280
+ @value = @from - @step
281
+ end
282
+
283
+ private def _next_value
257
284
  if @value
258
- value = @value
259
285
  @value += @step
286
+ value = @value
260
287
  end
261
288
 
262
- @value = nil if @to && @value && (@value > @to && @step.positive? || @value < @to && @step.negative?)
289
+ @value = nil if @to && @value && (@value >= @to && @step.positive? || @value <= @to && @step.negative?)
263
290
 
264
291
  value
265
292
  end
@@ -268,9 +295,7 @@ module Musa
268
295
  @to.nil?
269
296
  end
270
297
 
271
- private
272
-
273
- def sign_adjust_step
298
+ private def sign_adjust_step
274
299
  @step = (-@step if @to && (@from < @to && @step < 0 || @from > @to && @step > 0)) || @step
275
300
  end
276
301
  end
@@ -278,24 +303,24 @@ module Musa
278
303
  private_constant :ForLoop
279
304
 
280
305
  class RandomValueFromArray
281
- include Serie
282
-
283
- attr_reader :values, :random
306
+ include Musa::Series::Serie.base
284
307
 
285
308
  def initialize(values, random)
286
- @values = values.clone.freeze
309
+ @values = values
287
310
  @random = random
288
311
 
289
- _restart
290
-
291
312
  mark_as_prototype!
313
+
314
+ init
292
315
  end
293
316
 
294
- def _restart
317
+ attr_accessor :values, :random
318
+
319
+ private def _init
295
320
  @value = nil
296
321
  end
297
322
 
298
- def _next_value
323
+ private def _next_value
299
324
  if @value
300
325
  nil
301
326
  else
@@ -307,9 +332,7 @@ module Musa
307
332
  private_constant :RandomValueFromArray
308
333
 
309
334
  class RandomNumberFromRange
310
- include Serie
311
-
312
- attr_reader :from, :to, :step, :random
335
+ include Musa::Series::Serie.base
313
336
 
314
337
  def initialize(from, to, step, random)
315
338
  @from = from
@@ -320,16 +343,39 @@ module Musa
320
343
 
321
344
  @random = random
322
345
 
323
- _restart
324
-
325
346
  mark_as_prototype!
347
+
348
+ init
326
349
  end
327
350
 
328
- def _restart
351
+ attr_reader :from
352
+
353
+ def from=(value)
354
+ @from = value
355
+ sign_adjust_step
356
+ end
357
+
358
+ attr_reader :to
359
+
360
+ def to=(value)
361
+ @to = value
362
+ sign_adjust_step
363
+ end
364
+
365
+ attr_reader :step
366
+
367
+ def step=(value)
368
+ @step = value
369
+ sign_adjust_step
370
+ end
371
+
372
+ attr_accessor :random
373
+
374
+ private def _init
329
375
  @value = nil
330
376
  end
331
377
 
332
- def _next_value
378
+ private def _next_value
333
379
  if @value
334
380
  nil
335
381
  else
@@ -337,9 +383,7 @@ module Musa
337
383
  end
338
384
  end
339
385
 
340
- private
341
-
342
- def adjust_step
386
+ private def adjust_step
343
387
  @step = (-@step if @from < @to && @step < 0 || @from > @to && @step > 0) || @step
344
388
  @step_count = ((@to - @from) / @step).to_i
345
389
  end
@@ -348,24 +392,25 @@ module Musa
348
392
  private_constant :RandomNumberFromRange
349
393
 
350
394
  class RandomValuesFromArray
351
- include Serie
352
-
353
- attr_reader :values, :random
395
+ include Musa::Series::Serie.base
354
396
 
355
397
  def initialize(values, random)
356
398
  @values = values.clone.freeze
357
399
  @random = random
358
400
 
359
- _restart
360
-
361
401
  mark_as_prototype!
402
+
403
+ init
362
404
  end
363
405
 
364
- def _restart
406
+ attr_accessor :values
407
+ attr_accessor :random
408
+
409
+ private def _init
365
410
  @available_values = @values.dup
366
411
  end
367
412
 
368
- def _next_value
413
+ private def _next_value
369
414
  value = nil
370
415
  unless @available_values.empty?
371
416
  i = @random.rand(0...@available_values.size)
@@ -379,9 +424,7 @@ module Musa
379
424
  private_constant :RandomValuesFromArray
380
425
 
381
426
  class RandomNumbersFromRange
382
- include Serie
383
-
384
- attr_reader :from, :to, :step, :random
427
+ include Musa::Series::Serie.base
385
428
 
386
429
  def initialize(from, to, step, random)
387
430
  @from = from
@@ -392,16 +435,39 @@ module Musa
392
435
 
393
436
  @random = random
394
437
 
395
- _restart
396
-
397
438
  mark_as_prototype!
439
+
440
+ init
398
441
  end
399
442
 
400
- def _restart
443
+ attr_reader :from
444
+
445
+ def from=(value)
446
+ @from = value
447
+ adjust_step
448
+ end
449
+
450
+ attr_reader :to
451
+
452
+ def to=(value)
453
+ @to = value
454
+ adjust_step
455
+ end
456
+
457
+ attr_reader :step
458
+
459
+ def step=(value)
460
+ @step = value
461
+ adjust_step
462
+ end
463
+
464
+ attr_accessor :random
465
+
466
+ private def _init
401
467
  @available_steps = (0..@step_count).to_a
402
468
  end
403
469
 
404
- def _next_value
470
+ private def _next_value
405
471
  value = nil
406
472
  unless @available_steps.empty?
407
473
  i = @random.rand(0...@available_steps.size)
@@ -411,9 +477,7 @@ module Musa
411
477
  value
412
478
  end
413
479
 
414
- private
415
-
416
- def adjust_step
480
+ private def adjust_step
417
481
  @step = (-@step if @from < @to && @step < 0 || @from > @to && @step > 0) || @step
418
482
  @step_count = ((@to - @from) / @step).to_i
419
483
  end
@@ -422,37 +486,27 @@ module Musa
422
486
  private_constant :RandomNumbersFromRange
423
487
 
424
488
  class FromHashOfSeries
425
- include Serie
426
-
427
- attr_reader :sources, :cycle
489
+ include Musa::Series::Serie.with(sources: true)
428
490
 
429
491
  def initialize(hash_of_series, cycle_all_series)
430
- @sources = hash_of_series.clone.transform_values(&:prototype).freeze
431
- @cycle = cycle_all_series
432
-
433
- _restart false
492
+ self.sources = hash_of_series
493
+ self.cycle = cycle_all_series
434
494
 
435
- mark_as_prototype!
495
+ init
436
496
  end
437
497
 
438
- def _restart(restart_sources = true)
498
+ attr_accessor :cycle
499
+
500
+ private def _init
439
501
  @have_current = false
440
502
  @value = nil
441
-
442
- if restart_sources
443
- @sources.each do |_key, serie|
444
- serie.restart
445
- end
446
- end
447
503
  end
448
504
 
449
- def _soft_restart
450
- @sources.each do |_key, serie|
451
- serie.restart if serie.current_value.nil?
452
- end
505
+ private def _restart
506
+ @sources.values.each(&:restart)
453
507
  end
454
508
 
455
- def _next_value
509
+ private def _next_value
456
510
  unless @have_current && @value.nil?
457
511
  pre_value = @sources.collect { |key, serie| [key, serie.peek_next_value] }.to_h
458
512
 
@@ -480,42 +534,38 @@ module Musa
480
534
 
481
535
  @value
482
536
  end
537
+
538
+ private def _soft_restart
539
+ @sources.each do |_key, serie|
540
+ serie.restart if serie.current_value.nil?
541
+ end
542
+ end
483
543
  end
484
544
 
485
545
  private_constant :FromHashOfSeries
486
546
 
487
547
  class FromArrayOfSeries
488
- include Serie
489
-
490
- attr_reader :sources, :cycle
548
+ include Musa::Series::Serie.with(sources: true)
491
549
 
492
550
  def initialize(series_array, cycle_all_series)
493
- @sources = series_array.collect(&:prototype).freeze
494
- @cycle = cycle_all_series
495
-
496
- _restart false
551
+ self.sources = series_array
552
+ self.cycle = cycle_all_series
497
553
 
498
- mark_as_prototype!
554
+ init
499
555
  end
500
556
 
501
- def _restart(restart_sources = true)
557
+ attr_accessor :cycle
558
+
559
+ private def _init
502
560
  @have_current = false
503
561
  @value = nil
504
-
505
- if restart_sources
506
- @sources.each do |serie|
507
- serie.restart if serie.current_value.nil?
508
- end
509
- end
510
562
  end
511
563
 
512
- def _soft_restart
513
- @sources.each do |serie|
514
- serie.restart if serie.current_value.nil?
515
- end
564
+ private def _restart
565
+ @sources.each(&:restart)
516
566
  end
517
567
 
518
- def _next_value
568
+ private def _next_value
519
569
  unless @have_current && @value.nil?
520
570
  pre_value = @sources.collect(&:peek_next_value)
521
571
 
@@ -543,14 +593,18 @@ module Musa
543
593
 
544
594
  @value
545
595
  end
596
+
597
+ private def _soft_restart
598
+ @sources.each do |serie|
599
+ serie.restart if serie.current_value.nil?
600
+ end
601
+ end
546
602
  end
547
603
 
548
604
  private_constant :FromArrayOfSeries
549
605
 
550
606
  class SinFunction
551
- include Serie
552
-
553
- attr_reader :start, :steps, :amplitude, :center
607
+ include Musa::Series::Serie.base
554
608
 
555
609
  def initialize(start, steps, amplitude, center)
556
610
  @start = start.to_f
@@ -561,16 +615,44 @@ module Musa
561
615
 
562
616
  update
563
617
 
564
- _restart
565
-
566
618
  mark_as_prototype!
619
+
620
+ init
621
+ end
622
+
623
+ attr_reader :start
624
+
625
+ def start=(value)
626
+ @start = value.to_f
627
+ update
628
+ end
629
+
630
+ attr_reader :steps
631
+
632
+ def steps=(value)
633
+ @steps = value
634
+ update
635
+ end
636
+
637
+ attr_reader :amplitude
638
+
639
+ def amplitude=(value)
640
+ @amplitude = value
641
+ update
642
+ end
643
+
644
+ attr_reader :center
645
+
646
+ def center=(value)
647
+ @center = value
648
+ update
567
649
  end
568
650
 
569
- def _restart
651
+ private def _init
570
652
  @position = 0
571
653
  end
572
654
 
573
- def _next_value
655
+ private def _next_value
574
656
  value = nil
575
657
  unless @position >= @steps
576
658
  value = Math.sin(@offset + @step_size * @position) * (@amplitude / 2.0) + @center
@@ -579,13 +661,7 @@ module Musa
579
661
  value
580
662
  end
581
663
 
582
- def to_s
583
- "offset: #{@offset.round(3)}rd amplitude: #{@amplitude.round(3)} center: #{@center.round(3)} length: #{@length} step_size: #{@step_size.round(6)}"
584
- end
585
-
586
- private
587
-
588
- def update
664
+ private def update
589
665
  y = 2 * (@start - @center) / @amplitude
590
666
  warn "WARNING: value for offset calc #{y} is outside asin range" if y < -1 || y > 1
591
667
  y = 1.0 if y > 1.0 # por los errores de precisión infinitesimal en el cálculo de y cuando es muy próximo a 1.0
@@ -594,25 +670,28 @@ module Musa
594
670
  @offset = Math.asin(y)
595
671
  @step_size = 2.0 * Math::PI / @steps
596
672
  end
673
+
674
+ def to_s
675
+ "offset: #{@offset.round(3)}rd amplitude: #{@amplitude.round(3)} center: #{@center.round(3)} length: #{@length} step_size: #{@step_size.round(6)}"
676
+ end
597
677
  end
598
678
 
599
679
  private_constant :SinFunction
600
680
 
601
681
  class Fibonacci
602
- include Serie
682
+ include Musa::Series::Serie.base
603
683
 
604
684
  def initialize
605
- _restart
606
-
607
685
  mark_as_prototype!
686
+ init
608
687
  end
609
688
 
610
- def _restart
689
+ private def _init
611
690
  @a = 0
612
691
  @b = 1
613
692
  end
614
693
 
615
- def _next_value
694
+ private def _next_value
616
695
  initial_b = @b
617
696
  @b = @a + @b
618
697
  @a = initial_b
@@ -628,20 +707,30 @@ module Musa
628
707
  private_constant :Fibonacci
629
708
 
630
709
  class HarmonicNotes
631
- include Serie
632
-
633
- attr_reader :error, :extended
710
+ include Musa::Series::Serie.base
634
711
 
635
712
  def initialize(error, extended)
636
713
  @error = error
637
714
  @extended = extended
638
715
 
639
- _restart
640
-
641
716
  mark_as_prototype!
717
+
718
+ init
719
+ end
720
+
721
+ attr_reader :error
722
+
723
+ def error=(value)
724
+ @error = value
725
+ end
726
+
727
+ attr_reader :extended
728
+
729
+ def extended=(value)
730
+ @extended = value
642
731
  end
643
732
 
644
- def _restart
733
+ def _init
645
734
  @harmonic = 0
646
735
  end
647
736