musa-dsl 0.14.26 → 0.14.29
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f74dd3331fee5343754a2a50d2a8b449588e2bf4355bcc0c040aae1d3947ed4
|
4
|
+
data.tar.gz: '009c5e942ef81604a8c0742deb8ad0c54e196a4236e0f3d5635948754194d7d1'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b731f4fc517e25458f7592ef2e79b6ed4b15ef9ba2e08d099879cb1ba83075da8fdb677a76ac937a42efad4e99f4d40b1e43949cc0b06e11d8c396cd31beea2
|
7
|
+
data.tar.gz: e245ea33a9f473a8676c9ace488287f33977bb66e8dc0bfc24fc3737ef4fcabe461ba05303aa96bafe974b85127f0fc258b81100ea0dbdd8d954f1c5aa73e228
|
@@ -7,6 +7,54 @@ require_relative 'base-sequencer-implementation-play-helper'
|
|
7
7
|
class Musa::BaseSequencer
|
8
8
|
private
|
9
9
|
|
10
|
+
def _tick
|
11
|
+
position_to_run = @position_mutex.synchronize { @position += 1 }
|
12
|
+
|
13
|
+
@before_tick.each { |block| block.call Rational(position_to_run, @ticks_per_bar) }
|
14
|
+
|
15
|
+
if @score[position_to_run]
|
16
|
+
@score[position_to_run].each do |command|
|
17
|
+
|
18
|
+
if command.key?(:parent_control) && !command[:parent_control].stopped?
|
19
|
+
@event_handlers.push command[:parent_control]
|
20
|
+
|
21
|
+
@@tick_mutex.synchronize do
|
22
|
+
original_stdout = $stdout
|
23
|
+
original_stderr = $stderr
|
24
|
+
|
25
|
+
$stdout = command[:parent_control].stdout
|
26
|
+
$stderr = command[:parent_control].stderr
|
27
|
+
|
28
|
+
command[:block]._call command[:value_parameters], command[:key_parameters] if command[:block]
|
29
|
+
|
30
|
+
$stdout = original_stdout
|
31
|
+
$stderr = original_stderr
|
32
|
+
end
|
33
|
+
|
34
|
+
@event_handlers.pop
|
35
|
+
else
|
36
|
+
@@tick_mutex.synchronize do
|
37
|
+
command[:block]._call command[:value_parameters], command[:key_parameters] if command[:block]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
@score.delete position_to_run
|
43
|
+
end
|
44
|
+
|
45
|
+
Thread.pass
|
46
|
+
end
|
47
|
+
|
48
|
+
def _hold_public_ticks
|
49
|
+
@hold_public_ticks = true
|
50
|
+
end
|
51
|
+
|
52
|
+
def _release_public_ticks
|
53
|
+
@hold_ticks.times { _tick }
|
54
|
+
@hold_ticks = 0
|
55
|
+
@hold_public_ticks = false
|
56
|
+
end
|
57
|
+
|
10
58
|
def _raw_numeric_at(bar_position, force_first: nil, &block)
|
11
59
|
force_first ||= false
|
12
60
|
|
@@ -24,6 +24,10 @@ class Musa::BaseSequencer
|
|
24
24
|
@ticks_per_bar = Rational(beats_per_bar * ticks_per_beat)
|
25
25
|
@tick_duration = Rational(1, @ticks_per_bar)
|
26
26
|
|
27
|
+
@position_mutex = Mutex.new
|
28
|
+
@hold_public_ticks = false
|
29
|
+
@hold_ticks = 0
|
30
|
+
|
27
31
|
@score = {}
|
28
32
|
|
29
33
|
@everying = []
|
@@ -43,42 +47,14 @@ class Musa::BaseSequencer
|
|
43
47
|
|
44
48
|
@event_handlers = [EventHandler.new]
|
45
49
|
|
46
|
-
@position = @ticks_per_bar - 1
|
50
|
+
@position = @position_mutex.synchronize { @ticks_per_bar - 1 }
|
47
51
|
end
|
48
52
|
|
49
53
|
def tick
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
if @score[position_to_run]
|
55
|
-
@score[position_to_run].each do |command|
|
56
|
-
|
57
|
-
if command.key?(:parent_control) && !command[:parent_control].stopped?
|
58
|
-
@event_handlers.push command[:parent_control]
|
59
|
-
|
60
|
-
@@tick_mutex.synchronize do
|
61
|
-
original_stdout = $stdout
|
62
|
-
original_stderr = $stderr
|
63
|
-
|
64
|
-
$stdout = command[:parent_control].stdout
|
65
|
-
$stderr = command[:parent_control].stderr
|
66
|
-
|
67
|
-
command[:block]._call command[:value_parameters], command[:key_parameters] if command[:block]
|
68
|
-
|
69
|
-
$stdout = original_stdout
|
70
|
-
$stderr = original_stderr
|
71
|
-
end
|
72
|
-
|
73
|
-
@event_handlers.pop
|
74
|
-
else
|
75
|
-
@@tick_mutex.synchronize do
|
76
|
-
command[:block]._call command[:value_parameters], command[:key_parameters] if command[:block]
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
@score.delete position_to_run
|
54
|
+
if @hold_public_ticks
|
55
|
+
@hold_ticks += 1
|
56
|
+
else
|
57
|
+
_tick
|
82
58
|
end
|
83
59
|
end
|
84
60
|
|
@@ -123,11 +99,13 @@ class Musa::BaseSequencer
|
|
123
99
|
|
124
100
|
raise ArgumentError, "Sequencer #{self}: cannot move back. current position: #{@position} new position: #{position}" if position < @position
|
125
101
|
|
102
|
+
_hold_public_ticks
|
126
103
|
@on_fast_forward.each { |block| block.call(true) }
|
127
104
|
|
128
|
-
|
105
|
+
_tick while @position < position
|
129
106
|
|
130
107
|
@on_fast_forward.each { |block| block.call(false) }
|
108
|
+
_release_public_ticks
|
131
109
|
end
|
132
110
|
|
133
111
|
def on(event, &block)
|
@@ -82,24 +82,23 @@ module Musa
|
|
82
82
|
|
83
83
|
raise ArgumentError, "undefined new position" unless position
|
84
84
|
|
85
|
-
tick_before_position = position - @sequencer.tick_duration
|
86
|
-
|
87
85
|
warn "Transport: received message position change to #{position}" if @do_log
|
88
86
|
|
89
87
|
start_again_later = false
|
90
88
|
|
91
|
-
if @sequencer.position >
|
89
|
+
if @sequencer.position > position
|
92
90
|
do_stop
|
93
91
|
start_again_later = true
|
94
92
|
end
|
95
93
|
|
96
|
-
warn "Transport: setting sequencer position #{
|
97
|
-
@sequencer.position = tick_before_position
|
94
|
+
warn "Transport: setting sequencer position #{position}" if @do_log
|
98
95
|
|
99
96
|
@sequencer.raw_at position, force_first: true do
|
100
97
|
@on_change_position.each { |block| block.call @sequencer }
|
101
98
|
end
|
102
99
|
|
100
|
+
@sequencer.position = position
|
101
|
+
|
103
102
|
do_on_start if start_again_later
|
104
103
|
end
|
105
104
|
|
data/musa-dsl.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'musa-dsl'
|
3
|
-
s.version = '0.14.
|
3
|
+
s.version = '0.14.29'
|
4
4
|
s.date = '2019-09-30'
|
5
5
|
s.summary = 'A simple Ruby DSL for making complex music'
|
6
6
|
s.description = 'Musa-DSL: A Ruby DSL for algorithmic music composition, device language neutral (MIDI, OSC, etc)'
|