musa-dsl 0.23.18 → 0.23.22

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: 7b3da8a6794922e430f83799de2679402d3bfefda3208fa1788f0beedb1ae55e
4
- data.tar.gz: 8583d5e0e518ff221cdf8b3f7cd6bc96ffe5a2c8b6c86ae53eb7d339b2a0eabd
3
+ metadata.gz: e29d8270f71037a8b9463b9aeecb86a1b1e2387078ff31c0db4d9e2688d91a8a
4
+ data.tar.gz: 1c10fd8b4656376184274828d75fc32162ee45247fd9b660ecdd792ebbf0469b
5
5
  SHA512:
6
- metadata.gz: 06642f37659b697dca34396cca40aaa0ee30788cb2905e29ae9e2be16d3df570e1195996d50b81d10506059b37ef319f0c7c0aec8ccf789a35dc5d4734ba19ce
7
- data.tar.gz: bd2c24988b5f1ef6e11d3b426de27a8ed46a9ca14f08f4d7eb1fbcff95e6854f839bb369e716c3ed05b393852571440bffbb223e2d3333a82900b62ffd0ce0db
6
+ metadata.gz: 2c6257b0fe2142959b31e66be05c14ea98ec7754a962ebd047f414e1e694b4e8ccab6cfc284a55002951e6bdb93d807b14b4e513305d3da45b4ac692122111e5
7
+ data.tar.gz: ced439462deba1da30f80e3c1fd4e8a822583a89f6c48bf133fb47d08a3eb7c8d45cde012f640fb5bc43793db92a7d036572ad18bac313612b85a4058096d058
@@ -1,4 +1,5 @@
1
1
  require 'socket'
2
+ require 'pathname'
2
3
 
3
4
  module Musa
4
5
  module REPL
@@ -37,7 +38,13 @@ module Musa
37
38
 
38
39
  line.chomp!
39
40
  case line
41
+ when '#path'
42
+ buffer = StringIO.new
43
+
40
44
  when '#begin'
45
+ user_path = buffer&.string
46
+ binder.receiver.instance_variable_set(:@user_pathname, Pathname.new(user_path)) if user_path
47
+
41
48
  buffer = StringIO.new
42
49
 
43
50
  when '#end'
@@ -4,7 +4,7 @@ module Musa::Sequencer
4
4
  class BaseSequencer
5
5
  using Musa::Extension::InspectNice
6
6
 
7
- private def _play_timed(timed_serie, control, &block)
7
+ private def _play_timed(timed_serie, start_position, control, &block)
8
8
 
9
9
  if first_value_sample = timed_serie.peek_next_value
10
10
  debug "_play_timed: first_value_sample #{first_value_sample}"
@@ -25,7 +25,7 @@ module Musa::Sequencer
25
25
  binder = Musa::Extension::SmartProcBinder::SmartProcBinder.new(block)
26
26
 
27
27
  _play_timed_step(hash_mode, component_ids, extra_attribute_names, timed_serie,
28
- position, last_positions, binder, control)
28
+ start_position, last_positions, binder, control)
29
29
  end
30
30
 
31
31
  private def _play_timed_step(hash_mode,
@@ -21,9 +21,9 @@ module Musa
21
21
  logger: nil,
22
22
  do_log: nil, do_error_log: nil, log_position_format: nil)
23
23
 
24
- raise ArgumentError,
25
- "'beats_per_bar' and 'ticks_per_beat' parameters should be both nil or both have values" \
26
- unless beats_per_bar && ticks_per_beat || beats_per_bar.nil? && ticks_per_beat.nil?
24
+ unless beats_per_bar && ticks_per_beat || beats_per_bar.nil? && ticks_per_beat.nil?
25
+ raise ArgumentError, "'beats_per_bar' and 'ticks_per_beat' parameters should be both nil or both have values"
26
+ end
27
27
 
28
28
  if logger
29
29
  @logger = logger
@@ -39,9 +39,9 @@ module Musa
39
39
  @beats_per_bar = Rational(beats_per_bar)
40
40
  @ticks_per_beat = Rational(ticks_per_beat)
41
41
 
42
- self.singleton_class.include TickBasedTiming
42
+ singleton_class.include TickBasedTiming
43
43
  else
