tonal-tools 1.2.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tonal/extensions.rb +101 -146
- data/lib/tonal/ratio.rb +1 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 850c95dbdd71dec89c67eb9b1d709a4f009c4ab48b90d8c3ee7d7553bb27515b
|
4
|
+
data.tar.gz: 450b9ee2401a947857beedb052933d567f1321bef3d6c16e26f3120604105c12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5d7e3540e77d04fe847cf8da7de9766481bc6e74183438466ab6d1e42b3b156ff60397ca319ad3d7a2cf5780dbe94e7c01c1da10518b22de2e4c96ff7e9ea7d
|
7
|
+
data.tar.gz: 075bab07ea64ce20d70b3e131d74d39349c5e15f89f00e44df16c3a3de95e691a795230fed9225433e56a7aeec159b43ec4b46766d96e6714cd8206912fb752c
|
data/lib/tonal/extensions.rb
CHANGED
@@ -5,54 +5,61 @@ class Prime
|
|
5
5
|
# @param lower bound
|
6
6
|
# @param upper bound
|
7
7
|
#
|
8
|
-
def self.within(lower, upper)
|
9
|
-
self.each(upper).reject{|p| p < lower}
|
10
|
-
end
|
8
|
+
def self.within(lower=0, upper) = self.each(upper).reject{|p| p < lower}
|
11
9
|
end
|
12
10
|
|
13
11
|
class Numeric
|
12
|
+
# @return [Numeric] translated modularly
|
13
|
+
# @example
|
14
|
+
# Math::PI.modulo_translate(-3, 3) => -2.858407346410207
|
15
|
+
# @param lower the lower bound of the modulo range
|
16
|
+
# @param upper the upper bound of the modulo range
|
17
|
+
#
|
18
|
+
def modulo_translate(lower=0, upper)
|
19
|
+
range = (upper - lower) == 0 ? 1 : upper - lower
|
20
|
+
(self - lower) % range + lower
|
21
|
+
end
|
22
|
+
|
14
23
|
# @return [Array] a tuple of self offset positively/negatively
|
15
24
|
# @example
|
16
25
|
# Math::PI.plus_minus(3)
|
17
26
|
# => [6.141592653589793, 0.14159265358979312]
|
18
27
|
# @param offset plus and minus distance from self
|
19
28
|
#
|
20
|
-
def plus_minus(offset)
|
21
|
-
|
22
|
-
|
29
|
+
def plus_minus(offset) = [self + offset, self - offset]
|
30
|
+
alias :min_plus :plus_minus
|
31
|
+
|
32
|
+
# @return [Array] a tuple of self divided and multiplied by factor
|
33
|
+
# @example
|
34
|
+
# Math::PI.div_times(3) => [1.0471975511965976, 9.42477796076938]
|
35
|
+
# @param [Numeric]
|
36
|
+
#
|
37
|
+
def div_times(factor) = [self / factor, self * factor]
|
23
38
|
|
24
39
|
# @return [Tonal::ReducedRatio] the octave reduced ratio of self
|
25
40
|
# @example
|
26
41
|
# (2**(1.0/12)).ratio => (4771397596969315/4503599627370496)
|
27
42
|
#
|
28
|
-
def to_ratio(reduced: true, equave: 2/1r)
|
29
|
-
reduced ? Tonal::ReducedRatio.new(self, equave: equave) : Tonal::Ratio.new(self, equave: equave)
|
30
|
-
end
|
43
|
+
def to_ratio(reduced: true, equave: 2/1r) = reduced ? Tonal::ReducedRatio.new(self, equave: equave) : Tonal::Ratio.new(self, equave: equave)
|
31
44
|
alias :ratio :to_ratio
|
32
45
|
|
33
46
|
# @return [Float], the degrees on a circle of self
|
34
47
|
# @example
|
35
48
|
# (2**(6.0/12)).period_degrees => 180.0
|
36
49
|
#
|
37
|
-
def period_degrees
|
38
|
-
self.ratio.period_degrees
|
39
|
-
end
|
50
|
+
def period_degrees = self.ratio.period_degrees
|
40
51
|
|
41
52
|
# @return [Tonal::Log] the log of self to the given base
|
42
53
|
# @example
|
43
54
|
# (3/2r).log(10) => 0.17609125905568124
|
44
55
|
#
|
45
|
-
def log(base)
|
46
|
-
Tonal::Log.new(logarithmand: self, base: base)
|
47
|
-
end
|
56
|
+
def log(base) = Tonal::Log.new(logarithmand: self, base: base)
|
48
57
|
|
49
58
|
# @return [Tonal::Log2] the log2 of self
|
50
59
|
# @example
|
51
60
|
# (3/2r).log2 => 0.5849625007211562
|
52
61
|
#
|
53
|
-
def log2
|
54
|
-
Tonal::Log2.new(logarithmand: self)
|
55
|
-
end
|
62
|
+
def log2 = Tonal::Log2.new(logarithmand: self)
|
56
63
|
alias :to_log2 :log2
|
57
64
|
alias :span :log2
|
58
65
|
|
@@ -60,31 +67,23 @@ class Numeric
|
|
60
67
|
# @example
|
61
68
|
# 700.0.cents => 700.0
|
62
69
|
#
|
63
|
-
def cents
|
64
|
-
Tonal::Cents.new(cents: self)
|
65
|
-
end
|
70
|
+
def cents = Tonal::Cents.new(cents: self)
|
66
71
|
|
67
72
|
# @return [Tonal::Cents] of self interpreted as a cents quantity
|
68
73
|
# @example
|
69
74
|
# 700.0.¢ => 700.0
|
70
75
|
#
|
71
|
-
def ¢
|
72
|
-
cents
|
73
|
-
end
|
76
|
+
def ¢ = cents
|
74
77
|
|
75
78
|
# @return [Tonal::Cents] of self interpreted as a ratio
|
76
79
|
# @example
|
77
80
|
# (3/2r).to_cents => 701.96
|
78
81
|
#
|
79
|
-
def to_cents
|
80
|
-
self.log2.to_cents
|
81
|
-
end
|
82
|
+
def to_cents = self.log2.to_cents
|
82
83
|
|
83
84
|
# @return [Tonal::Hertz] of self
|
84
85
|
#
|
85
|
-
def hz
|
86
|
-
Tonal::Hertz.new(self)
|
87
|
-
end
|
86
|
+
def hz = Tonal::Hertz.new(self)
|
88
87
|
alias :to_hz :hz
|
89
88
|
|
90
89
|
# @return [Step] the step of self in the given modulo
|
@@ -92,133 +91,89 @@ class Numeric
|
|
92
91
|
# (5/4r).step(12) => 4\12
|
93
92
|
# @param modulo
|
94
93
|
#
|
95
|
-
def step(modulo=12)
|
96
|
-
to_log2.step(modulo)
|
97
|
-
end
|
94
|
+
def step(modulo=12) = to_log2.step(modulo)
|
98
95
|
|
99
96
|
# @return [Float] the log product complexity of self
|
100
97
|
# @example
|
101
|
-
# (3/2r).
|
98
|
+
# (3/2r).benedetti_height => 6
|
102
99
|
#
|
103
|
-
def benedetti_height
|
104
|
-
self.ratio.benedetti_height
|
105
|
-
end
|
100
|
+
def benedetti_height = self.ratio.benedetti_height
|
106
101
|
alias :product_complexity :benedetti_height
|
107
102
|
|
108
103
|
# @return [Integer] the product complexity of self
|
109
104
|
# @example
|
110
|
-
# (3/2r).
|
105
|
+
# (3/2r).tenney_height => 2.584962500721156
|
111
106
|
#
|
112
|
-
def tenney_height
|
113
|
-
self.ratio.tenney_height
|
114
|
-
end
|
107
|
+
def tenney_height = self.ratio.tenney_height
|
115
108
|
alias :log_product_complexity :tenney_height
|
116
109
|
|
117
110
|
# @return [Integer] the Weil height
|
118
111
|
# @example
|
119
112
|
# (3/2r).weil_height => 3
|
120
113
|
#
|
121
|
-
def weil_height
|
122
|
-
self.ratio.weil_height
|
123
|
-
end
|
114
|
+
def weil_height = self.ratio.weil_height
|
124
115
|
|
125
116
|
# @return [Tonal::Log2] the log of Weil height
|
126
117
|
# @example
|
127
118
|
# (3/2r).log_weil_height => 1.5849625007211563
|
128
119
|
#
|
129
|
-
def log_weil_height
|
130
|
-
self.ratio.log_weil_height
|
131
|
-
end
|
120
|
+
def log_weil_height = self.ratio.log_weil_height
|
132
121
|
|
133
122
|
# @return [Integer] the Wilson height
|
134
123
|
# @example (14/9r).wilson_height => 13
|
135
124
|
#
|
136
|
-
def wilson_height(reduced: true, equave: 2/1r, prime_rejects: [2])
|
137
|
-
self.ratio(reduced: reduced, equave: equave).wilson_height(prime_rejects: prime_rejects)
|
138
|
-
end
|
125
|
+
def wilson_height(reduced: true, equave: 2/1r, prime_rejects: [2]) = self.ratio(reduced: reduced, equave: equave).wilson_height(prime_rejects: prime_rejects)
|
139
126
|
|
140
127
|
# @return [Float] the cents difference between self and its step in the given modulo
|
141
128
|
# @example
|
142
129
|
# (3/2r).efficiency(12) => -1.955000865387433
|
143
130
|
# @param modulo
|
144
131
|
#
|
145
|
-
def efficiency(modulo)
|
146
|
-
(Tonal::Cents::CENT_SCALE * step(modulo).step / modulo.to_f) - to_cents
|
147
|
-
end
|
132
|
+
def efficiency(modulo) = (Tonal::Cents::CENT_SCALE * step(modulo).step / modulo.to_f) - to_cents
|
148
133
|
|
149
134
|
# @return [Interval] beween self (upper) and ratio (lower)
|
150
135
|
# @example
|
151
136
|
# (133).interval_with(3/2r) => 133/96 (133/128 / 3/2)
|
152
137
|
# @param ratio
|
153
138
|
#
|
154
|
-
def interval_with(ratio)
|
155
|
-
Tonal::Interval.new(self.ratio, ratio)
|
156
|
-
end
|
139
|
+
def interval_with(ratio) = Tonal::Interval.new(self.ratio, ratio)
|
157
140
|
|
158
141
|
# @return [Vector], self represented as a prime vector
|
159
142
|
# @example
|
160
143
|
# (3/2r).prime_vector => Vector[-1, 1]
|
161
144
|
#
|
162
|
-
def prime_vector
|
163
|
-
self.ratio.prime_vector
|
164
|
-
end
|
145
|
+
def prime_vector = self.ratio.prime_vector
|
165
146
|
alias :monzo :prime_vector
|
166
147
|
|
167
148
|
# @return [Array], self decomposed into its prime factors
|
168
149
|
# @example
|
169
150
|
# (31/30r).prime_divisions => [[[31, 1]], [[2, 1], [3, 1], [5, 1]]]
|
170
151
|
#
|
171
|
-
def prime_divisions
|
172
|
-
self.ratio.prime_divisions
|
173
|
-
end
|
152
|
+
def prime_divisions = self.ratio.prime_divisions
|
174
153
|
|
175
154
|
# @return [Integer] the maximum prime factor of self
|
176
155
|
# @example
|
177
156
|
# (31/30r).max_prime => 31
|
178
157
|
#
|
179
|
-
def max_prime
|
180
|
-
prime_divisions.flatten(1).map(&:first).max
|
181
|
-
end
|
158
|
+
def max_prime = prime_divisions.flatten(1).map(&:first).max
|
182
159
|
|
183
160
|
# @return [Integer] the minimum prime factor of self
|
184
161
|
# @example
|
185
162
|
# (31/30r).min_prime => 2
|
186
163
|
#
|
187
|
-
def min_prime
|
188
|
-
prime_divisions.flatten(1).map(&:first).min
|
189
|
-
end
|
190
|
-
|
191
|
-
# @return [Integer] the product complexity of self
|
192
|
-
# @example
|
193
|
-
# (3/2r).benedetti_height => 6
|
194
|
-
#
|
195
|
-
def benedetti_height
|
196
|
-
numerator * denominator
|
197
|
-
end
|
198
|
-
|
199
|
-
# @return [Float] the log product complexity of self
|
200
|
-
# @example
|
201
|
-
# (3/2r).tenney_height => 2.584962500721156
|
202
|
-
#
|
203
|
-
def tenney_height
|
204
|
-
Tonal::Log2.new(logarithmand: benedetti_height)
|
205
|
-
end
|
164
|
+
def min_prime = prime_divisions.flatten(1).map(&:first).min
|
206
165
|
|
207
166
|
# @return [Tonal::ReducedRatio], the Ernst Levy negative of self
|
208
167
|
# @example
|
209
168
|
# (7/4r).negative => (12/7)
|
210
169
|
#
|
211
|
-
def negative
|
212
|
-
self.ratio.negative
|
213
|
-
end
|
170
|
+
def negative = self.ratio.negative
|
214
171
|
|
215
172
|
# @return [Tonal::ReducedRatio], the ratio rotated on the given axis, default 1/1
|
216
173
|
# @example
|
217
174
|
# (3/2r).mirror => (4/3)
|
218
175
|
#
|
219
|
-
def mirror(axis=1/1r)
|
220
|
-
self.ratio.mirror(axis)
|
221
|
-
end
|
176
|
+
def mirror(axis=1/1r) = self.ratio.mirror(axis)
|
222
177
|
end
|
223
178
|
|
224
179
|
class Rational
|
@@ -226,34 +181,26 @@ class Rational
|
|
226
181
|
# @example
|
227
182
|
# (3/2r).to_vector => Vector[3, 2]
|
228
183
|
#
|
229
|
-
def to_vector
|
230
|
-
Vector[self.numerator, self.denominator]
|
231
|
-
end
|
184
|
+
def to_vector = Vector[self.numerator, self.denominator]
|
232
185
|
alias :vector :to_vector
|
233
186
|
|
234
187
|
# @return [Array], self decomposed into its prime factors
|
235
188
|
# @example
|
236
189
|
# (31/30r).prime_divisions => [[[31, 1]], [[2, 1], [3, 1], [5, 1]]]
|
237
190
|
#
|
238
|
-
def prime_divisions
|
239
|
-
self.ratio.prime_divisions
|
240
|
-
end
|
191
|
+
def prime_divisions = self.ratio.prime_divisions
|
241
192
|
|
242
193
|
# @return [Integer] the maximum prime factor of self
|
243
194
|
# @example
|
244
195
|
# (31/30r).max_prime => 31
|
245
196
|
#
|
246
|
-
def max_prime
|
247
|
-
self.ratio.max_prime
|
248
|
-
end
|
197
|
+
def max_prime = self.ratio.max_prime
|
249
198
|
|
250
199
|
# @return [Integer] the minimum prime factor of self
|
251
200
|
# @example
|
252
201
|
# (31/30r).min_prime => 2
|
253
202
|
#
|
254
|
-
def min_prime
|
255
|
-
self.ratio.min_prime
|
256
|
-
end
|
203
|
+
def min_prime = self.ratio.min_prime
|
257
204
|
end
|
258
205
|
|
259
206
|
class Integer
|
@@ -263,34 +210,26 @@ class Integer
|
|
263
210
|
# @example
|
264
211
|
# 72.max_prime => 3
|
265
212
|
#
|
266
|
-
def max_prime
|
267
|
-
self.prime_division.map(&:first).max
|
268
|
-
end
|
213
|
+
def max_prime = self.prime_division.map(&:first).max
|
269
214
|
|
270
215
|
# @return [Integer] the minimum prime factor of self
|
271
216
|
# @example
|
272
217
|
# 72.min_prime => 2
|
273
218
|
#
|
274
|
-
def min_prime
|
275
|
-
self.prime_division.map(&:first).min
|
276
|
-
end
|
219
|
+
def min_prime = self.prime_division.map(&:first).min
|
277
220
|
|
278
221
|
# @return [Integer] the factorial of self
|
279
222
|
# @example
|
280
223
|
# 5.factorial => 120
|
281
224
|
#
|
282
|
-
def factorial
|
283
|
-
(2..self).reduce(1, :*)
|
284
|
-
end
|
225
|
+
def factorial = (2..self).reduce(1, :*)
|
285
226
|
|
286
227
|
# @return [Boolean] if self is coprime with i
|
287
228
|
# @example
|
288
229
|
# 25.coprime?(7) => true
|
289
230
|
# 25.coprime?(5) => false
|
290
231
|
#
|
291
|
-
def coprime?(i)
|
292
|
-
self.gcd(i) == 1
|
293
|
-
end
|
232
|
+
def coprime?(i) = self.gcd(i) == 1
|
294
233
|
|
295
234
|
# @return [Array] list of integers that are coprime with self, up to the value of self
|
296
235
|
# @example
|
@@ -308,9 +247,7 @@ class Integer
|
|
308
247
|
# @example
|
309
248
|
# 10.phi => 4
|
310
249
|
#
|
311
|
-
def phi
|
312
|
-
coprimes.count
|
313
|
-
end
|
250
|
+
def phi = coprimes.count
|
314
251
|
alias :totient :phi
|
315
252
|
|
316
253
|
# @return [Array] of integers that are n-smooth with self
|
@@ -358,43 +295,33 @@ class Array
|
|
358
295
|
# @param min_size
|
359
296
|
# @param value
|
360
297
|
#
|
361
|
-
def rpad(min_size, value = nil)
|
362
|
-
self.dup.rpad!(min_size, value)
|
363
|
-
end
|
298
|
+
def rpad(min_size, value = nil) = self.dup.rpad!(min_size, value)
|
364
299
|
|
365
300
|
# @return [Vector] self converted to a vector
|
366
301
|
# @example
|
367
302
|
# [3,2].to_vector => Vector[3, 2]
|
368
303
|
#
|
369
|
-
def to_vector
|
370
|
-
Vector[*self]
|
371
|
-
end
|
304
|
+
def to_vector = Vector[*self]
|
372
305
|
alias :vector :to_vector
|
373
306
|
|
374
307
|
# @return [Integer] least common multiple of integer elements of self
|
375
308
|
# @example
|
376
309
|
# [3, 2, 7].lcm => 42
|
377
310
|
#
|
378
|
-
def lcm
|
379
|
-
self.reduce(1, :lcm)
|
380
|
-
end
|
311
|
+
def lcm = self.reduce(1, :lcm)
|
381
312
|
|
382
313
|
# @return [Array] of numerators of elements of self
|
383
314
|
# @example
|
384
315
|
# [3/2r, 5/4r].numerators => [3, 5]
|
385
316
|
#
|
386
|
-
def numerators
|
387
|
-
self.map(&:numerator)
|
388
|
-
end
|
317
|
+
def numerators = self.map(&:numerator)
|
389
318
|
alias :antecedents :numerators
|
390
319
|
|
391
320
|
# @return [Array] of denominators of elements of self
|
392
321
|
# @example
|
393
322
|
# [Tonal::Ratio.new(3,2), Tonal::Ratio.new(5,4)].denominators => [2, 4]
|
394
323
|
#
|
395
|
-
def denominators
|
396
|
-
self.map(&:denominator)
|
397
|
-
end
|
324
|
+
def denominators = self.map(&:denominator)
|
398
325
|
alias :consequents :denominators
|
399
326
|
|
400
327
|
# @return [Array] an array of normalized ratios
|
@@ -410,25 +337,57 @@ class Array
|
|
410
337
|
# @example
|
411
338
|
# [3/2r, 4/3r].to_cents => [701.96, 498.04]
|
412
339
|
#
|
413
|
-
def to_cents
|
414
|
-
self.map{|r| r.to_cents}
|
415
|
-
end
|
340
|
+
def to_cents = self.map{|r| r.to_cents}
|
416
341
|
alias :cents :to_cents
|
417
342
|
|
418
343
|
# @return [Float] the mean of the elements of self
|
419
344
|
# @example
|
420
345
|
# [1, 2].mean => 1.5
|
421
346
|
#
|
422
|
-
def mean
|
423
|
-
self.sum / self.count.to_f
|
424
|
-
end
|
347
|
+
def mean = self.sum / self.count.to_f
|
425
348
|
|
426
349
|
# @return [Tonal::ReducedRatio] ratio reconstructed from the result of a prime factor decomposition
|
427
350
|
# @example
|
428
351
|
# [[[3, 1]], [[2, 1]]].ratio_from_prime_divisions => (3/2)
|
429
352
|
#
|
430
|
-
def ratio_from_prime_divisions
|
431
|
-
|
353
|
+
def ratio_from_prime_divisions = Tonal::Ratio.new(Prime.int_from_prime_division(self.first), Prime.int_from_prime_division(self.last))
|
354
|
+
|
355
|
+
# @return [Array] translated by value
|
356
|
+
# @example
|
357
|
+
# [0.24184760813024642, 0.49344034900361244, 0.07231824070126536].translate(-0.07231824070126536) = [0.16952936742898106, 0.4211221083023471, 0.0]
|
358
|
+
# @param value [Numeric] the value that is translating self
|
359
|
+
#
|
360
|
+
def translate(value) = self.map{|e| e + value}
|
361
|
+
|
362
|
+
|
363
|
+
# @return [Array] rescaled by new minimum and new maximum
|
364
|
+
# @example
|
365
|
+
# [0.47943068514319154, 0.7161083818132802, 0.19855867360591783].rescale(0,3)
|
366
|
+
# => [1.6280871600341376, 3.0, 0.0]
|
367
|
+
# @param new_min
|
368
|
+
# @param new_max
|
369
|
+
#
|
370
|
+
def rescale(new_min=0, new_max)
|
371
|
+
old_min = min
|
372
|
+
old_max = max
|
373
|
+
|
374
|
+
self.map do |x|
|
375
|
+
new_min + ((x - old_min) * (new_max - new_min)) / (old_max - old_min)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
# @return [Array] translated modularly
|
380
|
+
# @example
|
381
|
+
# [-6.617469071022061, 4.755369851099594, 7.588140911919945, -6.49706614430203].modulo_translate(-3, 5)
|
382
|
+
# => [1.382530928977939, 4.755369851099594,-0.411859088080055, 1.50293385569797]
|
383
|
+
# @param lower the lower bound of the modulo range
|
384
|
+
# @param upper the upper bound of the modulo range
|
385
|
+
#
|
386
|
+
def modulo_translate(lower=0, upper)
|
387
|
+
range = (upper - lower) == 0 ? 1 : upper - lower
|
388
|
+
map do |value|
|
389
|
+
(value - lower) % range + lower
|
390
|
+
end
|
432
391
|
end
|
433
392
|
end
|
434
393
|
|
@@ -439,9 +398,7 @@ class Vector
|
|
439
398
|
# @param reduced
|
440
399
|
# @param equave
|
441
400
|
#
|
442
|
-
def to_ratio(reduced: true, equave: 2/1r)
|
443
|
-
reduced ? Tonal::ReducedRatio.new(*self, equave: equave) : Tonal::Ratio.new(*self, equave: equave)
|
444
|
-
end
|
401
|
+
def to_ratio(reduced: true, equave: 2/1r) = reduced ? Tonal::ReducedRatio.new(*self, equave: equave) : Tonal::Ratio.new(*self, equave: equave)
|
445
402
|
alias :ratio :to_ratio
|
446
403
|
end
|
447
404
|
|
@@ -451,9 +408,7 @@ module Math
|
|
451
408
|
# Math.factorial(10) => 3628800
|
452
409
|
# @param limit
|
453
410
|
#
|
454
|
-
def self.factorial(limit)
|
455
|
-
(2..limit).reduce(1, :*)
|
456
|
-
end
|
411
|
+
def self.factorial(limit) = (2..limit).reduce(1, :*)
|
457
412
|
|
458
413
|
PHI = (1 + 5**(1.0/2))/2
|
459
414
|
end
|
data/lib/tonal/ratio.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tonal-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jose Hales-Garcia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yaml
|
@@ -191,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
191
|
- !ruby/object:Gem::Version
|
192
192
|
version: '3.1'
|
193
193
|
requirements: []
|
194
|
-
rubygems_version: 3.5.
|
194
|
+
rubygems_version: 3.5.4
|
195
195
|
signing_key:
|
196
196
|
specification_version: 4
|
197
197
|
summary: Tonal tools
|