musa-dsl 0.14.18 → 0.14.26
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/lib/musa-dsl/sequencer/base-sequencer-public.rb +16 -5
- data/lib/musa-dsl/sequencer/sequencer-dsl.rb +2 -2
- data/lib/musa-dsl/transport/clock.rb +3 -3
- data/lib/musa-dsl/transport/input-midi-clock.rb +4 -4
- data/lib/musa-dsl/transport/transport.rb +34 -34
- 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: 9fda568f7b4eef0b94479ab3f9e5833a130d82ba2386687607a0a4193c292f0e
|
4
|
+
data.tar.gz: e7366f81def8b65c0977c004ef02a50ce01472a1c5a29b5b9ec0916ff1989538
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d78176e99d1746d2eba617fac89602c56bc4aa8a165d7f0ee1e696b726f52c0b7a89347b313e47d2d5e6252cb3f2c5d0627af0a68a6ccb0deb10d3f1c3a4ceb
|
7
|
+
data.tar.gz: c16e547be13a8c6592722afbc6cb6a8b571a8930b0c0079b9067baee43c4c237b1123fff554674bd572c68a662d718f10c0402dd0fe5d01a779560d3f1b5bf76
|
@@ -4,7 +4,7 @@ require 'musa-dsl/core-ext/key-parameters-procedure-binder'
|
|
4
4
|
require 'musa-dsl/series'
|
5
5
|
|
6
6
|
class Musa::BaseSequencer
|
7
|
-
attr_reader :ticks_per_bar, :tick_duration, :running_position
|
7
|
+
attr_reader :beats_per_bar, :ticks_per_beat, :ticks_per_bar, :tick_duration, :running_position
|
8
8
|
attr_reader :everying, :playing, :moving
|
9
9
|
|
10
10
|
@@tick_mutex = Mutex.new
|
@@ -13,9 +13,14 @@ class Musa::BaseSequencer
|
|
13
13
|
do_log ||= false
|
14
14
|
|
15
15
|
@on_debug_at = []
|
16
|
-
@on_fast_forward = []
|
17
16
|
@on_block_error = []
|
18
17
|
|
18
|
+
@before_tick = []
|
19
|
+
@on_fast_forward = []
|
20
|
+
|
21
|
+
@beats_per_bar = Rational(beats_per_bar)
|
22
|
+
@ticks_per_beat = Rational(ticks_per_beat)
|
23
|
+
|
19
24
|
@ticks_per_bar = Rational(beats_per_bar * ticks_per_beat)
|
20
25
|
@tick_duration = Rational(1, @ticks_per_bar)
|
21
26
|
|
@@ -44,6 +49,8 @@ class Musa::BaseSequencer
|
|
44
49
|
def tick
|
45
50
|
position_to_run = (@position += 1)
|
46
51
|
|
52
|
+
@before_tick.each { |block| block.call Rational(position_to_run, @ticks_per_bar) }
|
53
|
+
|
47
54
|
if @score[position_to_run]
|
48
55
|
@score[position_to_run].each do |command|
|
49
56
|
|
@@ -92,15 +99,19 @@ class Musa::BaseSequencer
|
|
92
99
|
end
|
93
100
|
|
94
101
|
def on_debug_at(&block)
|
95
|
-
@on_debug_at << block
|
102
|
+
@on_debug_at << KeyParametersProcedureBinder.new(block)
|
96
103
|
end
|
97
104
|
|
98
105
|
def on_block_error(&block)
|
99
|
-
@on_block_error << block
|
106
|
+
@on_block_error << KeyParametersProcedureBinder.new(block)
|
100
107
|
end
|
101
108
|
|
102
109
|
def on_fast_forward(&block)
|
103
|
-
@on_fast_forward << block
|
110
|
+
@on_fast_forward << KeyParametersProcedureBinder.new(block)
|
111
|
+
end
|
112
|
+
|
113
|
+
def before_tick(&block)
|
114
|
+
@before_tick << KeyParametersProcedureBinder.new(block)
|
104
115
|
end
|
105
116
|
|
106
117
|
def position
|
@@ -3,8 +3,8 @@ require 'forwardable'
|
|
3
3
|
class Musa::Sequencer
|
4
4
|
extend Forwardable
|
5
5
|
|
6
|
-
def_delegators :@sequencer, :raw_at, :tick, :on_debug_at, :on_block_error
|
7
|
-
def_delegators :@sequencer, :
|
6
|
+
def_delegators :@sequencer, :raw_at, :tick, :on_debug_at, :on_block_error, :on_fast_forward, :before_tick
|
7
|
+
def_delegators :@sequencer, :beats_per_bar, :ticks_per_beat, :ticks_per_bar, :tick_duration, :round, :position=, :size, :event_handler, :empty?
|
8
8
|
|
9
9
|
def_delegators :@context, :position, :log
|
10
10
|
def_delegators :@context, :with, :now, :at, :wait, :play, :every, :move
|
@@ -6,7 +6,7 @@ module Musa
|
|
6
6
|
@run = nil
|
7
7
|
@on_start = []
|
8
8
|
@on_stop = []
|
9
|
-
@
|
9
|
+
@on_change_position = []
|
10
10
|
end
|
11
11
|
|
12
12
|
def running?
|
@@ -21,8 +21,8 @@ module Musa
|
|
21
21
|
@on_stop << block
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
@
|
24
|
+
def on_change_position(&block)
|
25
|
+
@on_change_position << block
|
26
26
|
end
|
27
27
|
|
28
28
|
def run
|
@@ -112,12 +112,12 @@ module Musa
|
|
112
112
|
yield if block_given? && @started
|
113
113
|
|
114
114
|
when 'Song Position Pointer'
|
115
|
-
|
115
|
+
new_position_in_midi_beats =
|
116
116
|
m.data[0] & 0x7F | ((m.data[1] & 0x7F) << 7)
|
117
117
|
|
118
|
-
warn "InputMidiClock: processing Song Position Pointer
|
119
|
-
@
|
120
|
-
warn "InputMidiClock: processing Song Position Pointer
|
118
|
+
warn "InputMidiClock: processing Song Position Pointer new_position_in_midi_beats #{new_position_in_midi_beats}..." if @do_log
|
119
|
+
@on_change_position.each { |block| block.call midi_beats: new_position_in_midi_beats }
|
120
|
+
warn "InputMidiClock: processing Song Position Pointer new_position_in_beats #{new_position_in_midi_beats}... done" if @do_log
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
@@ -12,7 +12,6 @@ module Musa
|
|
12
12
|
before_begin: nil,
|
13
13
|
on_start: nil,
|
14
14
|
after_stop: nil,
|
15
|
-
before_each_tick: nil,
|
16
15
|
on_position_change: nil,
|
17
16
|
do_log: nil)
|
18
17
|
|
@@ -28,11 +27,8 @@ module Musa
|
|
28
27
|
@on_start = []
|
29
28
|
@on_start << KeyParametersProcedureBinder.new(on_start) if on_start
|
30
29
|
|
31
|
-
@
|
32
|
-
@
|
33
|
-
|
34
|
-
@on_position_change = []
|
35
|
-
@on_position_change << KeyParametersProcedureBinder.new(on_position_change) if on_position_change
|
30
|
+
@on_change_position = []
|
31
|
+
@on_change_position << KeyParametersProcedureBinder.new(on_position_change) if on_position_change
|
36
32
|
|
37
33
|
@after_stop = []
|
38
34
|
@after_stop << KeyParametersProcedureBinder.new(after_stop) if after_stop
|
@@ -49,27 +45,8 @@ module Musa
|
|
49
45
|
do_stop
|
50
46
|
end
|
51
47
|
|
52
|
-
@clock.
|
53
|
-
|
54
|
-
tick_before_position = position - Rational(1, beats_per_bar * ticks_per_beat)
|
55
|
-
|
56
|
-
warn "Transport: received message position change to #{position}" if @do_log
|
57
|
-
|
58
|
-
start_again_later = false
|
59
|
-
|
60
|
-
if @sequencer.position > tick_before_position
|
61
|
-
do_stop
|
62
|
-
start_again_later = true
|
63
|
-
end
|
64
|
-
|
65
|
-
warn "Transport: setting sequencer position #{tick_before_position}" if @do_log
|
66
|
-
@sequencer.position = tick_before_position
|
67
|
-
|
68
|
-
@sequencer.raw_at position, force_first: true do
|
69
|
-
@on_position_change.each { |block| block.call @sequencer }
|
70
|
-
end
|
71
|
-
|
72
|
-
do_on_start if start_again_later
|
48
|
+
@clock.on_change_position do |bars: nil, beats: nil, midi_beats: nil|
|
49
|
+
change_position_to bars: bars, beats: beats, midi_beats: midi_beats
|
73
50
|
end
|
74
51
|
end
|
75
52
|
|
@@ -81,16 +58,12 @@ module Musa
|
|
81
58
|
@on_start << KeyParametersProcedureBinder.new(block)
|
82
59
|
end
|
83
60
|
|
84
|
-
def before_each_tick(&block)
|
85
|
-
@before_each_tick << KeyParametersProcedureBinder.new(block)
|
86
|
-
end
|
87
|
-
|
88
61
|
def after_stop(&block)
|
89
62
|
@after_stop << KeyParametersProcedureBinder.new(block)
|
90
63
|
end
|
91
64
|
|
92
|
-
def
|
93
|
-
@
|
65
|
+
def on_change_position(&block)
|
66
|
+
@on_change_position << KeyParametersProcedureBinder.new(block)
|
94
67
|
end
|
95
68
|
|
96
69
|
def start
|
@@ -98,11 +71,38 @@ module Musa
|
|
98
71
|
|
99
72
|
@clock.run do
|
100
73
|
@before_begin_already_done = false
|
101
|
-
@before_each_tick.each { |block| block.call @sequencer }
|
102
74
|
@sequencer.tick
|
103
75
|
end
|
104
76
|
end
|
105
77
|
|
78
|
+
def change_position_to(bars: nil, beats: nil, midi_beats: nil)
|
79
|
+
position = bars.rationalize || 1r
|
80
|
+
position += Rational(midi_beats, 4 * @sequencer.beats_per_bar) if midi_beats
|
81
|
+
position += Rational(beats, @sequencer.beats_per_bar) if beats
|
82
|
+
|
83
|
+
raise ArgumentError, "undefined new position" unless position
|
84
|
+
|
85
|
+
tick_before_position = position - @sequencer.tick_duration
|
86
|
+
|
87
|
+
warn "Transport: received message position change to #{position}" if @do_log
|
88
|
+
|
89
|
+
start_again_later = false
|
90
|
+
|
91
|
+
if @sequencer.position > tick_before_position
|
92
|
+
do_stop
|
93
|
+
start_again_later = true
|
94
|
+
end
|
95
|
+
|
96
|
+
warn "Transport: setting sequencer position #{tick_before_position}" if @do_log
|
97
|
+
@sequencer.position = tick_before_position
|
98
|
+
|
99
|
+
@sequencer.raw_at position, force_first: true do
|
100
|
+
@on_change_position.each { |block| block.call @sequencer }
|
101
|
+
end
|
102
|
+
|
103
|
+
do_on_start if start_again_later
|
104
|
+
end
|
105
|
+
|
106
106
|
def stop
|
107
107
|
@clock.terminate
|
108
108
|
end
|
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.14.
|
4
|
-
s.date = '2019-09-
|
3
|
+
s.version = '0.14.26'
|
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)'
|
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.14.
|
4
|
+
version: 0.14.26
|
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: 2019-09-
|
11
|
+
date: 2019-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: citrus
|