xi-lang 0.2.1 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da981b394c4516c9f35f6f144d848fd127b62e1f7a8979128dd873c69c658319
4
- data.tar.gz: 3bbf55fd2d3dd8758f4704764954929e93e6a41b0aecec69f467c831d503bba2
3
+ metadata.gz: da63fd14e08f6b37c4a915b77bc517b1e42d57979c336a09aebab8b2122ec798
4
+ data.tar.gz: 33873883823d14e5356ef6580b5dd8e34eb983f78d7c35e7634ce91a8daf4d65
5
5
  SHA512:
6
- metadata.gz: b36c6dc5621bfe9823f8ecd68f66ba255c951be3c5aa1eecdb1ad9e4942906901156f330f00b0c47ca6293b1854c79f1908616a56dae6369e484322e7430fcd8
7
- data.tar.gz: bd512cd619d2d849bc5dc3093e78ed69e952b6b7f6a123d8d27068334c9596152622285981ae824c71010650cf435f061fbdfe876bca3f7124967b113140c3b8
6
+ metadata.gz: 575c7d49a0b42294acc8c6d405354ca7060fae687375d00a0461f8b65d2d301a6515edb9cd022d86c8bc42003d6c64e677480ca4261229f96e56a1a485c092a1
7
+ data.tar.gz: '08d14d4326fd8b901eb3bc5012c2c12b2a4074ca357630ab5c8aaf4cc2a1f69b86f0287ed6b528915c4890210c38d2be201c115ba14ccaab27b9e0d8dae311f2'
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.1
5
- before_install: gem install bundler -v 1.13.6
4
+ - 2.4
5
+ before_install: gem install bundler -v 1.17.2
data/README.md CHANGED
@@ -14,7 +14,7 @@ multiple known bugs, missing features, documentation and tests.
14
14
  ## Example
15
15
 
