ratio method

  1. @override
Ratio ratio(
  1. Pitch pitch
)
override

The Ratio from pitch in this TuningSystem.

Example:

final pt = PythagoreanTuning(referencePitch: Note.c.inOctave(4));
pt.ratio(Note.d.inOctave(4)) == const Ratio(9 / 8)
pt.ratio(Note.f.inOctave(4)) == const Ratio(4 / 3)

final edo12 = EqualTemperament.edo12(referencePitch: Note.a.inOctave(4));
edo12.ratio(Note.b.inOctave(4)) == const Ratio(1.12)
edo12.ratio(Note.d.inOctave(5)) == const Ratio(1.33)

Implementation

@override
Ratio ratio(Pitch pitch) {
  final distance = referencePitch.note.fifthsDistanceWith(pitch.note);
  var ratio = 1.0;
  for (var i = 1; i <= distance.abs(); i++) {
    ratio *= distance.isNegative
        ? JustIntonation.ascendingFourthRatio
        : JustIntonation.ascendingFifthRatio;
    // When ratio is greater than 2, so greater than [Size.octave],
    // divide by 2 to transpose it down by one octave.
    if (ratio >= 2) ratio /= 2;
  }

  final octaveDelta =
      pitch.interval(referencePitch).semitones.abs() ~/ chromaticDivisions;

  return Ratio(ratio * math.pow(2, octaveDelta));
}