musa-dsl 0.23.13 → 0.23.17

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: 83e058435542d40d1947cb484686b8b78b67c39e0a00f88d60d3b1c534620401
4
- data.tar.gz: eef1c767f85c7ad1c174986eee492f7588d6c6c32e57b3fa13f8dcb7e8a8db23
3
+ metadata.gz: ef23a7cf410efe4d9fa21687e85678c5f2bbf4deca1255e188d199246d221e62
4
+ data.tar.gz: 5a97ebc91408d7d29a09ec441cecba974c8b994c83a982610288b52897cb1327
5
5
  SHA512:
6
- metadata.gz: ce2bbb09377ad73191994790009429f469a7c46edaa47bdf5dd7cbc04b4541cfeef36006bc9b68c0f5baf2598e9c52acf339dd3b166702cef102e96209cb5013
7
- data.tar.gz: 0c787f3da1d3beddbf09dcf20493c0cb0ed97868a49ea26432307093df222ec69ef9128cf2ce9d58a0211ccd2ec3a4ea59446fb14026b00f90dd41691c4cbf3a
6
+ metadata.gz: 5ef6043e7356890a1806b73c2884f92cfbc1ad8c09f232f8c60254179737d85047bca63bfa1bd3a206a743aa11125d1ae61b3de3be3a88aac7b4fba1beade4b5
7
+ data.tar.gz: e3047601fd766e64103bbaa00c3cf14d28f509682b25fb1e6db2dac6878155827e6fb03bd3a324f11e877ee2765c071a51be43210557df678c2fbab92f652916
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- ruby '2.7.3'
3
+ ruby '2.7.4'
4
4
 
5
5
  gem 'logger', '~> 1.4', '>= 1.4.3'
6
6
 
@@ -33,7 +33,7 @@ module Musa
33
33
  _call value_parameters, key_parameters
34
34
  end
35
35
 
36
- def _call(value_parameters, key_parameters)
36
+ def _call(value_parameters, key_parameters = {})
37
37
  if @on_rescue
38
38
  begin
39
39
  __call value_parameters, key_parameters
@@ -45,7 +45,7 @@ module Musa
45
45
  end
46
46
  end
47
47
 
48
- private def __call(value_parameters, key_parameters)
48
+ private def __call(value_parameters, key_parameters = {})
49
49
  effective_value_parameters, effective_key_parameters = apply(*value_parameters, **key_parameters)
50
50
 
51
51
  if effective_key_parameters.empty?
@@ -100,7 +100,7 @@ module Musa
100
100
  end
101
101
 
102
102
  def inspect
103
- "KeyParametersProcedureBinder: parameters = #{@key_parameters} has_rest = #{@has_key_rest}"
103
+ "SmartProcBinder: parameters = #{parameters} key_parameters = #{@key_parameters} has_rest = #{@has_key_rest}"
104
104
  end
105
105
 
106
106
  alias to_s inspect
@@ -7,19 +7,22 @@ module Musa
7
7
  binder = Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
8
8
 
9
9
  keep_proc_context = @keep_proc_context_on_with
10
- keep_proc_context ||= binder.parameters[0][1] == :_ unless binder.parameters.empty?
10
+ send_self_as_underscore_parameter = binder.parameters[0][1] == :_ unless binder.parameters.empty?
11
+ keep_proc_context ||= send_self_as_underscore_parameter
11
12
  keep_proc_context ||= false
12
13
 
13
14
  effective_value_parameters, effective_key_parameters = binder._apply(value_parameters, key_parameters)
14
15
 
15
16
  if keep_proc_context
16
- binder.call(self, *effective_value_parameters, **effective_key_parameters)
17
- else
18
- if effective_value_parameters.empty? && effective_key_parameters.empty?
19
- instance_eval &block
17
+ if send_self_as_underscore_parameter
18
+ binder.call(self, *effective_value_parameters, **effective_key_parameters)
20
19
  else
21
- instance_exec *effective_value_parameters, **effective_key_parameters, &block
20
+ binder.call(*effective_value_parameters, **effective_key_parameters)
22
21
  end
22
+ elsif effective_value_parameters.empty? && effective_key_parameters.empty?
23
+ instance_eval &block
24
+ else
25
+ instance_exec *effective_value_parameters, **effective_key_parameters, &block
23
26
  end
24
27
  end
25
28
  end
@@ -20,7 +20,7 @@ module Musa
20
20
  def value
