musa-dsl 0.21.0 → 0.22.0

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/lib/musa-dsl.rb +1 -1
  4. data/lib/musa-dsl/core-ext.rb +1 -0
  5. data/lib/musa-dsl/core-ext/arrayfy.rb +9 -9
  6. data/lib/musa-dsl/core-ext/hashify.rb +42 -0
  7. data/lib/musa-dsl/core-ext/inspect-nice.rb +6 -1
  8. data/lib/musa-dsl/datasets/e.rb +22 -5
  9. data/lib/musa-dsl/datasets/gdv.rb +0 -1
  10. data/lib/musa-dsl/datasets/p.rb +28 -37
  11. data/lib/musa-dsl/datasets/pdv.rb +0 -1
  12. data/lib/musa-dsl/datasets/ps.rb +10 -78
  13. data/lib/musa-dsl/generative/markov.rb +1 -1
  14. data/lib/musa-dsl/logger/logger.rb +4 -3
  15. data/lib/musa-dsl/matrix/matrix.rb +0 -57
  16. data/lib/musa-dsl/midi/midi-voices.rb +4 -0
  17. data/lib/musa-dsl/neumas/string-to-neumas.rb +1 -0
  18. data/lib/musa-dsl/repl/repl.rb +30 -11
  19. data/lib/musa-dsl/sequencer/base-sequencer-implementation-every.rb +87 -0
  20. data/lib/musa-dsl/sequencer/base-sequencer-implementation-move.rb +439 -0
  21. data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-helper.rb +3 -3
  22. data/lib/musa-dsl/sequencer/base-sequencer-implementation-play-timed.rb +210 -0
  23. data/lib/musa-dsl/sequencer/base-sequencer-implementation-play.rb +178 -0
  24. data/lib/musa-dsl/sequencer/base-sequencer-implementation.rb +150 -595
  25. data/lib/musa-dsl/sequencer/base-sequencer-public.rb +58 -5
  26. data/lib/musa-dsl/sequencer/base-sequencer-tick-based.rb +5 -9
  27. data/lib/musa-dsl/sequencer/base-sequencer-tickless-based.rb +1 -5
  28. data/lib/musa-dsl/sequencer/sequencer-dsl.rb +8 -0
  29. data/lib/musa-dsl/series/base-series.rb +43 -78
  30. data/lib/musa-dsl/series/flattener-timed-serie.rb +61 -0
  31. data/lib/musa-dsl/series/hash-or-array-serie-splitter.rb +95 -0
  32. data/lib/musa-dsl/series/holder-serie.rb +1 -1
  33. data/lib/musa-dsl/series/main-serie-constructors.rb +29 -83
  34. data/lib/musa-dsl/series/main-serie-operations.rb +60 -215
  35. data/lib/musa-dsl/series/proxy-serie.rb +1 -1
  36. data/lib/musa-dsl/series/quantizer-serie.rb +546 -0
  37. data/lib/musa-dsl/series/queue-serie.rb +1 -1
  38. data/lib/musa-dsl/series/series.rb +7 -2
  39. data/lib/musa-dsl/transport/input-midi-clock.rb +19 -12
  40. data/lib/musa-dsl/transport/transport.rb +25 -12
  41. data/musa-dsl.gemspec +2 -2
  42. metadata +11 -5
  43. data/lib/musa-dsl/sequencer/base-sequencer-implementation-control.rb +0 -216
  44. data/lib/musa-dsl/series/hash-serie-splitter.rb +0 -196
