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,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
211
207
  end
212
208
 
213
- def _restart
214
- @value_parameters = @original_value_parameters.collect(&:clone)
215
- @key_parameters = @original_key_parameters.transform_values(&:clone)
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
223
+ end
224
+
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
260
+ end
261
+
262
+ attr_reader :from, :to, :step
263
+
264
+ def from=(value)
265
+ @from = value
266
+ sign_adjust_step
250
267
  end
251
268
 
252
- def _restart
253
- @value = @from
269
+ def to=(value)
270
+ @to = value
271
+ sign_adjust_step
254
272
  end
255
273
 
256
- def _next_value
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
@@ -276,24 +303,24 @@ module Musa
276
303
  private_constant :ForLoop
277
304
 
278
305
  class RandomValueFromArray
279
- include Serie
280
-
281
- attr_reader :values, :random
306
+ include Musa::Series::Serie.base
282
307
 
283
308
  def initialize(values, random)
284
- @values = values.clone.freeze
309
+ @values = values
285
310
  @random = random
286
311
 
287
- _restart
288
-
289
312
  mark_as_prototype!
313
+
314
+ init
290
315
  end
291
316
 
292
- def _restart
317
+ attr_accessor :values, :random
318
+
319
+ private def _init
293
320
  @value = nil
294
321
  end
295
322
 
296
- def _next_value
323
+ private def _next_value
297
324
  if @value
298
325
  nil
299
326
  else
@@ -305,9 +332,7 @@ module Musa
305
332
  private_constant :RandomValueFromArray
306
333
 
307
334
  class RandomNumberFromRange
308
- include Serie
309
-
310
- attr_reader :from, :to, :step, :random
335
+ include Musa::Series::Serie.base
311
336
 
312
337
  def initialize(from, to, step, random)
313
338
  @from = from
@@ -318,16 +343,39 @@ module Musa
318
343
 
319
344
  @random = random
320
345
 
321
- _restart
322
-
323
346
  mark_as_prototype!
347
+
348
+ init
324
349
  end
325
350
 
326
- 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
327
375
  @value = nil
328
376
  end
329
377
 
330
- def _next_value
378
+ private def _next_value
331
379
  if @value
332
380
  nil
333
381
  else
@@ -344,24 +392,25 @@ module Musa
344
392
  private_constant :RandomNumberFromRange
345
393
 
346
394
  class RandomValuesFromArray
347
- include Serie
348
-
349
- attr_reader :values, :random
395
+ include Musa::Series::Serie.base
350
396
 
351
397
  def initialize(values, random)
352
398
  @values = values.clone.freeze
353
399
  @random = random
354
400
 
355
- _restart
356
-
357
401
  mark_as_prototype!
402
+
403
+ init
358
404
  end
359
405
 
360
- def _restart
406
+ attr_accessor :values
407
+ attr_accessor :random
408
+
409
+ private def _init
361
410
  @available_values = @values.dup
362
411
  end
363
412
 
364
- def _next_value
413
+ private def _next_value
365
414
  value = nil
366
415
  unless @available_values.empty?
367
416
  i = @random.rand(0...@available_values.size)
@@ -375,9 +424,7 @@ module Musa
375
424
  private_constant :RandomValuesFromArray
376
425
 
377
426
  class RandomNumbersFromRange
378
- include Serie
379
-
380
- attr_reader :from, :to, :step, :random
427
+ include Musa::Series::Serie.base
381
428
 
382
429
  def initialize(from, to, step, random)
383
430
  @from = from
@@ -388,16 +435,39 @@ module Musa
388
435
 
389
436
  @random = random
390
437
 
391
- _restart
392
-
393
438
  mark_as_prototype!
439
+
440
+ init
394
441
  end
395
442
 
396
- 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
397
467
  @available_steps = (0..@step_count).to_a
398
468
  end
399
469
 
400
- def _next_value
470
+ private def _next_value
401
471
  value = nil
402
472
  unless @available_steps.empty?
403
473
  i = @random.rand(0...@available_steps.size)
@@ -416,37 +486,27 @@ module Musa
416
486
  private_constant :RandomNumbersFromRange
417
487
 
418
488
  class FromHashOfSeries
419
- include Serie
420
-
421
- attr_reader :sources, :cycle
489
+ include Musa::Series::Serie.with(sources: true)
422
490
 
423
491
  def initialize(hash_of_series, cycle_all_series)
424
- @sources = hash_of_series.clone.transform_values(&:prototype).freeze
425
- @cycle = cycle_all_series
492
+ self.sources = hash_of_series
493
+ self.cycle = cycle_all_series
426
494
 
427
- _restart false
428
-
429
- mark_as_prototype!
495
+ init
430
496
  end
431
497
 
432
- def _restart(restart_sources = true)
498
+ attr_accessor :cycle
499
+
500
+ private def _init
433
501
  @have_current = false
434
502
  @value = nil
