Interval constructor

Interval({
  1. required int number,
  2. String? qualityName,
})

Implementation

factory Interval({required int number, String? qualityName}) {
  assert(1 <= number && number <= 8);

  late int semitones;

  try {
    semitones = _semitonesByNumber[number - 1];
  } on RangeError {
    throw new ArgumentError("invalid interval number: $number");
  }

  if (qualityName == null) qualityName = intervalNames[semitones][0];
  final key = "$qualityName$number";
  if (_cache.containsKey(key)) return _cache[key]!;

  final qualitySemitones = _numberIsPerfect(number)
      ? "dPA".indexOf(qualityName) - 1
      : "dmMA".indexOf(qualityName) - 2;

  // if (qualitySemitones < 0)
  //   throw new ArgumentError("invalid interval quality: $qualityName");

  semitones += qualitySemitones;
  return _cache[key] =
      new Interval._internal(number, qualityName, qualitySemitones);
}