Class: Tonal::Ratio
- Inherits:
-
Object
- Object
- Tonal::Ratio
- Extended by:
- Forwardable
- Includes:
- Comparable
- Defined in:
- lib/tonal/approximation.rb,
lib/tonal/ratio.rb
Direct Known Subclasses
Defined Under Namespace
Classes: Approximation
Constant Summary collapse
- PRECISION =
2
Instance Attribute Summary collapse
-
#antecedent ⇒ Object
(also: #numerator)
readonly
Returns the value of attribute antecedent.
-
#consequent ⇒ Object
(also: #denominator)
readonly
Returns the value of attribute consequent.
-
#equave ⇒ Object
readonly
Returns the value of attribute equave.
-
#label ⇒ String
Symbolic representation of Tonal::Ratio.
-
#reduced_antecedent ⇒ Object
readonly
Returns the value of attribute reduced_antecedent.
-
#reduced_consequent ⇒ Object
readonly
Returns the value of attribute reduced_consequent.
Class Method Summary collapse
-
.ed(modulo, step, equave: 2) ⇒ Tonal::Ratio
The ratio of step in the modulo.
-
.random_ratio(number_of_factors = 2, within: 100, reduced: false) ⇒ Tonal::Ratio
A randomly generated ratio.
-
.superparticular(n, factor: 1, superpart: :upper) ⇒ Tonal::Ratio
Ratio who’s numerator and denominator are seperated by a difference of 1.
-
.superpartient(n, summand:, factor: 1, superpart: :upper) ⇒ Tonal::Ratio
Ratio who’s numerator and denominator are separated by a summand difference.
-
.within_cents?(cents1, cents2, within) ⇒ Boolean
If pair of ratios are within the given cents limit.
Instance Method Summary collapse
- #*(rhs) ⇒ Object
- #**(rhs) ⇒ Object
- #+(rhs) ⇒ Object
- #-(rhs) ⇒ Object
- #/(rhs) ⇒ Object
- #<=>(rhs) ⇒ Object
-
#approximate ⇒ Tonal::Ratio::Approximation
Self’s approximation instance.
-
#benedetti_height ⇒ Integer
(also: #product_complexity)
The product complexity of self.
-
#cent_diff(other_ratio) ⇒ Tonal::Cents
Cent difference between self and other ratio.
-
#combination ⇒ Integer
(also: #comb)
The sum of antecedent and consequent.
-
#difference ⇒ Integer
(also: #diff)
The difference between antecedent and consequent.
-
#div_times(other_ratio) ⇒ Array
The results of ratio dividing and multiplying self.
-
#efficiency(modulo) ⇒ Tonal::Cents
The cents difference between self and its step in the given modulo.
-
#equave_reduce(equave = 2) ⇒ Tonal::Ratio
(also: #reduce, #reduced)
Copy of self reduced to the given equave.
-
#equave_reduce!(equave = 2) ⇒ Tonal::Ratio
(also: #reduce!, #reduced!)
Self reduced to the given equave.
-
#fraction_reduce ⇒ Tonal::Ratio
Copy of self rationally reduced.
- #initialize(antecedent, consequent = nil, label: nil, equave: 2) ⇒ Tonal::Ratio constructor
-
#inspect ⇒ String
(also: #to_s)
The string representation of Tonal::Ratio.
-
#interval_with(antecedent, consequent = nil) ⇒ Tonal::Interval
Between ratio (upper) and self (lower).
-
#invert ⇒ Tonal::Ratio
(also: #reflect)
Copy of self with the antecedent and precedent switched.
-
#invert! ⇒ Tonal::Ratio
With antecedent and precedent switched.
-
#lcm(lhs) ⇒ Integer
The least common multiple with self’s denominator and the given number’s denominator.
-
#log_weil_height ⇒ Tonal::Log2
The log of Weil height.
-
#max_prime ⇒ Integer
The maximum prime factor of self.
-
#max_prime_within?(number) ⇒ Boolean
Whether self’s max prime is within the given number.
-
#mediant_sum(number) ⇒ Tonal::Ratio
(also: #mediant, #farey_sum)
The mediant (Farey) sum of self and another number.
-
#min_prime ⇒ Integer
The minimum prime factor of self.
-
#mirror(axis = 1) ⇒ Tonal::Ratio
The mirror of self along the axis (default 1/1).
-
#negative ⇒ Tonal::ReducedRatio
The Ernst Levy negative of self.
-
#period_degrees(round: PRECISION) ⇒ Float
Degrees.
-
#period_radians(round: PRECISION) ⇒ Float
Radians.
-
#planar_degrees(round: PRECISION) ⇒ Float
Degrees of antecedent (x) and consequent (y) on a 2D plane.
-
#planar_radians(round: PRECISION) ⇒ Float
Radians.
-
#plus_minus(other_ratio) ⇒ Array
(also: #min_plus)
The results of ratio subtracted and added to self.
-
#prime_divisions ⇒ Array
, self decomposed into its prime factors.
-
#prime_vector ⇒ Vector
(also: #monzo)
, self represented as a prime vector.
-
#ratio ⇒ Tonal::Ratio
(also: #to_ratio)
Convenience method returning self.
-
#scale(a, b = a) ⇒ Tonal::Ratio
Self scaled by given arguments.
-
#shear(a, b = a) ⇒ Tonal::Ratio
Self sheared by given arguments.
-
#step(modulo = 12) ⇒ Integer
The step of self in the given modulo.
-
#tenney_height ⇒ Tonal::Log2
(also: #log_product_complexity, #harmonic_distance)
The log product complexity of self.
-
#to_a ⇒ Array
Antecedent and consequent as elements of Array.
-
#to_cents ⇒ Tonal::Cents
(also: #cents)
Cents value of self.
-
#to_f ⇒ Float
Self as a Float.
-
#to_log(base = 2) ⇒ Tonal::Log
(also: #log)
Math.log of self in given base.
-
#to_log2 ⇒ Tonal::Log2
(also: #log2)
Math.log2 of self.
-
#to_r ⇒ Rational
Self as a Rational.
-
#to_reduced_ratio ⇒ Tonal::ReducedRatio
(also: #reduced_ratio)
Of self.
-
#to_v ⇒ Vector
Antecedent and consequent as elements of Vector.
-
#translate(x = 1, y = 0) ⇒ Tonal::Ratio
Ratio grid transformations numerator mapped on x-axis, denominator mapped on y-axis ==================================.
-
#weil_height ⇒ Integer
The Weil height.
-
#wilson_height(prime_rejects: [2]) ⇒ Integer
The Wilson height.
Constructor Details
#initialize(antecedent, consequent = nil, label: nil, equave: 2) ⇒ Tonal::Ratio
19 20 21 22 23 24 |
# File 'lib/tonal/ratio.rb', line 19 def initialize(antecedent, consequent=nil, label: nil, equave: 2/1r) raise ArgumentError, "Antecedent must be Numeric" unless antecedent.kind_of?(Numeric) raise ArgumentError, "Consequent must be Numeric or nil" unless (consequent.kind_of?(Numeric) || consequent.nil?) _initialize(antecedent, consequent, label:, equave:) end |
Instance Attribute Details
#antecedent ⇒ Object (readonly) Also known as: numerator
Returns the value of attribute antecedent.
9 10 11 |
# File 'lib/tonal/ratio.rb', line 9 def antecedent @antecedent end |
#consequent ⇒ Object (readonly) Also known as: denominator
Returns the value of attribute consequent.
9 10 11 |
# File 'lib/tonal/ratio.rb', line 9 def consequent @consequent end |
#equave ⇒ Object (readonly)
Returns the value of attribute equave.
9 10 11 |
# File 'lib/tonal/ratio.rb', line 9 def equave @equave end |
#label ⇒ String
Returns symbolic representation of Tonal::Ratio.
472 473 474 |
# File 'lib/tonal/ratio.rb', line 472 def label @label end |
#reduced_antecedent ⇒ Object (readonly)
Returns the value of attribute reduced_antecedent.
9 10 11 |
# File 'lib/tonal/ratio.rb', line 9 def reduced_antecedent @reduced_antecedent end |
#reduced_consequent ⇒ Object (readonly)
Returns the value of attribute reduced_consequent.
9 10 11 |
# File 'lib/tonal/ratio.rb', line 9 def reduced_consequent @reduced_consequent end |
Class Method Details
.ed(modulo, step, equave: 2) ⇒ Tonal::Ratio
Returns the ratio of step in the modulo.
82 83 84 |
# File 'lib/tonal/ratio.rb', line 82 def self.ed(modulo, step, equave: 2/1r) self.new(2**(step.to_f/modulo), equave: equave) end |
.random_ratio(number_of_factors = 2, within: 100, reduced: false) ⇒ Tonal::Ratio
Returns a randomly generated ratio.
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/tonal/ratio.rb', line 63 def self.random_ratio(number_of_factors = 2, within: 100, reduced: false) primes = Prime.each(within).to_a nums = [] dens = [] 1.upto(number_of_factors) do nums << [primes[rand(10)], rand(3)] dens << [primes[rand(10)], rand(3)] end [nums, dens].ratio_from_prime_divisions(reduced:) end |
.superparticular(n, factor: 1, superpart: :upper) ⇒ Tonal::Ratio
Returns ratio who’s numerator and denominator are seperated by a difference of 1.
36 37 38 |
# File 'lib/tonal/ratio.rb', line 36 def self.superparticular(n, factor: 1/1r, superpart: :upper) superpartient(n, summand: 1, factor:, superpart:) end |
.superpartient(n, summand:, factor: 1, superpart: :upper) ⇒ Tonal::Ratio
Returns ratio who’s numerator and denominator are separated by a summand difference.
48 49 50 51 52 53 54 55 |
# File 'lib/tonal/ratio.rb', line 48 def self.superpartient(n, summand:, factor: 1/1r, superpart: :upper) case superpart.to_sym.downcase when :lower, :consequent, :denominator self.new(n*factor.numerator, (n+summand)*factor.denominator) else self.new((n+summand)*factor.numerator, n*factor.denominator) end end |
.within_cents?(cents1, cents2, within) ⇒ Boolean
Returns if pair of ratios are within the given cents limit.
93 94 95 |
# File 'lib/tonal/ratio.rb', line 93 def self.within_cents?(cents1, cents2, within) (cents1 - cents2).abs <= within end |
Instance Method Details
#*(rhs) ⇒ Object
496 497 498 |
# File 'lib/tonal/ratio.rb', line 496 def *(rhs) operate(rhs, :*) end |
#**(rhs) ⇒ Object
504 505 506 |
# File 'lib/tonal/ratio.rb', line 504 def **(rhs) operate(rhs, :**) end |
#+(rhs) ⇒ Object
488 489 490 |
# File 'lib/tonal/ratio.rb', line 488 def +(rhs) operate(rhs, :+) end |
#-(rhs) ⇒ Object
492 493 494 |
# File 'lib/tonal/ratio.rb', line 492 def -(rhs) operate(rhs, :-) end |
#/(rhs) ⇒ Object
500 501 502 |
# File 'lib/tonal/ratio.rb', line 500 def /(rhs) operate(rhs, :/) end |
#<=>(rhs) ⇒ Object
562 563 564 565 566 |
# File 'lib/tonal/ratio.rb', line 562 def <=>(rhs) left = consequent == 0 ? Float::INFINITY : Rational(antecedent, consequent) right = rhs.denominator == 0 ? Float::INFINITY : Rational(rhs.numerator, rhs.denominator) left <=> right end |
#approximate ⇒ Tonal::Ratio::Approximation
Returns self’s approximation instance.
106 107 108 |
# File 'lib/tonal/ratio.rb', line 106 def approximate @approximation end |
#benedetti_height ⇒ Integer Also known as: product_complexity
Returns the product complexity of self.
389 390 391 |
# File 'lib/tonal/ratio.rb', line 389 def benedetti_height reduced_antecedent * reduced_consequent end |
#cent_diff(other_ratio) ⇒ Tonal::Cents
Returns cent difference between self and other ratio.
466 467 468 |
# File 'lib/tonal/ratio.rb', line 466 def cent_diff(other_ratio) cents - other_ratio.ratio.cents end |
#combination ⇒ Integer Also known as: comb
Returns the sum of antecedent and consequent.
557 558 559 |
# File 'lib/tonal/ratio.rb', line 557 def combination antecedent + consequent end |
#difference ⇒ Integer Also known as: diff
Returns the difference between antecedent and consequent.
548 549 550 |
# File 'lib/tonal/ratio.rb', line 548 def difference antecedent - consequent end |
#div_times(other_ratio) ⇒ Array
Returns the results of ratio dividing and multiplying self.
445 446 447 448 |
# File 'lib/tonal/ratio.rb', line 445 def div_times(other_ratio) other_ratio = self.class.new(other_ratio) [self / other_ratio, self * other_ratio] end |
#efficiency(modulo) ⇒ Tonal::Cents
Returns the cents difference between self and its step in the given modulo.
434 435 436 437 438 |
# File 'lib/tonal/ratio.rb', line 434 def efficiency(modulo) # We want the efficiency from the ratio (self). # If the step efficiency is X cents, then the ratio efficiency is -X cents. step(modulo).efficiency * -1.0 end |
#equave_reduce(equave = 2) ⇒ Tonal::Ratio Also known as: reduce, reduced
Returns copy of self reduced to the given equave.
215 216 217 |
# File 'lib/tonal/ratio.rb', line 215 def equave_reduce(equave=2/1r) self.class.new(*_equave_reduce(equave)) end |
#equave_reduce!(equave = 2) ⇒ Tonal::Ratio Also known as: reduce!, reduced!
Returns self reduced to the given equave.
226 227 228 229 |
# File 'lib/tonal/ratio.rb', line 226 def equave_reduce!(equave=2/1r) @antecedent, @consequent = _equave_reduce(equave) self end |
#fraction_reduce ⇒ Tonal::Ratio
Returns copy of self rationally reduced.
206 207 208 |
# File 'lib/tonal/ratio.rb', line 206 def fraction_reduce self.class.new(to_r) end |
#inspect ⇒ String Also known as: to_s
Returns the string representation of Tonal::Ratio.
483 484 485 |
# File 'lib/tonal/ratio.rb', line 483 def inspect "(#{antecedent}/#{consequent})" end |
#interval_with(antecedent, consequent = nil) ⇒ Tonal::Interval
Returns between ratio (upper) and self (lower).
539 540 541 542 |
# File 'lib/tonal/ratio.rb', line 539 def interval_with(antecedent, consequent=nil) r = self.class.new(antecedent, consequent) Tonal::Interval.new(self, r) end |
#invert ⇒ Tonal::Ratio Also known as: reflect
Returns copy of self with the antecedent and precedent switched.
246 247 248 |
# File 'lib/tonal/ratio.rb', line 246 def invert self.class.new(consequent, antecedent) end |
#invert! ⇒ Tonal::Ratio
Returns with antecedent and precedent switched.
255 256 257 258 |
# File 'lib/tonal/ratio.rb', line 255 def invert! _initialize(consequent, antecedent, label: label, equave: equave) self end |
#lcm(lhs) ⇒ Integer
Returns the least common multiple with self’s denominator and the given number’s denominator.
528 529 530 |
# File 'lib/tonal/ratio.rb', line 528 def lcm(lhs) [self.denominator, lhs.denominator].lcm end |
#log_weil_height ⇒ Tonal::Log2
Returns the log of Weil height.
417 418 419 |
# File 'lib/tonal/ratio.rb', line 417 def log_weil_height Tonal::Log2.new(logarithmand: weil_height) end |
#max_prime ⇒ Integer
Returns the maximum prime factor of self.
364 365 366 |
# File 'lib/tonal/ratio.rb', line 364 def max_prime prime_divisions.flatten(1).map(&:first).max end |
#max_prime_within?(number) ⇒ Boolean
Returns whether self’s max prime is within the given number.
381 382 383 |
# File 'lib/tonal/ratio.rb', line 381 def max_prime_within?(number) max_prime <= number end |
#mediant_sum(number) ⇒ Tonal::Ratio Also known as: mediant, farey_sum
Returns the mediant (Farey) sum of self and another number.
513 514 515 |
# File 'lib/tonal/ratio.rb', line 513 def mediant_sum(number) self.class.new(antecedent + number.numerator, consequent + number.denominator) end |
#min_prime ⇒ Integer
Returns the minimum prime factor of self.
372 373 374 |
# File 'lib/tonal/ratio.rb', line 372 def min_prime prime_divisions.flatten(1).map(&:first).min end |
#mirror(axis = 1) ⇒ Tonal::Ratio
Returns the mirror of self along the axis (default 1/1).
265 266 267 |
# File 'lib/tonal/ratio.rb', line 265 def mirror(axis=1/1r) (self.class.new(axis) ** 2) / self end |
#negative ⇒ Tonal::ReducedRatio
Returns the Ernst Levy negative of self.
273 274 275 |
# File 'lib/tonal/ratio.rb', line 273 def negative self.class.new(3/2r) / self end |
#period_degrees(round: PRECISION) ⇒ Float
Returns degrees.
188 189 190 |
# File 'lib/tonal/ratio.rb', line 188 def period_degrees(round: PRECISION) (360.0 * Math.log(to_f, equave)).round(round) end |
#period_radians(round: PRECISION) ⇒ Float
Returns radians.
197 198 199 |
# File 'lib/tonal/ratio.rb', line 197 def period_radians(round: PRECISION) (2 * Math::PI * Math.log(to_f, equave)).round(round) end |
#planar_degrees(round: PRECISION) ⇒ Float
Returns degrees of antecedent (x) and consequent (y) on a 2D plane.
321 322 323 |
# File 'lib/tonal/ratio.rb', line 321 def planar_degrees(round: PRECISION) (Math.atan2(consequent, antecedent) * 180/Math::PI).round(round) end |
#planar_radians(round: PRECISION) ⇒ Float
Returns radians.
330 331 332 |
# File 'lib/tonal/ratio.rb', line 330 def planar_radians(round: PRECISION) Math.atan2(consequent, antecedent).round(round) end |
#plus_minus(other_ratio) ⇒ Array Also known as: min_plus
Returns the results of ratio subtracted and added to self.
455 456 457 458 |
# File 'lib/tonal/ratio.rb', line 455 def plus_minus(other_ratio) other_ratio = self.class.new(other_ratio) [self - other_ratio, self + other_ratio] end |
#prime_divisions ⇒ Array
Returns , self decomposed into its prime factors.
338 339 340 341 |
# File 'lib/tonal/ratio.rb', line 338 def prime_divisions return [[[2, 1]], [[2, 1]]] if antecedent == 1 [antecedent.prime_division, consequent.prime_division] end |
#prime_vector ⇒ Vector Also known as: monzo
Returns , self represented as a prime vector.
347 348 349 350 351 352 353 354 355 356 357 |
# File 'lib/tonal/ratio.rb', line 347 def prime_vector pds = prime_divisions max = [pds.first.max{|p| p.first}, pds.last.max{|p| p.first}].max.first pds.last.collect!{|i| [i.first, -i.last]} p_arr = Prime.each(max).to_a Array.new(p_arr.count, 0).tap do |arr| pds.flatten(1).each{|e| arr[p_arr.find_index(e.first)] = e.last} end.to_vector end |
#ratio ⇒ Tonal::Ratio Also known as: to_ratio
Returns convenience method returning self.
99 100 101 |
# File 'lib/tonal/ratio.rb', line 99 def ratio self end |
#scale(a, b = a) ⇒ Tonal::Ratio
Returns self scaled by given arguments.
300 301 302 303 |
# File 'lib/tonal/ratio.rb', line 300 def scale(a, b=a) raise_if_negative(a,b) self.class.new(*(Matrix[[a, 0],[0, b]] * Vector[antecedent, consequent])) end |
#shear(a, b = a) ⇒ Tonal::Ratio
Returns self sheared by given arguments.
311 312 313 314 |
# File 'lib/tonal/ratio.rb', line 311 def shear(a, b=a) raise_if_negative(a,b) self.class.new(*((Matrix[[1,a],[0,1]] * Matrix[[1,0], [b,1]]) * Vector[antecedent, consequent])) end |
#step(modulo = 12) ⇒ Integer
Returns the step of self in the given modulo.
179 180 181 |
# File 'lib/tonal/ratio.rb', line 179 def step(modulo=12) Tonal::Step.new(ratio: to_r, modulo: modulo) end |
#tenney_height ⇒ Tonal::Log2 Also known as: log_product_complexity, harmonic_distance
Returns the log product complexity of self.
398 399 400 |
# File 'lib/tonal/ratio.rb', line 398 def tenney_height Tonal::Log2.new(logarithmand: benedetti_height) end |
#to_a ⇒ Array
Returns antecedent and consequent as elements of Array.
118 119 120 |
# File 'lib/tonal/ratio.rb', line 118 def to_a [antecedent, consequent] end |
#to_cents ⇒ Tonal::Cents Also known as: cents
Returns cents value of self.
170 171 172 |
# File 'lib/tonal/ratio.rb', line 170 def to_cents Tonal::Cents.new(ratio: to_r) end |
#to_f ⇒ Float
Returns self as a Float.
143 144 145 |
# File 'lib/tonal/ratio.rb', line 143 def to_f antecedent.to_f / consequent.to_f end |
#to_log(base = 2) ⇒ Tonal::Log Also known as: log
Returns Math.log of self in given base.
152 153 154 |
# File 'lib/tonal/ratio.rb', line 152 def to_log(base=2) Tonal::Log.new(logarithmand: to_r, base: base) end |
#to_log2 ⇒ Tonal::Log2 Also known as: log2
Returns Math.log2 of self.
161 162 163 |
# File 'lib/tonal/ratio.rb', line 161 def to_log2 Tonal::Log2.new(logarithmand: to_r) end |
#to_r ⇒ Rational
Returns self as a Rational.
134 135 136 137 |
# File 'lib/tonal/ratio.rb', line 134 def to_r return Float::INFINITY if consequent.zero? || !antecedent.finite? Rational(antecedent, consequent) end |
#to_reduced_ratio ⇒ Tonal::ReducedRatio Also known as: reduced_ratio
Returns of self.
237 238 239 |
# File 'lib/tonal/ratio.rb', line 237 def to_reduced_ratio Tonal::ReducedRatio.new(reduced_antecedent, reduced_consequent, equave: equave) end |
#to_v ⇒ Vector
Returns antecedent and consequent as elements of Vector.
126 127 128 |
# File 'lib/tonal/ratio.rb', line 126 def to_v Vector[antecedent, consequent] end |
#translate(x = 1, y = 0) ⇒ Tonal::Ratio
Ratio grid transformations numerator mapped on x-axis, denominator mapped on y-axis
289 290 291 292 |
# File 'lib/tonal/ratio.rb', line 289 def translate(x=1, y=0) raise_if_negative(x,y) self.class.new(*(Vector[antecedent, consequent] + Vector[x, y])) end |
#weil_height ⇒ Integer
Returns the Weil height.
408 409 410 |
# File 'lib/tonal/ratio.rb', line 408 def weil_height [reduced_antecedent, reduced_consequent].max end |
#wilson_height(prime_rejects: [2]) ⇒ Integer
Returns the Wilson height. The sum of self’s prime factors (greater than 2) times the absolute values of their exponents.
425 426 427 |
# File 'lib/tonal/ratio.rb', line 425 def wilson_height(prime_rejects: [2]) benedetti_height.prime_division.reject{|p| prime_rejects.include?(p.first) }.sum{|p| p.first * p.last } end |