16
16
  ```ruby
17
- melody = [1,4,7,8,9]
17
+ melody = [0,3,6,7,8]
18
18
  scale = [Scale.iwato, Scale.jiao]
19
19
 
20
20
  fm.set degree: melody.p(1/2,1/8,1/8,1/8,1/16,1/8,1/8).seq(2),
@@ -28,7 +28,7 @@ fm.set degree: melody.p(1/2,1/8,1/8,1/8,1/16,1/8,1/8).seq(2),
28
28
 
29
29
  kick.set freq: s("xi.x .ix. | xi.x xx.x", 70, 200), amp: 0.8, gate: :freq
30
30
 
31
- clap.set n: s("..x. xyz. .x.. .xyx", 60, 61, 60).p.decelerate(2),
31
+ clap.set n: s("..x. xyz. .x.. .xyx", 60, 61, 60).p.slow(2),
32
32
  gate: :n,
33
33
  amp: 0.35,
34
34
  pan: P.sin(16, 2) * 0.6,
@@ -10,8 +10,8 @@ module Xi::CoreExt
10
10
 
11
11
  def degree_to_key(scale, steps_per_octave)
12
12
  accidental = (self - self.to_i) * 10.0
13
- inner_key = scale[(self - 1) % scale.size]
14
- base_key = ((self - 1) / scale.size).to_i * steps_per_octave + inner_key
13
+ inner_key = scale[self % scale.size]
14
+ base_key = (self / scale.size).to_i * steps_per_octave + inner_key
15
15
  if accidental != 0
16
16
  base_key + accidental * (steps_per_octave / 12.0)
17
17
  else
data/lib/xi/osc.rb CHANGED
@@ -1,4 +1,3 @@
1
- require "xi/osc/version"
2
1
  require 'osc-ruby'
3
2
 
4
3
  module Xi
@@ -124,13 +124,11 @@ module Xi
124
124
  # Generates values from a sinewave discretized to +quant+ events
125
125
  # for the duration of +delta+ cycles.
126
126
  #
127
- # Values range from -1 to 1
128
- #
129
- # @see #sin1 for the same function but constrained on 0 to 1 values
127
+ # Values range from 0 to 1
130
128
  #
131
129
  # @example
132
130
  # peek P.sin(8).map { |i| i.round(2) }
133
- # #=> [0.0, 0.71, 1.0, 0.71, 0.0, -0.71, -1.0, -0.71]
131
+ # #=> [0.5, 0.85, 1.0, 0.85, 0.5, 0.15, 0.0, 0.15, 0.5, 0.85]
134
132
  #
135
133
  # @example +quant+ determines the size, +delta+ the total duration
136
134
  # P.sin(8).size #=> 8
@@ -144,28 +142,83 @@ module Xi
144
142
  def sin(quant, delta=1)
145
143
  Pattern.new(size: quant, delta: delta / quant) do |y|
146
144
  quant.times do |i|
147
- y << Math.sin(i / quant * 2 * Math::PI)
145
+ y << (Math.sin(i / quant * 2 * Math::PI) + 1) / 2
148
146
  end
149
147
  end
150
148
  end
151
149
 
152
- # Generates values from a sinewave discretized to +quant+ events
153
- # for the duration of +delta+ cycles.
150
+ # Generates values from a sawtooth waveform, discretized to +quant+ events
151
+ # for the duration of +delta+ cycles
154
152
  #
155
153
  # Values range from 0 to 1
156
154
  #
157
- # @see #sin
155
+ # @example
156
+ # peek P.saw(8)
157
+ # #=> [(0/1), (1/8), (1/4), (3/8), (1/2), (5/8), (3/4), (7/8), (0/1), (1/8)]
158
+ #
159
+ # @example +quant+ determines the size, +delta+ the total duration
160
+ # P.saw(8).size #=> 8
161
+ # P.saw(22).duration #=> (1/1)
162
+ # P.saw(19, 2).duration #=> (2/1)
163
+ #
164
+ # @param quant [Integer]
165
+ # @param delta [Integer] (default: 1)
166
+ # @return [Pattern]
167
+ #
168
+ def saw(quant, delta=1)
169
+ Pattern.new(size: quant, delta: delta / quant) do |y|
170
+ quant.times do |i|
171
+ y << i / quant
172
+ end
173
+ end
174
+ end
175
+
176
+ # Generates an inverse sawtooth waveform, discretized to +quant+ events
177
+ # for the duration of +delta+ cycles
178
+ #
179
+ # Values range from 0 to 1
180
+ #
181
+ # @see P.saw
182
+ #
183
+ # @example
184
+ # peek P.isaw(8)
185
+ # #=> [(1/1), (7/8), (3/4), (5/8), (1/2), (3/8), (1/4), (1/8), (1/1), (7/8)]
186
+ #
187
+ # @param quant [Integer]
188
+ # @param delta [Integer] (default: 1)
189
+ # @return [Pattern]
190
+ #
191
+ def isaw(*args)
192
+ -P.saw(*args) + 1
193
+ end
194
+
195
+ # Generates a triangle waveform, discretized to +quant+ events for the
196
+ # duration of +delta+ cycles
197
+ #
198
+ # Values range from 0 to 1
158
199
  #
159
200
  # @example
160
- # peek P.sin1(8).map { |i| i.round(2) }
161
- # #=> [0.5, 0.85, 1.0, 0.85, 0.5, 0.15, 0.0, 0.15]
201
+ # peek P.tri(8)
202
+ # #=> [(0/1), (1/4), (1/2), (3/4), (1/1), (3/4), (1/2), (1/4), (0/1), (1/4)]
162
203
  #
163
204
  # @param quant [Integer]
164
205
  # @param delta [Integer] (default: 1)
165
206
  # @return [Pattern]
166
207
  #
167
- def sin1(quant, delta=1)
168
- sin(quant, delta).scale(-1, 1, 0, 1)
208
+ def tri(quant, delta=1)
209
+ Pattern.new(size: quant, delta: delta / quant) do |y|
210
+ half_quant = quant / 2
211
+ up_half = half_quant.to_f.ceil
212
+ down_half = quant - up_half
213
+
214
+ up_half.times do |i|
215
+ y << i / half_quant
216
+ end
217
+ down_half.times do |i|
218
+ j = down_half - i
219
+ y << j / half_quant
220
+ end
221
+ end
169
222
  end
170
223
 
171
224
  private
@@ -219,6 +219,7 @@ module Xi
219
219
  def normalize(min, max)
220
220
  map { |v| v.respond_to?(:-) ? (v - min) / (max - min) : v }
221
221
  end
222
+ alias_method :norm, :normalize
222
223
 
223
224
  # Scales a pattern of normalized values (0..1) to a custom range
224
225
  # +min+..+max+
@@ -239,6 +240,7 @@ module Xi
239
240
  def denormalize(min, max)
240
241
  map { |v| v.respond_to?(:*) ? (max - min) * v + min : v }
241
242
  end
243
+ alias_method :denorm, :denormalize
242
244
 
243
245
  # Scale from one range of values to another range of values
244
246
  #
@@ -259,36 +261,36 @@ module Xi
259
261
  # Slows down a pattern by stretching start and duration of events
260
262
  # +num+ times.
261
263
  #
262
- # It is the inverse operation of #accelerate
264
+ # It is the inverse operation of #fast
263
265
  #
264
- # @see #accelerate
266
+ # @see #fast
265
267
  #
266
268
  # @example
267
- # peek_events %w(a b c d).p([1/4, 1/8, 1/6]).decelerate(2)
269
+ # peek_events %w(a b c d).p([1/4, 1/8, 1/6]).slow(2)
268
270
  # #=> [E["a",0,1/2], E["b",1/2,1/4], E["c",3/4,1/3], E["d",13/12,1/2]]
269
271
  #
270
272
  # @param num [Numeric]
271
273
  # @return [Pattern]
272
274
  #
273
- def decelerate(num)
275
+ def slow(num)
274
276
  Pattern.new(self, delta: delta.p * num)
275
277
  end
276
278
 
277
279
  # Advance a pattern by shrinking start and duration of events
278
280
  # +num+ times.
279
281
  #
280
- # It is the inverse operation of #decelerate
282
+ # It is the inverse operation of #slow
281
283
  #
282
- # @see #decelerate
284
+ # @see #slow
283
285
  #
284
286
  # @example
285
- # peek_events %w(a b c d).p([1/2, 1/4]).accelerate(2)
287
+ # peek_events %w(a b c d).p([1/2, 1/4]).fast(2)
286
288
  # #=> [E["a",0,1/4], E["b",1/4,1/8], E["c",3/8,1/4], E["d",5/8,1/8]]
287
289
  #
288
290
  # @param num [Numeric]
289
291
  # @return [Pattern]
290
292
  #
291
- def accelerate(num)
293
+ def fast(num)
292
294
  Pattern.new(self, delta: delta.p / num)
293
295
  end
294
296
 
data/lib/xi/scale.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require 'forwardable'
2
+
1
3
  class Xi::Scale
4
+ extend Forwardable
5
+
2
6
  DEGREES = {
3
7
  # TWELVE TONES PER OCTAVE
4
8
  # 5 note scales
@@ -91,7 +95,23 @@ class Xi::Scale
91
95
 
92
96
  class << self
93
97
  DEGREES.each do |name, list|
94
- define_method(name) { list }
98
+ define_method(name) { self.new(list) }
95
99
  end
96
100
  end
101
+
102
+ attr_reader :notes
103
+
104
+ def initialize(notes)
105
+ @notes = notes
106
+ end
107
+
108
+ def_delegators :@notes, :size, :[], :to_a, :first
109
+
110
+ def p(*delta, **metadata)
111
+ [@notes].p(*delta, **metadata)
112
+ end
113
+
114
+ #def size
115
+ #@notes.size
116
+ #end
97
117
  end
data/lib/xi/stream.rb CHANGED
@@ -33,8 +33,9 @@ module Xi
33
33
 
34
34
  def set(delta: nil, gate: nil, **source)
35
35
  @mutex.synchronize do
36
+ remove_parameters_from_prev_source(source)
36
37
  @source = source
37
- @gate = gate if gate
38
+ @gate = gate || parameter_with_smallest_delta(source)
38
39
  @delta = delta if delta
39
40
  @reset = true unless @playing
40
41
  update_internal_structures
@@ -279,9 +280,21 @@ module Xi
279
280
  n_value, _ = enum.peek
280
281
  update_state(p, n_value)
281
282
  end
283
+ transform_state
282
284
  @reset = false
283
285
  end
284
286
 
287
+ def parameter_with_smallest_delta(source)
288
+ source.min_by { |param, enum|
289
+ delta = enum.p.delta
290
+ delta.is_a?(Array) ? delta.min : delta
291
+ }.first
292
+ end
293
+
294
+ def remove_parameters_from_prev_source(new_source)
295
+ (@source.keys - new_source.keys).each { |k| @state.delete(k) } unless @source.nil?
296
+ end
297
+
285
298
  def latency_sec
286
299
  0.05
287
300
  end
@@ -22,10 +22,6 @@ module Xi::Supercollider
22
22
  at_exit { free_playing_synths }
23
23
  end
24
24
 
25
- def set(params)
26
- super(gate: params[:gate] || :freq, **params)
27
- end
28
-
29
25
  def stop
30
26
  @mutex.synchronize do
31
27
  @playing_synths.each do |so_id|
@@ -1,4 +1,3 @@
1
- require "xi/supercollider/version"
2
1
  require "xi/supercollider/stream"
3
2
 
4
3
  module Xi
data/lib/xi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Xi
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
data/xi.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "pry-byebug"
29
29
  spec.add_development_dependency "guard"
30
30
  spec.add_development_dependency "guard-minitest"
31
+ spec.add_development_dependency "yard"
31
32
 
32
33
  spec.add_dependency 'pry'
33
34
  spec.add_dependency 'osc-ruby'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xi-lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damián Silvani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-22 00:00:00.000000000 Z
11
+ date: 2019-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: pry
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -156,7 +170,6 @@ files:
156
170
  - lib/xi/error_log.rb
157
171
  - lib/xi/logger.rb
158
172
  - lib/xi/osc.rb
159
- - lib/xi/osc/version.rb
160
173
  - lib/xi/pattern.rb
161
174
  - lib/xi/pattern/generators.rb
162
175
  - lib/xi/pattern/transforms.rb
@@ -166,7 +179,6 @@ files:
166
179
  - lib/xi/stream.rb
167
180
  - lib/xi/supercollider.rb
168
181
  - lib/xi/supercollider/stream.rb
169
- - lib/xi/supercollider/version.rb
170
182
  - lib/xi/tidal_clock.rb
171
183
  - lib/xi/version.rb
172
184
  - synthdefs/other.scd
@@ -1,5 +0,0 @@
1
- module Xi
2
- module OSC
3
- VERSION = "0.1.5"
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- module Xi
2
- module Supercollider
3
- VERSION = "0.1.6"
4
- end
5
- end