musa-dsl 0.26.5 → 0.26.8
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 +4 -4
- data/.github/workflows/gem-test-and-push.yml +6 -20
- data/Gemfile +3 -0
- data/lib/musa-dsl/core-ext/smart-proc-binder.rb +10 -10
- data/lib/musa-dsl/datasets/e.rb +1 -1
- data/lib/musa-dsl/datasets/gdvd.rb +1 -1
- data/lib/musa-dsl/generative/{backboner.rb → rules.rb} +34 -21
- data/lib/musa-dsl/generative.rb +1 -1
- data/lib/musa-dsl/music/chord-definition.rb +20 -6
- data/lib/musa-dsl/music/chord-definitions.rb +10 -2
- data/lib/musa-dsl/music/chords.rb +135 -241
- data/lib/musa-dsl/music/equally-tempered-12-tone-scale-system.rb +28 -28
- data/lib/musa-dsl/music/scales.rb +22 -12
- data/lib/musa-dsl/neumalang/neumalang.citrus +10 -4
- data/lib/musa-dsl/neumalang/neumalang.rb +14 -3
- data/lib/musa-dsl/repl/repl.rb +7 -3
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-helper.rb +78 -70
- data/lib/musa-dsl/sequencer/base-sequencer-implementation-play.rb +18 -11
- data/lib/musa-dsl/sequencer/base-sequencer-implementation.rb +8 -8
- data/lib/musa-dsl/sequencer/sequencer-dsl.rb +1 -3
- data/lib/musa-dsl/series/main-serie-operations.rb +10 -3
- data/lib/musa-dsl/transport/input-midi-clock.rb +12 -1
- data/lib/musa-dsl.rb +2 -2
- data/musa-dsl.gemspec +3 -3
- metadata +6 -6
@@ -15,7 +15,7 @@ grammar Musa::Neumalang::Neumalang::Parser::Grammar::Grammar
|
|
15
15
|
|
16
16
|
rule object_expression
|
17
17
|
braced_command |
|
18
|
-
|
18
|
+
referenced_braced_command |
|
19
19
|
bracketed_expression |
|
20
20
|
use_variable |
|
21
21
|
constant |
|
@@ -26,8 +26,8 @@ grammar Musa::Neumalang::Neumalang::Parser::Grammar::Grammar
|
|
26
26
|
vector
|
27
27
|
end
|
28
28
|
|
29
|
-
rule
|
30
|
-
(ampersand optional_separation
|
29
|
+
rule referenced_braced_command
|
30
|
+
(ampersand optional_separation braced_command) <Musa::Neumalang::Neumalang::Parser::ReferencedBracedCommand>
|
31
31
|
end
|
32
32
|
|
33
33
|
rule variable_assign
|
@@ -67,7 +67,13 @@ grammar Musa::Neumalang::Neumalang::Parser::Grammar::Grammar
|
|
67
67
|
end
|
68
68
|
|
69
69
|
rule parameters
|
70
|
-
(lpar parameter (comma parameter)* optional_separation rpar)
|
70
|
+
(lpar parameter? (comma parameter)* optional_separation rpar codeblock?)
|
71
|
+
<Musa::Neumalang::Neumalang::Parser::Parameters>
|
72
|
+
end
|
73
|
+
|
74
|
+
rule codeblock
|
75
|
+
(ampersand lpar (braced_command | referenced_braced_command | use_variable) rpar)
|
76
|
+
<Musa::Neumalang::Neumalang::Parser::Codeblock>
|
71
77
|
end
|
72
78
|
|
73
79
|
rule parameter
|
@@ -33,10 +33,10 @@ module Musa
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
module
|
36
|
+
module ReferencedBracedCommand
|
37
37
|
def value
|
38
|
-
{ kind: :
|
39
|
-
|
38
|
+
{ kind: :command_reference,
|
39
|
+
command: capture(:braced_command).value }.extend Musa::Neumas::Neuma
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -74,10 +74,21 @@ module Musa
|
|
74
74
|
{}.tap do |_|
|
75
75
|
_[:value_parameters] = value_parameters unless value_parameters.empty?
|
76
76
|
_[:key_parameters] = key_value_parameters unless key_value_parameters.empty?
|
77
|
+
|
78
|
+
_[:proc_parameter] = capture(:codeblock).value if capture(:codeblock)
|
77
79
|
end
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
83
|
+
module Codeblock
|
84
|
+
def value
|
85
|
+
{ codeblock:
|
86
|
+
capture(:braced_command)&.value ||
|
87
|
+
capture(:referenced_braced_command)&.value ||
|
88
|
+
capture(:use_variable)&.value }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
81
92
|
module Parameter
|
82
93
|
def value
|
83
94
|
if capture(:key_value_parameter)
|
data/lib/musa-dsl/repl/repl.rb
CHANGED
@@ -113,11 +113,15 @@ module Musa
|
|
113
113
|
@client_threads.clear
|
114
114
|
end
|
115
115
|
|
116
|
-
def puts(
|
116
|
+
def puts(*messages)
|
117
117
|
if @connection
|
118
|
-
|
118
|
+
messages.each do |message|
|
119
|
+
send output: @connection, content: message&.to_s
|
120
|
+
end
|
119
121
|
else
|
120
|
-
@logger.warn('REPL')
|
122
|
+
@logger.warn('REPL') do
|
123
|
+
"trying to print a message in MusaLCE but the client is not connected. Ignoring message \'#{message} \'."
|
124
|
+
end
|
121
125
|
end
|
122
126
|
end
|
123
127
|
|
@@ -35,6 +35,7 @@ module Musa
|
|
35
35
|
class AtModePlayEval < PlayEval
|
36
36
|
def initialize(block_procedure_binder)
|
37
37
|
@block_procedure_binder = block_procedure_binder
|
38
|
+
super()
|
38
39
|
end
|
39
40
|
|
40
41
|
def run_operation(element)
|
@@ -42,20 +43,22 @@ module Musa
|
|
42
43
|
|
43
44
|
if element.is_a? Hash
|
44
45
|
value = {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
current_operation: :block,
|
47
|
+
current_block: @block_procedure_binder,
|
48
|
+
current_parameter: element,
|
49
|
+
continue_operation: :at,
|
50
|
+
continue_parameter: element[:at]
|
50
51
|
}
|
51
52
|
end
|
52
53
|
|
53
54
|
value ||= {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
current_operation: @block_procedure_binder,
|
56
|
+
current_parameter: element,
|
57
|
+
continue_operation: :at,
|
58
|
+
continue_parameter: position
|
58
59
|
}
|
60
|
+
|
61
|
+
value
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
@@ -66,6 +69,7 @@ module Musa
|
|
66
69
|
|
67
70
|
def initialize(block_procedure_binder)
|
68
71
|
@block_procedure_binder = block_procedure_binder
|
72
|
+
super()
|
69
73
|
end
|
70
74
|
|
71
75
|
def run_operation(element)
|
@@ -76,30 +80,30 @@ module Musa
|
|
76
80
|
element = AbsD.to_AbsD(element)
|
77
81
|
|
78
82
|
value = {
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
current_operation: :block,
|
84
|
+
current_block: @block_procedure_binder,
|
85
|
+
current_parameter: element,
|
86
|
+
continue_operation: :wait,
|
87
|
+
continue_parameter: element.forward_duration
|
84
88
|
}
|
85
89
|
end
|
86
90
|
|
87
91
|
if element.key? :wait_event
|
88
92
|
value = {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
93
|
+
current_operation: :block,
|
94
|
+
current_block: @block_procedure_binder,
|
95
|
+
current_parameter: element,
|
96
|
+
continue_operation: :on,
|
97
|
+
continue_parameter: element[:wait_event]
|
94
98
|
}
|
95
99
|
end
|
96
100
|
end
|
97
101
|
|
98
102
|
value ||= {
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
+
current_operation: :block,
|
104
|
+
current_block: @block_procedure_binder,
|
105
|
+
current_parameter: element,
|
106
|
+
continue_operation: :now
|
103
107
|
}
|
104
108
|
|
105
109
|
value
|
@@ -115,8 +119,8 @@ module Musa
|
|
115
119
|
|
116
120
|
@@id = 0
|
117
121
|
|
118
|
-
attr_reader :neumalang_context
|
119
|
-
|
122
|
+
attr_reader :neumalang_context,
|
123
|
+
:block_procedure_binder
|
120
124
|
|
121
125
|
def initialize(block_procedure_binder, decoder, nl_context, parent: nil)
|
122
126
|
@id = @@id += 1
|
@@ -127,6 +131,8 @@ module Musa
|
|
127
131
|
@nl_context = nl_context
|
128
132
|
|
129
133
|
@nl_context ||= Object.new
|
134
|
+
|
135
|
+
super()
|
130
136
|
end
|
131
137
|
|
132
138
|
def subcontext
|
@@ -138,17 +144,17 @@ module Musa
|
|
138
144
|
AbsD.to_AbsD(element)
|
139
145
|
else
|
140
146
|
case element[:kind]
|
141
|
-
when :serie
|
142
|
-
when :parallel
|
143
|
-
when :assign_to
|
144
|
-
when :use_variable
|
145
|
-
when :command
|
146
|
-
when :value
|
147
|
-
when :gdvd
|
148
|
-
when :p
|
149
|
-
when :call_methods
|
150
|
-
when :
|
151
|
-
when :event
|
147
|
+
when :serie then eval_serie element[:serie]
|
148
|
+
when :parallel then eval_parallel element[:parallel]
|
149
|
+
when :assign_to then eval_assign_to element[:assign_to], element[:assign_value]
|
150
|
+
when :use_variable then eval_use_variable element[:use_variable]
|
151
|
+
when :command then eval_command element[:command], element[:value_parameters], element[:key_parameters]
|
152
|
+
when :value then eval_value element[:value]
|
153
|
+
when :gdvd then eval_gdvd element[:gdvd]
|
154
|
+
when :p then eval_p element[:p]
|
155
|
+
when :call_methods then eval_call_methods element[:on], element[:call_methods]
|
156
|
+
when :command_reference then eval_command_reference element[:command]
|
157
|
+
when :event then element
|
152
158
|
else
|
153
159
|
raise ArgumentError, "eval_element: don't know how to process #{element}"
|
154
160
|
end
|
@@ -197,10 +203,10 @@ module Musa
|
|
197
203
|
|
198
204
|
def eval_command(block, value_parameters, key_parameters)
|
199
205
|
_value_parameters = value_parameters ? value_parameters.collect { |e| subcontext.eval_element(e) } : []
|
200
|
-
_key_parameters = key_parameters ? key_parameters.
|
206
|
+
_key_parameters = key_parameters ? key_parameters.transform_values { |e| subcontext.eval_element(e) } : {}
|
201
207
|
|
202
|
-
# used instance_exec because the code on block comes from a neumalang source, so the correct
|
203
|
-
# (no other context has any sense)
|
208
|
+
# used instance_exec because the code on block comes from a neumalang source, so the correct
|
209
|
+
# execution context is the neumalang context (no other context has any sense)
|
204
210
|
#
|
205
211
|
@nl_context.instance_exec *_value_parameters, **_key_parameters, &block
|
206
212
|
end
|
@@ -211,38 +217,43 @@ module Musa
|
|
211
217
|
value = play_eval.eval_element on
|
212
218
|
|
213
219
|
if value.is_a? Parallel
|
214
|
-
value.collect
|
215
|
-
call_methods.each do |methd|
|
216
|
-
value_parameters = methd[:value_parameters] ? methd[:value_parameters].collect { |e| play_eval.subcontext.eval_element(e) } : []
|
217
|
-
key_parameters = methd[:key_parameters] ? methd[:key_parameters].collect { |k, e| [k, play_eval.subcontext.eval_element(e)] }.to_h : {}
|
218
|
-
|
219
|
-
_value = _value.send methd[:method], *value_parameters, **key_parameters
|
220
|
-
end
|
221
|
-
|
222
|
-
_value
|
223
|
-
end.extend Parallel
|
220
|
+
value.collect { |_value| eval_methods(play_eval, _value, call_methods) }.extend Parallel
|
224
221
|
else
|
225
|
-
|
226
|
-
|
227
|
-
|
222
|
+
eval_methods(play_eval, value, call_methods)
|
223
|
+
end
|
224
|
+
end
|
228
225
|
|
229
|
-
|
230
|
-
|
226
|
+
def eval_methods(play_eval, value, methods)
|
227
|
+
methods.each do |methd|
|
228
|
+
value_parameters = methd[:value_parameters]&.collect { |e| play_eval.subcontext.eval_element(e) } || []
|
229
|
+
key_parameters = methd[:key_parameters]&.transform_values { |e| play_eval.subcontext.eval_element(e) } || {}
|
230
|
+
proc_parameter = eval_proc_parameter(methd[:proc_parameter][:codeblock]) if methd[:proc_parameter]
|
231
231
|
|
232
|
-
value
|
232
|
+
value = value.send methd[:method], *value_parameters, **key_parameters, &proc_parameter
|
233
233
|
end
|
234
|
+
|
235
|
+
value
|
236
|
+
end
|
237
|
+
|
238
|
+
def eval_command_reference(element)
|
239
|
+
element[:command]
|
234
240
|
end
|
235
241
|
|
236
|
-
def
|
237
|
-
|
242
|
+
def eval_proc_parameter(element)
|
243
|
+
case element
|
244
|
+
when Proc
|
245
|
+
element
|
246
|
+
when nil
|
247
|
+
nil
|
248
|
+
else
|
238
249
|
case element[:kind]
|
250
|
+
when :use_variable
|
251
|
+
eval_proc_parameter(eval_use_variable(element[:use_variable]))
|
252
|
+
when :command_reference
|
253
|
+
eval_proc_parameter(element[:command])
|
239
254
|
when :command
|
240
255
|
element[:command]
|
241
|
-
else
|
242
|
-
raise ArgumentError, "eval_reference(&): don't know how to process element #{element}"
|
243
256
|
end
|
244
|
-
else
|
245
|
-
raise ArgumentError, "eval_reference(&): don't know how to process element #{element}"
|
246
257
|
end
|
247
258
|
end
|
248
259
|
|
@@ -264,7 +275,7 @@ module Musa
|
|
264
275
|
|
265
276
|
when Parallel
|
266
277
|
{ current_operation: :parallel_play,
|
267
|
-
current_parameter: element.
|
278
|
+
current_parameter: element.tap { |e| e.each(&:restart) } }
|
268
279
|
|
269
280
|
when Array
|
270
281
|
{ current_operation: :no_eval_play,
|
@@ -322,18 +333,15 @@ module Musa
|
|
322
333
|
run_operation eval_use_variable(element[:use_variable])
|
323
334
|
|
324
335
|
when :event
|
325
|
-
value_parameters = element[:value_parameters]
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
key_parameters = element[:key_parameters] ?
|
330
|
-
element[:key_parameters].collect { |k, e| [k, subcontext.eval_element(e)] }.to_h :
|
331
|
-
{}
|
336
|
+
value_parameters = element[:value_parameters]&.collect { |e| subcontext.eval_element(e) } || []
|
337
|
+
key_parameters = element[:key_parameters]&.transform_values { |e| subcontext.eval_element(e) } || {}
|
338
|
+
proc_parameter = eval_proc_parameter(element[:proc_parameter][:codeblock]) if element[:proc_parameter]
|
332
339
|
|
333
340
|
{ current_operation: :event,
|
334
341
|
current_event: element[:event],
|
335
342
|
current_value_parameters: value_parameters,
|
336
343
|
current_key_parameters: key_parameters,
|
344
|
+
current_proc_parameter: proc_parameter,
|
337
345
|
continue_operation: :now }
|
338
346
|
|
339
347
|
when :command
|
@@ -343,7 +351,7 @@ module Musa
|
|
343
351
|
run_operation eval_call_methods(element[:on], element[:call_methods])
|
344
352
|
|
345
353
|
when :reference
|
346
|
-
run_operation
|
354
|
+
run_operation eval_command_reference(element[:reference])
|
347
355
|
|
348
356
|
else
|
349
357
|
raise ArgumentError, "run_operation: don't know how to process #{element}"
|
@@ -44,13 +44,20 @@ module Musa::Sequencer
|
|
44
44
|
|
45
45
|
case operation[:current_operation]
|
46
46
|
when :none
|
47
|
+
# do nothing
|
47
48
|
when :block
|
48
|
-
|
49
|
+
# duplicating parameters as direct object value (operation[:current_parameter])
|
50
|
+
# and key_passed parameters (**operation[:current_parameter])
|
51
|
+
#
|
52
|
+
__play_eval.block_procedure_binder.call operation[:current_parameter],
|
53
|
+
**operation[:current_parameter],
|
54
|
+
control: control
|
49
55
|
|
50
56
|
when :event
|
51
57
|
control._launch operation[:current_event],
|
52
58
|
operation[:current_value_parameters],
|
53
|
-
operation[:current_key_parameters]
|
59
|
+
operation[:current_key_parameters],
|
60
|
+
operation[:current_proc_parameter]
|
54
61
|
|
55
62
|
when :play
|
56
63
|
control2 = PlayControl.new control
|
@@ -97,7 +104,7 @@ module Musa::Sequencer
|
|
97
104
|
|
98
105
|
control2.on :sync do
|
99
106
|
counter -= 1
|
100
|
-
_play serie, control, __play_eval: __play_eval, **mode_args if counter
|
107
|
+
_play serie, control, __play_eval: __play_eval, **mode_args if counter.zero?
|
101
108
|
end
|
102
109
|
end
|
103
110
|
|
@@ -151,18 +158,18 @@ module Musa::Sequencer
|
|
151
158
|
def store_continuation(sequencer:, serie:, neumalang_context:, mode:, decoder:, play_eval:, mode_args:)
|
152
159
|
@continuation_sequencer = sequencer
|
153
160
|
@continuation_parameters = {
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
+
serie: serie,
|
162
|
+
control: self,
|
163
|
+
neumalang_context: neumalang_context,
|
164
|
+
mode: mode,
|
165
|
+
decoder: decoder,
|
166
|
+
play_eval: play_eval,
|
167
|
+
mode_args: mode_args }
|
161
168
|
end
|
162
169
|
|
163
170
|
def continue
|
164
171
|
super
|
165
|
-
@continuation_sequencer
|
172
|
+
@continuation_sequencer&.continuation_play(@continuation_parameters)
|
166
173
|
end
|
167
174
|
|
168
175
|
def after(bars = nil, &block)
|
@@ -18,13 +18,13 @@ module Musa::Sequencer
|
|
18
18
|
@event_handlers.push command[:parent_control]
|
19
19
|
|
20
20
|
@tick_mutex.synchronize do
|
21
|
-
command[:block]
|
21
|
+
command[:block]&.call *command[:value_parameters], **command[:key_parameters]
|
22
22
|
end
|
23
23
|
|
24
24
|
@event_handlers.pop
|
25
25
|
else
|
26
26
|
@tick_mutex.synchronize do
|
27
|
-
command[:block]
|
27
|
+
command[:block]&.call *command[:value_parameters], **command[:key_parameters]
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -72,7 +72,7 @@ module Musa::Sequencer
|
|
72
72
|
key_parameters[:control] = control if block_key_parameters_binder.key?(:control)
|
73
73
|
|
74
74
|
if at_position == @position
|
75
|
-
@on_debug_at.each
|
75
|
+
@on_debug_at.each(&:call) if @logger.sev_threshold >= ::Logger::Severity::DEBUG
|
76
76
|
|
77
77
|
begin
|
78
78
|
locked = @tick_mutex.try_lock
|
@@ -169,24 +169,24 @@ module Musa::Sequencer
|
|
169
169
|
@handlers[event][name] = { block: Musa::Extension::SmartProcBinder::SmartProcBinder.new(block), only_once: only_once }
|
170
170
|
end
|
171
171
|
|
172
|
-
def launch(event, *value_parameters, **key_parameters)
|
173
|
-
_launch event, value_parameters, key_parameters
|
172
|
+
def launch(event, *value_parameters, **key_parameters, &proc_parameter)
|
173
|
+
_launch event, value_parameters, key_parameters, proc_parameter
|
174
174
|
end
|
175
175
|
|
176
|
-
def _launch(event, value_parameters = nil, key_parameters = nil)
|
176
|
+
def _launch(event, value_parameters = nil, key_parameters = nil, proc_parameter = nil)
|
177
177
|
value_parameters ||= []
|
178
178
|
key_parameters ||= {}
|
179
179
|
processed = false
|
180
180
|
|
181
181
|
if @handlers.key? event
|
182
182
|
@handlers[event].each do |name, handler|
|
183
|
-
handler[:block].call *value_parameters, **key_parameters
|
183
|
+
handler[:block].call *value_parameters, **key_parameters, &proc_parameter
|
184
184
|
@handlers[event].delete name if handler[:only_once]
|
185
185
|
processed = true
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
-
@parent._launch event, value_parameters, key_parameters if @parent && !processed
|
189
|
+
@parent._launch event, value_parameters, key_parameters, proc_parameter if @parent && !processed
|
190
190
|
end
|
191
191
|
|
192
192
|
def inspect
|
@@ -2,8 +2,6 @@ require 'forwardable'
|
|
2
2
|
|
3
3
|
require_relative '../core-ext/with'
|
4
4
|
|
5
|
-
module TEMP; end
|
6
|
-
|
7
5
|
module Musa
|
8
6
|
module Sequencer
|
9
7
|
class Sequencer
|
@@ -41,7 +39,7 @@ module Musa
|
|
41
39
|
do_error_log: do_error_log,
|
42
40
|
log_position_format: log_position_format
|
43
41
|
|
44
|
-
|
42
|
+
dsl_context_class ||= DSLContext
|
45
43
|
|
46
44
|
@dsl = dsl_context_class.new @sequencer, keep_block_context: keep_block_context
|
47
45
|
|
@@ -148,7 +148,12 @@ module Musa
|
|
148
148
|
self.source = serie
|
149
149
|
self.with_sources = with_series || []
|
150
150
|
self.on_restart = on_restart
|
151
|
-
|
151
|
+
|
152
|
+
if block
|
153
|
+
self.proc = block
|
154
|
+
elsif !with_series
|
155
|
+
proc { |_| _ }
|
156
|
+
end
|
152
157
|
|
153
158
|
@isolate_values = isolate_values
|
154
159
|
|
@@ -278,7 +283,8 @@ module Musa
|
|
278
283
|
init
|
279
284
|
end
|
280
285
|
|
281
|
-
private
|
286
|
+
private :_restart
|
287
|
+
def _restart
|
282
288
|
@source.restart
|
283
289
|
if @sources.is_a? Array
|
284
290
|
@sources.each(&:restart)
|
@@ -287,7 +293,8 @@ module Musa
|
|
287
293
|
end
|
288
294
|
end
|
289
295
|
|
290
|
-
private
|
296
|
+
private :_next_value
|
297
|
+
def _next_value
|
291
298
|
value = nil
|
292
299
|
|
293
300
|
index_or_key = @source.next_value
|
@@ -21,10 +21,12 @@ module Musa
|
|
21
21
|
@logger.debug! if do_log
|
22
22
|
end
|
23
23
|
|
24
|
+
@time_table = []
|
24
25
|
@midi_parser = MIDIParser.new
|
25
26
|
end
|
26
27
|
|
27
28
|
attr_reader :input
|
29
|
+
attr_reader :time_table
|
28
30
|
|
29
31
|
def input=(input_midi_port)
|
30
32
|
@input = input_midi_port
|
@@ -121,6 +123,7 @@ module Musa
|
|
121
123
|
case m.name
|
122
124
|
when 'Start'
|
123
125
|
process_start
|
126
|
+
@time_table.clear
|
124
127
|
|
125
128
|
when 'Stop'
|
126
129
|
@logger.debug('InputMidiClock') { 'processing Stop...' }
|
@@ -135,7 +138,15 @@ module Musa
|
|
135
138
|
@logger.debug('InputMidiClock') { 'processing Continue... done' }
|
136
139
|
|
137
140
|
when 'Clock'
|
138
|
-
|
141
|
+
if block_given? && @started
|
142
|
+
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
|
143
|
+
yield
|
144
|
+
finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
|
145
|
+
|
146
|
+
duration = finish_time - start_time
|
147
|
+
@time_table[duration] ||= 0
|
148
|
+
@time_table[duration] += 1
|
149
|
+
end
|
139
150
|
|
140
151
|
when 'Song Position Pointer'
|
141
152
|
new_position_in_midi_beats = m.data[0] & 0x7F | ((m.data[1] & 0x7F) << 7)
|
data/lib/musa-dsl.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Musa
|
2
|
-
VERSION = '0.26.
|
2
|
+
VERSION = '0.26.8'.freeze
|
3
3
|
end
|
4
4
|
|
5
5
|
require_relative 'musa-dsl/core-ext'
|
@@ -54,7 +54,7 @@ module Musa::All
|
|
54
54
|
|
55
55
|
include Musa::Darwin
|
56
56
|
include Musa::Markov
|
57
|
-
include Musa::
|
57
|
+
include Musa::Rules
|
58
58
|
include Musa::Variatio
|
59
59
|
|
60
60
|
include Musa::MIDIRecorder
|
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.26.
|
4
|
-
s.date = '
|
3
|
+
s.version = '0.26.8'
|
4
|
+
s.date = '2023-05-30'
|
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']
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.required_ruby_version = '~> 2.7'
|
14
14
|
|
15
|
-
# TODO
|
15
|
+
# TODO para sistema de paquetes de MusaDSL
|
16
16
|
#s.metadata = {
|
17
17
|
# "source_code_uri" => "https://",
|
18
18
|
# "homepage_uri" => "",
|
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.26.
|
4
|
+
version: 0.26.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javier Sánchez Yeste
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logger
|
@@ -161,10 +161,10 @@ files:
|
|
161
161
|
- lib/musa-dsl/datasets/score/to-mxml/to-mxml.rb
|
162
162
|
- lib/musa-dsl/datasets/v.rb
|
163
163
|
- lib/musa-dsl/generative.rb
|
164
|
-
- lib/musa-dsl/generative/backboner.rb
|
165
164
|
- lib/musa-dsl/generative/darwin.rb
|
166
165
|
- lib/musa-dsl/generative/generative-grammar.rb
|
167
166
|
- lib/musa-dsl/generative/markov.rb
|
167
|
+
- lib/musa-dsl/generative/rules.rb
|
168
168
|
- lib/musa-dsl/generative/variatio.rb
|
169
169
|
- lib/musa-dsl/logger.rb
|
170
170
|
- lib/musa-dsl/logger/logger.rb
|
@@ -255,7 +255,7 @@ homepage: https://github.com/javier-sy/musa-dsl
|
|
255
255
|
licenses:
|
256
256
|
- LGPL-3.0
|
257
257
|
metadata: {}
|
258
|
-
post_install_message:
|
258
|
+
post_install_message:
|
259
259
|
rdoc_options: []
|
260
260
|
require_paths:
|
261
261
|
- lib
|
@@ -271,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
271
|
version: '0'
|
272
272
|
requirements: []
|
273
273
|
rubygems_version: 3.1.6
|
274
|
-
signing_key:
|
274
|
+
signing_key:
|
275
275
|
specification_version: 4
|
276
276
|
summary: A simple Ruby DSL for making complex music
|
277
277
|
test_files: []
|