musa-dsl 0.23.23 → 0.24.0

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: d553a28107482bf41290cc93cdfca73a8096fa9525658b8c3f41d26681de062b
4
- data.tar.gz: 7491c04165a88ac74ce1131e7721ee071d9e2bf54b0a3d1ca2b09844d2c5f174
3
+ metadata.gz: 369a811860e0450eeee36e6841fb47f90fdf5f9fbca1b9169cf1899b1998994f
4
+ data.tar.gz: 5ec80d77df612f31fbfe9535d0babf023c4f0155447d378d11ec31f4f115776c
5
5
  SHA512:
6
- metadata.gz: d147175f329eb74f1660c11d643de3ff65abaea2c4d1ed2554322d353b626bade1d073e2c7d6c25d2c9982916253d8318f792d0f3b41f9294505954f642e5f45
7
- data.tar.gz: 4938ef8a3b0115dad3ad7c09ce8410d0049844965f5cfcdb22c58de8f85353541fae483e3f1578b97c149daf168b37efd23b596808e72c1c45996ed05a2cd96a
6
+ metadata.gz: 2b20abc803e8ada74bcfdca8a4ae4a123c4b9ebafd6b584a9f47a210d7ed87b421c4a4130ccf9bee2a67cea85be731b63c5bbe701bcfa73c7c5b0006f1cd7d22
7
+ data.tar.gz: bafb8e3bb49789fd9b7800067e5d01d44ff3bc384e09cac0493e6c6336dc9951f51ad341a4c7d6e9b5154a96b9d9b2e366d51d372e642a8f2d1ac7090ce3f3bb
@@ -6,21 +6,16 @@ module Musa
6
6
  class REPL
7
7
  @@repl_mutex = Mutex.new
8
8
 
9
- def initialize(binder, port: nil, after_eval: nil, logger: nil)
9
+ def initialize(binder = nil, port: nil, after_eval: nil, logger: nil)
10
+
11
+ self.binder = binder
12
+
10
13
  port ||= 1327
11
14
 
12
15
  @logger = logger || Musa::Logger::Logger.new
13
16
 
14
17
  @block_source = nil
15
18
 
16
- if binder.receiver.respond_to?(:sequencer) &&
17
- binder.receiver.sequencer.respond_to?(:on_error)
18
-
19
- binder.receiver.sequencer.on_error do |e|
20
- send_exception e, output: @connection
21
- end
22
- end
23
-
24
19
  @client_threads = []
25
20
  @run = true
26
21
 
@@ -43,7 +38,7 @@ module Musa
43
38
 
44
39
  when '#begin'
45
40
  user_path = buffer&.string
46
- binder.receiver.instance_variable_set(:@user_pathname, Pathname.new(user_path)) if user_path
41
+ @binder.receiver.instance_variable_set(:@user_pathname, Pathname.new(user_path)) if user_path
47
42
 
48
43
  buffer = StringIO.new
49
44
 
@@ -53,7 +48,7 @@ module Musa
53
48
 
54
49
  begin
55
50
  send_echo @block_source, output: @connection
56
- binder.eval @block_source, "(repl)", 1
51
+ @binder.eval @block_source, "(repl)", 1
57
52
 
58
53
  rescue StandardError, ScriptError => e
59
54
  @logger.warn('REPL') { 'code execution error' }
@@ -89,6 +84,22 @@ module Musa
89
84
  end
90
85
  end
91
86
 
87
+ def binder=(binder)
88
+ raise 'Already binded' if @binder
89
+
90
+ @binder = binder
91
+
92
+ return unless @binder
93
+
94
+ if @binder.receiver.respond_to?(:sequencer) &&
95
+ @binder.receiver.sequencer.respond_to?(:on_error)
96
+
97
+ @binder.receiver.sequencer.on_error do |e|
98
+ send_exception e, output: @connection
99
+ end
100
+ end
101
+ end
102
+
92
103
  def stop
93
104
  @run = false
94
105
 
@@ -102,7 +113,11 @@ module Musa
102
113
  end
103
114
 
104
115
  def puts(message)
105
- send output: @connection, content: message
116
+ if @connection
117
+ send output: @connection, content: message&.to_s
118
+ else
119
+ @logger.warn('REPL') { "trying to print a message in Atom client but the client is not connected. Ignoring message \'#{message} \'." }
120
+ end
106
121
  end
107
122
 
108
123
  private
@@ -4,14 +4,15 @@ require 'nibbler'
4
4
  module Musa
5
5
  module Clock
6
6
  class InputMidiClock < Clock
7
- def initialize(input, logger: nil, do_log: nil)
7
+ def initialize(input = nil, logger: nil, do_log: nil)
8
8
  do_log ||= false
9
9
 
10
10
  super()
11
11
 
12
- @input = input
13
12
  @logger = logger
14
13
 
14
+ self.input = input
15
+
15
16
  if logger
16
17
  @logger = logger
17
18
  else
@@ -22,17 +23,34 @@ module Musa
22
23
  @nibbler = Nibbler.new
23
24
  end
24
25
 
26
+ attr_reader :input
27
+
28
+ def input=(input_midi_port)
29
+ @input = input_midi_port
30
+ @waiting_for_input&.wakeup
31
+ end
32
+
25
33
  def run
26
34
  @run = true
27
35
 
28
36
  while @run
29
- raw_messages = @input.gets
30
- @input.buffer.clear
37
+ if @input
38
+ raw_messages = @input.gets
39
+ @input.buffer.clear
40
+ else
41
+ @logger.warn('InputMidiClock') { 'Waiting for clock input MIDI port' }
42
+
43
+ @waiting_for_input = Thread.current
44
+ sleep
45
+ @waiting_for_input = nil
46
+
47
+ @logger.info('InputMidiClock') { "Assigned clock input MIDI port '#{@input.name}'" }
48
+ end
31
49
 
32
50
  messages = []
33
51
  stop_index = nil
34
52
 
35
- raw_messages.each do |message|
53
+ raw_messages&.each do |message|
36
54
  mm = @nibbler.parse message[:data]
37
55
 
38
56
  if mm
data/lib/musa-dsl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Musa
2
- VERSION = '0.23.23'
2
+ VERSION = '0.24.0'
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.23'
4
- s.date = '2021-10-27'
3
+ s.version = '0.24.0'
4
+ s.date = '2021-11-09'
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.23
4
+ version: 0.24.0
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-10-27 00:00:00.000000000 Z
11
+ date: 2021-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: citrus