musa-dsl 0.21.1 → 0.21.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/musa-dsl/logger/logger.rb +2 -2
- data/lib/musa-dsl/midi/midi-voices.rb +4 -0
- data/lib/musa-dsl/repl/repl.rb +35 -12
- data/lib/musa-dsl/transport/transport.rb +25 -12
- data/musa-dsl.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cc5aa748a51c09ce12d7ad6b17a7922d87d56742a7a03c61753e5cf05e0faac
|
4
|
+
data.tar.gz: a34656b54c6ed0997e897c8919c04e6361b85501b6c17d48b3df79797943d376
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 740ea84da6d43d290f970d4bf64d5634c80044d1be2a59508543c288dd86ed4550e990a4cedb5c1cda5a0e8c551bc1f6cf7e3625bba9748df1f438bafeb5b008
|
7
|
+
data.tar.gz: 4876305d8c5a27924796f29667fc2f4db73ef753646e561ca12b9ac2772f0dc9cf14df4996867bf64aa11af6792d0c4bfd7a423001d163a1e9afd8e943ab5db4
|
@@ -9,7 +9,7 @@ module Musa; module Logger
|
|
9
9
|
@position_format = position_format || 3.3
|
10
10
|
|
11
11
|
self.formatter = proc do |severity, time, progname, msg|
|
12
|
-
level = "[#{severity}]" unless severity == 'DEBUG'
|
12
|
+
level = "[#{severity}] " unless severity == 'DEBUG'
|
13
13
|
|
14
14
|
if msg
|
15
15
|
position = if @sequencer
|
@@ -19,7 +19,7 @@ module Musa; module Logger
|
|
19
19
|
"%#{integer_digits + decimal_digits + 1}s: " % ("%.#{decimal_digits}f" % sequencer.position.to_f)
|
20
20
|
end
|
21
21
|
|
22
|
-
progname = "[#{progname}]" if progname
|
22
|
+
progname = "[#{progname}] " if progname
|
23
23
|
|
24
24
|
"#{position}#{level}#{progname}#{msg}\n"
|
25
25
|
else
|
data/lib/musa-dsl/repl/repl.rb
CHANGED
@@ -5,9 +5,10 @@ module Musa
|
|
5
5
|
class REPL
|
6
6
|
@@repl_mutex = Mutex.new
|
7
7
|
|
8
|
-
def initialize(binder, port: nil, after_eval: nil)
|
8
|
+
def initialize(binder, port: nil, after_eval: nil, logger: nil)
|
9
9
|
port ||= 1327
|
10
|
-
|
10
|
+
|
11
|
+
@logger = logger || Musa::Logger::Logger.new
|
11
12
|
|
12
13
|
@block_source = nil
|
13
14
|
|
@@ -15,7 +16,7 @@ module Musa
|
|
15
16
|
binder.receiver.sequencer.respond_to?(:on_error)
|
16
17
|
|
17
18
|
binder.receiver.sequencer.on_error do |e|
|
18
|
-
send_exception e
|
19
|
+
send_exception e, output: @connection
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
@@ -25,12 +26,15 @@ module Musa
|
|
25
26
|
@main_thread = Thread.new do
|
26
27
|
@server = TCPServer.new(port)
|
27
28
|
begin
|
28
|
-
while (connection = @server.accept) && @run
|
29
|
+
while (@connection = @server.accept) && @run
|
29
30
|
@client_threads << Thread.new do
|
30
31
|
buffer = nil
|
31
32
|
|
32
33
|
begin
|
33
|
-
while (line = connection.gets) && @run
|
34
|
+
while (line = @connection.gets) && @run
|
35
|
+
|
36
|
+
@logger.warn('REPL') { 'input line is nil; will close connection...' } if line.nil?
|
37
|
+
|
34
38
|
line.chomp!
|
35
39
|
case line
|
36
40
|
when '#begin'
|
@@ -40,11 +44,14 @@ module Musa
|
|
40
44
|
@block_source = buffer.string
|
41
45
|
|
42
46
|
begin
|
43
|
-
send_echo @block_source, output: connection
|
47
|
+
send_echo @block_source, output: @connection
|
44
48
|
binder.eval @block_source, "(repl)", 1
|
45
49
|
|
46
50
|
rescue StandardError, ScriptError => e
|
47
|
-
|
51
|
+
@logger.debug('REPL') { 'code execution error' }
|
52
|
+
@logger.debug('REPL') { e.full_message(highlight: true, order: :top) }
|
53
|
+
|
54
|
+
send_exception e, output: @connection
|
48
55
|
else
|
49
56
|
after_eval.call @block_source if after_eval
|
50
57
|
end
|
@@ -53,16 +60,29 @@ module Musa
|
|
53
60
|
buffer.puts line
|
54
61
|
end
|
55
62
|
end
|
63
|
+
|
56
64
|
rescue IOError, Errno::ECONNRESET, Errno::EPIPE => e
|
57
|
-
warn
|
65
|
+
@logger.warn('REPL') { 'lost connection' }
|
66
|
+
@logger.warn('REPL') { e.full_message(highlight: true, order: :top) }
|
67
|
+
|
68
|
+
rescue Exception, SystemExit, Interrupt
|
69
|
+
puts "EXCEPTION / SYSTEM EXIT / INTERUPT"
|
70
|
+
$stdout.flush
|
71
|
+
@logger.warn('REPL') { 'received interruption; will close connection...' }
|
72
|
+
raise
|
73
|
+
|
74
|
+
ensure
|
75
|
+
@logger.debug("REPL") { "closing connection (running #{@run})" }
|
76
|
+
@connection.close
|
58
77
|
end
|
59
78
|
|
60
|
-
connection.close
|
61
79
|
end
|
62
80
|
end
|
63
81
|
rescue Errno::ECONNRESET, Errno::EPIPE => e
|
64
|
-
warn
|
82
|
+
@logger.warn('REPL') { 'connection failure while getting server port; will retry...' }
|
83
|
+
@logger.warn('REPL') { e.full_message(highlight: true, order: :top) }
|
65
84
|
retry
|
85
|
+
|
66
86
|
end
|
67
87
|
end
|
68
88
|
end
|
@@ -71,9 +91,10 @@ module Musa
|
|
71
91
|
@run = false
|
72
92
|
|
73
93
|
@main_thread.terminate
|
74
|
-
|
75
|
-
|
94
|
+
Thread.pass
|
76
95
|
@main_thread = nil
|
96
|
+
|
97
|
+
@client_threads.each { |t| t.terminate; Thread.pass }
|
77
98
|
@client_threads.clear
|
78
99
|
end
|
79
100
|
|
@@ -87,6 +108,8 @@ module Musa
|
|
87
108
|
|
88
109
|
def send_exception(e, output:)
|
89
110
|
|
111
|
+
@logger.error('REPL') { e.full_message(highlight: true, order: :top) }
|
112
|
+
|
90
113
|
send output: output, command: '//error'
|
91
114
|
|
92
115
|
selected_backtrace_locations = e.backtrace_locations.select { |bt| bt.path == '(repl)' }
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require_relative '../core-ext/smart-proc-binder'
|
2
|
+
require_relative '../core-ext/inspect-nice'
|
2
3
|
require_relative '../sequencer'
|
3
4
|
|
5
|
+
using Musa::Extension::InspectNice
|
6
|
+
|
4
7
|
module Musa
|
5
8
|
module Transport
|
6
9
|
class Transport
|
@@ -15,6 +18,7 @@ module Musa
|
|
15
18
|
on_start: nil,
|
16
19
|
after_stop: nil,
|
17
20
|
on_position_change: nil,
|
21
|
+
logger: nil,
|
18
22
|
do_log: nil)
|
19
23
|
|
20
24
|
beats_per_bar ||= 4
|
@@ -37,7 +41,7 @@ module Musa
|
|
37
41
|
|
38
42
|
@do_log = do_log
|
39
43
|
|
40
|
-
@sequencer = Sequencer::Sequencer.new beats_per_bar, ticks_per_beat, do_log: @do_log
|
44
|
+
@sequencer = Sequencer::Sequencer.new beats_per_bar, ticks_per_beat, logger: logger, do_log: @do_log
|
41
45
|
|
42
46
|
@clock.on_start do
|
43
47
|
do_on_start
|
@@ -78,15 +82,20 @@ module Musa
|
|
78
82
|
end
|
79
83
|
|
80
84
|
def change_position_to(bars: nil, beats: nil, midi_beats: nil)
|
81
|
-
|
85
|
+
logger.debug('Transport') do
|
86
|
+
"asked to change position to #{"#{bars} bars " if bars}#{"#{beats} beats " if beats}" \
|
87
|
+
"#{"#{midi_beats} midi beats " if midi_beats}"
|
88
|
+
end
|
82
89
|
|
83
90
|
position = bars&.rationalize || 1r
|
84
91
|
position += Rational(midi_beats, 4 * @sequencer.beats_per_bar) if midi_beats
|
85
92
|
position += Rational(beats, @sequencer.beats_per_bar) if beats
|
86
93
|
|
94
|
+
position -= @sequencer.tick_duration
|
95
|
+
|
87
96
|
raise ArgumentError, "undefined new position" unless position
|
88
97
|
|
89
|
-
|
98
|
+
logger.debug('Transport') { "received message position change to #{position.inspect}" }
|
90
99
|
|
91
100
|
start_again_later = false
|
92
101
|
|
@@ -95,7 +104,7 @@ module Musa
|
|
95
104
|
start_again_later = true
|
96
105
|
end
|
97
106
|
|
98
|
-
|
107
|
+
logger.debug('Transport') { "setting sequencer position #{position.inspect}" }
|
99
108
|
|
100
109
|
@sequencer.raw_at position, force_first: true do
|
101
110
|
@on_change_position.each { |block| block.call @sequencer }
|
@@ -110,28 +119,32 @@ module Musa
|
|
110
119
|
@clock.terminate
|
111
120
|
end
|
112
121
|
|
122
|
+
def logger
|
123
|
+
@sequencer.logger
|
124
|
+
end
|
125
|
+
|
113
126
|
private
|
114
127
|
|
115
128
|
def do_before_begin
|
116
|
-
|
129
|
+
logger.debug('Transport') { 'doing before_begin initialization...' unless @before_begin.empty? }
|
117
130
|
@before_begin.each { |block| block.call @sequencer }
|
118
|
-
|
131
|
+
logger.debug('Transport') { 'doing before_begin initialization... done' unless @before_begin.empty? }
|
119
132
|
end
|
120
133
|
|
121
134
|
def do_on_start
|
122
|
-
|
135
|
+
logger.debug('Transport') { 'starting...' unless @on_start.empty? }
|
123
136
|
@on_start.each { |block| block.call @sequencer }
|
124
|
-
|
137
|
+
logger.debug('Transport') { 'starting... done' unless @on_start.empty? }
|
125
138
|
end
|
126
139
|
|
127
140
|
def do_stop
|
128
|
-
|
141
|
+
logger.debug('Transport') { 'stopping...' unless @after_stop.empty? }
|
129
142
|
@after_stop.each { |block| block.call @sequencer }
|
130
|
-
|
143
|
+
logger.debug('Transport') { 'stopping... done' unless @after_stop.empty? }
|
131
144
|
|
132
|
-
|
145
|
+
logger.debug('Transport') { 'resetting sequencer...' }
|
133
146
|
@sequencer.reset
|
134
|
-
|
147
|
+
logger.debug('Transport') { 'resetting sequencer... done' }
|
135
148
|
|
136
149
|
do_before_begin
|
137
150
|
@before_begin_already_done = true
|
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.21.
|
4
|
-
s.date = '2020-10-
|
3
|
+
s.version = '0.21.3'
|
4
|
+
s.date = '2020-10-20'
|
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)'
|
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.21.
|
4
|
+
version: 0.21.3
|
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: 2020-10-
|
11
|
+
date: 2020-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: citrus
|