musa-dsl 0.23.13 → 0.23.17

Sign up to get free protection for your applications and to get access to all the features.
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