@@ -1,196 +0,0 @@
1
- module Musa
2
- # TODO: adapt to series prototyping
3
- # TODO: full test cases
4
-
5
- module Series
6
- module SerieOperations
7
- def split(buffered: nil, master: nil)
8
- buffered ||= false
9
-
10
- return HashSplitter.new HashSplitter::KeyProxy.new(self) if master.nil? && !buffered
11
- return HashSplitter.new HashSplitter::MasterSlaveKeyProxy.new(self, master) if !master.nil? && !buffered
12
- return HashSplitter.new HashSplitter::BufferedKeyProxy.new(self) if buffered
13
- end
14
-
15
- class HashSplitter
16
- def initialize(proxy)
17
- @proxy = proxy
18
- @series = {}
19
- end
20
-
21
- def [](key)
22
- serie = if @series.key? key
23
- @series[key]
24
- else
25
- @series[key] = Splitted.new(@proxy, key: key)
26
- end
27
- end
28
-
29
- class KeyProxy
30
- def initialize(hash_serie)
31
- @serie = hash_serie.instance
32
- @values = {}
33
- end
34
-
35
- def restart
36
- @serie.restart
37
- @values = {}
38
- end
39
-
40
- def next_value(key)
41
- return nil unless @values
42
-
43
- value = @values[key]
44
-
45
- if value.nil?
46
- before_values = @values.collect { |k, v| [k, v] unless v.nil? }.compact.to_h
47
-
48
- @values = @serie.next_value
49
- value = @values[key] if @values
50
-
51
- warn "Warning: splitted serie #{@serie} values #{before_values} are being lost" if !value.nil? && !before_values.empty?
52
- end
53
-
54
- @values[key] = nil if @values
55
-
56
- value
57
- end
58
-
59
- def peek_next_value(key)
60
- value = @values[key]
61
-
62
- if value.nil?
63
- peek_values = @serie.peek_next_value
64
- value = peek_values[key] if peek_values
65
- end
66
-
67
- value
68
- end
69
- end
70
-
71
- class BufferedKeyProxy
72
- def initialize(hash_serie)
73
- @serie = hash_serie.instance
74
- @values = {}
75
- end
76
-
77
- def restart
78
- @serie.restart
79
- @values = {}
80
- end
81
-
82
- def next_value(key)
83
- value = nil
84
-
85
- if @values[key].nil? || @values[key].empty?
86
- hash_value = @serie.next_value
87
-
88
- if hash_value
89
- hash_value.each do |k, v|
90
- @values[k] = [] if @values[k].nil?
91
- @values[k] << v
92
- end
93
- end
94
- end
95
-
96
- value = @values[key].shift if @values[key]
97
-
98
- value
99
- end
100
-
101
- def peek_next_value(key)
102
- value = nil
103
-
104
- if @values[key] && !@values[key].empty?
105
- value = @values[key].first
106
- else
107
- peek_values = @serie.peek_next_value
108
- value = peek_values[key] if peek_values
109
- end
110
-
111
- value
112
- end
113
- end
114
-
115
- class MasterSlaveKeyProxy
116
- def initialize(hash_serie, master)
117
- @serie = hash_serie.instance
118
- @master = master
119
- @values = {}
120
- @values_counter = {}
121
- end
122
-
123
- def restart
124
- @serie.restart
125
- @values = {}
126
- @values_counter = {}
127
- end
128
-
129
- def next_value(key)
130
- return nil unless @values
131
-
132
- value = @values[key]
133
-
134
- if value.nil?
135
- @values = @serie.next_value
136
-
137
- value = @values[key] if @values
138
-
139
- # warn "Info: splitted serie #{@serie} use count on next_value: #{@values_counter}"
140
- @values_counter = {}
141
- end
142
-
143
- @values_counter[key] ||= 0
144
- @values_counter[key] += 1
145
-
146
- @values[key] = nil if key == @master && @values
147
-
148
- value
149
- end
150
-
151
- def peek_next_value(key)
152
- return nil unless @values
153
-
154
- value = @values[key]
155
-
156
- if value.nil?
157
- peek_values = @serie.peek_next_value
158
- value = peek_values[key] if peek_values
159
- end
160
-
161
- value
162
- end
163
- end
164
-
165
- class Splitted
166
- include Serie
167
-
168
- def initialize(proxy, key:)
169
- @proxy = proxy
170
- @key = key
171
-
172
- mark_as_instance!
173
- end
174
-
175
- def _prototype
176
- raise PrototypingSerieError, 'Cannot get prototype of a splitted serie'
177
- end
178
-
179
- def _restart
180
- @proxy.restart
181
- end
182
-
183
- def next_value
184
- @proxy.next_value(@key)
185
- end
186
-
187
- def peek_next_value
188
- @proxy.peek_next_value(@key)
189
- end
190
- end
191
- end
192
-
193
- private_constant :HashSplitter
194
- end
195
- end
196
- end