ratio method
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));
}