21
21
  { kind: :parallel,
22
22
  parallel: [{ kind: :serie,
23
- serie: S(*capture(:aa).value) }] +
23
+ serie: Musa::Series::Constructors.S(*capture(:aa).value) }] +
24
24
  captures(:bb).collect { |c| { kind: :serie, serie: Musa::Series::Constructors.S(*c.value) } }
25
25
  }.extend(Musa::Neumas::Neuma::Parallel)
26
26
  end
@@ -101,15 +101,28 @@ module Musa
101
101
 
102
102
  # TODO on with and map methods implement parameter passing with cloning on restart as on E()
103
103
  #
104
- def with(block = nil, on_restart: nil, **with_series, &yield_block)
105
- block ||= yield_block
106
- ProcessWith.new self, with_series, on_restart, &block
104
+ def with(*with_series, on_restart: nil, isolate_values: nil, **with_key_series, &block)
105
+ if with_series.any? && with_key_series.any?
106
+ raise ArgumentError, 'Can\'t use extra parameters series and key named parameters series'
107
+ end
108
+
109
+ extra_series = if with_series.any?
110
+ with_series
111
+ elsif with_key_series.any?
112
+ with_key_series
113
+ end
114
+
115
+ isolate_values ||= isolate_values.nil? ? true : isolate_values
116
+
117
+ ProcessWith.new self, extra_series, on_restart, isolate_values: isolate_values, &block
107
118
  end
108
119
 
109
120
  alias_method :eval, :with
110
121
 
111
- def map(&block)
112
- ProcessWith.new self, &block
122
+ def map(isolate_values: nil, &block)
123
+ isolate_values ||= isolate_values.nil? ? false : isolate_values
124
+
125
+ ProcessWith.new self, isolate_values: isolate_values, &block
113
126
  end
114
127
 
115
128
  def anticipate(&block)
@@ -129,12 +142,16 @@ module Musa
129
142
  sources: true, sources_as: :with_sources, mandatory_sources: false,
130
143
  smart_block: true)
131
144
 
132
- def initialize(serie, with_series = nil, on_restart = nil, &block)
145
+ using Musa::Extension::Arrayfy
146
+
147
+ def initialize(serie, with_series = nil, on_restart = nil, isolate_values: nil, &block)
133
148
  self.source = serie
134
- self.with_sources = with_series || {}
149
+ self.with_sources = with_series || []
135
150
  self.on_restart = on_restart
136
151
  self.proc = block if block
137
152
 
153
+ @isolate_values = isolate_values
154
+
138
155
  init
139
156
  end
140
157
 
@@ -152,21 +169,59 @@ module Musa
152
169
 
153
170
  private def _restart
154
171
  @source.restart
155
- @sources.values.each(&:restart)
172
+
173
+ case @sources
174
+ when Array
175
+ @sources.each(&:restart)
176
+ when Hash
177
+ @sources.each_value(&:restart)
178
+ end
179
+
156
180
  @on_restart.call if @on_restart
157
181
  end
158
182
 
159
183
  private def _next_value
160
184
  main = @source.next_value
161
- others = @sources.transform_values { |v| v.next_value }
185
+
186
+ others = case @sources
187
+ when Array
188
+ @sources.map(&:next_value)
189
+ when Hash
190
+ @sources.transform_values(&:next_value)
191
+ end
162
192
 
163
193
  value = nil
164
194
 
165
- if main && !others.values.include?(nil)
166
- if @block
167
- value = @block._call([main], others)
168
- else
169
- value = [main, others]
195
+
196
+ if main
197
+ case others
198
+ when Array
199
+ unless others.include?(nil)
200
+ value = if @block
201
+ if @isolate_values
202
+ raise ArgumentError, "Received 'with_sources' as an Array and asked to 'isolate_values'. This can't be done. Please, set 'isolate_values' to false or make with_sources to be a Hash." if others.any?
203
+
204
+ @block._call([main])
205
+ else
206
+ @block._call(main.arrayfy + others)
207
+ end
208
+ else
209
+ if @isolate_values
210
+ [main, others]
211
+ else
212
+ main.arrayfy + others
213
+ end
214
+ end
215
+ end
216
+
217
+ when Hash
218
+ unless others.values.include?(nil)
219
+ value = if @block
220
+ @block._call(main, others)
221
+ else
222
+ [main, others]
223
+ end
224
+ end
170
225
  end
171
226
  end
172
227
 
@@ -243,7 +298,7 @@ module Musa
243
298
  end
244
299
 
245
300
  def infinite?