435
-
436
- if restart_sources
437
- @sources.each do |_key, serie|
438
- serie.restart
439
- end
440
- end
441
503
  end
442
504
 
443
- def _soft_restart
444
- @sources.each do |_key, serie|
445
- serie.restart if serie.current_value.nil?
446
- end
505
+ private def _restart
506
+ @sources.values.each(&:restart)
447
507
  end
448
508
 
449
- def _next_value
509
+ private def _next_value
450
510
  unless @have_current && @value.nil?
451
511
  pre_value = @sources.collect { |key, serie| [key, serie.peek_next_value] }.to_h
452
512
 
@@ -474,42 +534,38 @@ module Musa
474
534
 
475
535
  @value
476
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
477
543
  end
478
544
 
479
545
  private_constant :FromHashOfSeries
480
546
 
481
547
  class FromArrayOfSeries
482
- include Serie
483
-
484
- attr_reader :sources, :cycle
548
+ include Musa::Series::Serie.with(sources: true)
485
549
 
486
550
  def initialize(series_array, cycle_all_series)
487
- @sources = series_array.collect(&:prototype).freeze
488
- @cycle = cycle_all_series
489
-
490
- _restart false
551
+ self.sources = series_array
552
+ self.cycle = cycle_all_series
491
553
 
492
- mark_as_prototype!
554
+ init
493
555
  end
494
556
 
495
- def _restart(restart_sources = true)
557
+ attr_accessor :cycle
558
+
559
+ private def _init
496
560
  @have_current = false
497
561
  @value = nil
498
-
499
- if restart_sources
500
- @sources.each do |serie|
501
- serie.restart if serie.current_value.nil?
502
- end
503
- end
504
562
  end
505
563
 
506
- def _soft_restart
507
- @sources.each do |serie|
508
- serie.restart if serie.current_value.nil?
509
- end
564
+ private def _restart
565
+ @sources.each(&:restart)
510
566
  end
511
567
 
512
- def _next_value
568
+ private def _next_value
513
569
  unless @have_current && @value.nil?
514
570
  pre_value = @sources.collect(&:peek_next_value)
515
571
 
@@ -537,14 +593,18 @@ module Musa
537
593
 
538
594
  @value
539
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
540
602
  end
541
603
 
542
604
  private_constant :FromArrayOfSeries
543
605
 
544
606
  class SinFunction
545
- include Serie
546
-
547
- attr_reader :start, :steps, :amplitude, :center
607
+ include Musa::Series::Serie.base
548
608
 
549
609
  def initialize(start, steps, amplitude, center)
550
610
  @start = start.to_f
@@ -555,16 +615,44 @@ module Musa
555
615
 
556
616
  update
557
617
 
558
- _restart
559
-
560
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
561
649
  end
562
650
 
563
- def _restart
651
+ private def _init
564
652
  @position = 0
565
653
  end
566
654
 
567
- def _next_value
655
+ private def _next_value
568
656
  value = nil
569
657
  unless @position >= @steps
570
658
  value = Math.sin(@offset + @step_size * @position) * (@amplitude / 2.0) + @center
@@ -573,13 +661,7 @@ module Musa
573
661
  value
574
662
  end
575
663
 
576
- def to_s
577
- "offset: #{@offset.round(3)}rd amplitude: #{@amplitude.round(3)} center: #{@center.round(3)} length: #{@length} step_size: #{@step_size.round(6)}"
578
- end
579
-
580
- private
581
-
582
- def update
664
+ private def update
583
665
  y = 2 * (@start - @center) / @amplitude
584
666
  warn "WARNING: value for offset calc #{y} is outside asin range" if y < -1 || y > 1
585
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
@@ -588,25 +670,28 @@ module Musa
588
670
  @offset = Math.asin(y)
589
671
  @step_size = 2.0 * Math::PI / @steps
590
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
591
677
  end
592
678
 
593
679
  private_constant :SinFunction
594
680
 
595
681
  class Fibonacci
596
- include Serie
682
+ include Musa::Series::Serie.base
597
683
 
598
684
  def initialize
599
- _restart
600
-
601
685
  mark_as_prototype!
686
+ init
602
687
  end
603
688
 
604
- def _restart
689
+ private def _init
605
690
  @a = 0
606
691
  @b = 1
607
692
  end
608
693
 
609
- def _next_value
694
+ private def _next_value
610
695
  initial_b = @b
611
696
  @b = @a + @b
612
697
  @a = initial_b
@@ -622,20 +707,30 @@ module Musa
622
707
  private_constant :Fibonacci
623
708
 
624
709
  class HarmonicNotes
625
- include Serie
626
-
627
- attr_reader :error, :extended
710
+ include Musa::Series::Serie.base
628
711
 
629
712
  def initialize(error, extended)
630
713
  @error = error
631
714
  @extended = extended
632
715
 
633
- _restart
634
-
635
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
636
731
  end
637
732
 
638
- def _restart
733
+ def _init
639
734
  @harmonic = 0
640
735
  end
641
736