44
- self.singleton_class.include TicklessBasedTiming
44
+ singleton_class.include TicklessBasedTiming
45
45
  end
46
46
 
47
47
  _init_timing
@@ -215,10 +215,13 @@ module Musa
215
215
  end
216
216
 
217
217
  def play_timed(timed_serie,
218
+ at: nil,
218
219
  on_stop: nil,
219
220
  after_bars: nil, after: nil,
220
221
  &block)
221
222
 
223
+ at ||= position
224
+
222
225
  control = PlayTimedControl.new(@event_handlers.last,
223
226
  on_stop: on_stop, after_bars: after_bars, after: after)
224
227
 
@@ -230,7 +233,7 @@ module Musa
230
233
 
231
234
  @event_handlers.push control
232
235
 
233
- _play_timed(timed_serie.instance, control, &block)
236
+ _play_timed(timed_serie.instance, at, control, &block)
234
237
 
235
238
  @event_handlers.pop
236
239
 
@@ -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, logger: nil, do_log: nil)
6
+ def initialize(period = nil, ticks_per_beat: nil, bpm: nil, correction: nil, delayed_ticks_error: nil, logger: nil, do_log: nil)
7
7
  do_log ||= false
8
8
 
9
9
  super()
@@ -20,6 +20,7 @@ module Musa
20
20
  @started = false
21
21
  @paused = false
22
22
 
23
+ @delayed_ticks_error = delayed_ticks_error
23
24
  @logger = logger
24
25
  @do_log = do_log
25
26
  end
@@ -56,7 +57,12 @@ module Musa
56
57
  @run = true
57
58
 
58
59
  while @run
59
- @timer = Timer.new(@period, correction: @correction, stop: true, logger: @logger, do_log: @do_log)
60
+ @timer = Timer.new(@period,
61
+ correction: @correction,
62
+ stop: true,
63
+ delayed_ticks_error: @delayed_ticks_error,
64
+ logger: @logger,
65
+ do_log: @do_log)
60
66
 
61
67
  @timer.run do
62
68
  yield if block_given?
@@ -3,10 +3,12 @@ module Musa
3
3
  class Timer
4
4
  attr_accessor :period
5
5
 
6
- def initialize(period_in_seconds, correction: nil, stop: nil, logger: nil, do_log: nil)
7
- @period = period_in_seconds.rationalize
6
+ def initialize(tick_period_in_seconds, correction: nil, stop: nil, delayed_ticks_error: nil, logger: nil, do_log: nil)
7
+ @period = tick_period_in_seconds.rationalize
8
8
  @correction = (correction || 0r).rationalize
9
9
  @stop = stop || false
10
+
11
+ @delayed_ticks_error = delayed_ticks_error || 1.0
10
12
  @logger = logger
11
13
  @do_log = do_log
12
14
  end
@@ -21,10 +23,15 @@ module Musa
21
23
  yield
22
24
 
23
25
  @next_moment += @period
24
- to_sleep = (@next_moment + @correction) - Process.clock_gettime(Process::CLOCK_MONOTONIC)
25
-
26
- if @do_log && to_sleep.negative?
27
- @logger&.error "Timer delayed #{-to_sleep}s (near #{(-to_sleep / @period).round} ticks)"
26
+ to_sleep = (@next_moment + @correction) - Process.clock_gettime(Process::CLOCK_MONOTONIC)
27
+
28
+ if @do_log && to_sleep.negative? & @logger
29
+ tick_errors = -to_sleep / @period
30
+ if tick_errors >= @delayed_ticks_error
31
+ @logger.error "Timer delayed #{tick_errors.round(2)} ticks (#{-to_sleep.round(3)}s)"
32
+ else
33
+ @logger.warn "Timer delayed #{tick_errors.round(2)} ticks (#{-to_sleep.round(3)}s)"
34
+ end
28
35
  end
29
36
 
30
37
  sleep to_sleep if to_sleep > 0.0
data/lib/musa-dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.23.18'
2
+ VERSION = '0.23.22'
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.18'
4
- s.date = '2021-09-28'
3
+ s.version = '0.23.22'
4
+ s.date = '2021-10-26'
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.18
4
+ version: 0.23.22
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-28 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: citrus