246
- @source.infinite? && @sources.any? { |serie| serie.infinite? }
301
+ @source.infinite? && @sources.any?(&:infinite?)
247
302
  end
248
303
  end
249
304
 
@@ -287,7 +342,7 @@ module Musa
287
342
  end
288
343
 
289
344
  def infinite?
290
- @source.infinite? && @sources.any? { |serie| serie.infinite? }
345
+ @source.infinite? && @sources.any?(&:infinite?)
291
346
  end
292
347
  end
293
348
 
@@ -641,9 +696,7 @@ module Musa
641
696
  else
642
697
  value = @pending_values.shift
643
698
 
644
- if value.nil?
645
- value = _next_value
646
- end
699
+ value = _next_value if value.nil?
647
700
 
648
701
  value
649
702
  end
@@ -468,16 +468,19 @@ module Musa
468
468
  private def next_crossings
469
469
  from_time, from_value = get_time_value(@source.next_value)
470
470
 
471
- if from_time && from_value
472
- raise 'time only can go forward' if @last_time && from_time <= @last_time
471
+ return unless from_time && from_value
473
472
 
474
- @last_time = from_time
473
+ if @last_time && from_time < @last_time
474
+ raise "time only can go forward: last time = #{@last_time} (#{@last_time.to_f}) but " \
475
+ "from_time = #{from_time} (#{from_time.to_f}) (expected last_time to be < from_time) "
476
+ end
475
477
 
476
- to_time, to_value = get_time_value(@source.peek_next_value)
478
+ @last_time = from_time
477
479
 
478
- if to_time && to_value
479
- crossings(from_time, from_value, to_time, to_value)
480
- end
480
+ to_time, to_value = get_time_value(@source.peek_next_value)
481
+
482
+ if to_time && to_value
483
+ crossings(from_time, from_value, to_time, to_value)
481
484
  end
482
485
  end
483
486
 
@@ -3,7 +3,7 @@ require_relative 'clock'
3
3
  module Musa
4
4
  module Clock
5
5
  class TimerClock < Clock
6
- def initialize(period = nil, ticks_per_beat: nil, bpm: nil, correction: nil, do_log: nil)
6
+ def initialize(period = nil, ticks_per_beat: nil, bpm: nil, correction: nil, logger: nil)
7
7
  do_log ||= false
8
8
 
9
9
  super()
@@ -20,7 +20,7 @@ module Musa
20
20
  @started = false
21
21
  @paused = false
22
22
 
23
- @do_log = do_log
23
+ @logger = logger
24
24
  end
25
25
 
26
26
  attr_reader :period, :ticks_per_beat, :bpm
@@ -55,7 +55,7 @@ module Musa
55
55
  @run = true
56
56
 
57
57
  while @run
58
- @timer = Timer.new(@period, correction: @correction, stop: true)
58
+ @timer = Timer.new(@period, correction: @correction, stop: true, logger: @logger)
59
59
 
60
60
  @timer.run do
61
61
  yield if block_given?
@@ -3,10 +3,11 @@ module Musa
3
3
  class Timer
4
4
  attr_accessor :period
5
5
 
6
- def initialize(period_in_seconds, correction: nil, stop: nil)
6
+ def initialize(period_in_seconds, correction: nil, stop: nil, logger: nil)
7
7
  @period = period_in_seconds.rationalize
8
8
  @correction = (correction || 0r).rationalize
9
9
  @stop = stop || false
10
+ @logger = logger
10
11
  end
11
12
 
12
13
  def run
@@ -21,6 +22,8 @@ module Musa
21
22
  @next_moment += @period
22
23
  to_sleep = (@next_moment + @correction) - Process.clock_gettime(Process::CLOCK_MONOTONIC)
23
24
 
25
+ @logger&.error "Timer spected to sleep a negative time #{to_sleep}" if to_sleep.negative?
26
+
24
27
  sleep to_sleep if to_sleep > 0.0
25
28
  end
26
29
 
data/lib/musa-dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.23.13'
2
+ VERSION = '0.23.17'
3
3
  end
4
4
 
5
5
  require_relative 'musa-dsl/core-ext'
data/musa-dsl.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'musa-dsl'
3
- s.version = '0.23.13'
4
- s.date = '2021-09-02'
3
+ s.version = '0.23.17'
4
+ s.date = '2021-09-27'
5
5
  s.summary = 'A simple Ruby DSL for making complex music'
6
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']
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.23.13
4
+ version: 0.23.17
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: 2021-09-02 00:00:00.000000000 Z
11
+ date: 2021-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: citrus