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;
}