distance property
int?
distance
The fifths distance of this KeySignature.
Example:
KeySignature.empty.distance == 0
KeySignature([Note.f.sharp, Note.c.sharp]).distance == 2
KeySignature.fromDistance(-4).distance == -4
KeySignature([Note.g.sharp]).distance == null
Implementation
int? get distance {
if (accidental.isNatural) return 0;
final cleanNotes = clean._notes;
final apparentDistance = cleanNotes.length * accidental.semitones.sign;
final apparentFirstNote =
accidental.isFlat ? _firstCanonicalFlatNote : _firstCanonicalSharpNote;
final circle = Interval.P5.circleFrom(
apparentFirstNote,
distance: apparentDistance.incrementBy(-1),
);
// As `circle` is an Iterable, lazy evaluation takes place
// for efficient comparison, returning early on mismatches.
return const IterableEquality<Note>().equals(cleanNotes, circle)
? apparentDistance
: null;
}