Skip to content

Commit

Permalink
feat(int_interval_extension): allow compound intervals in `fromSemito…
Browse files Browse the repository at this point in the history
…nes` (#67)

* feat(int_interval_extension): allow compound intervals in `fromSemitones`

* refactor(int_interval_extension): simplify octaves calc
  • Loading branch information
albertms10 committed Apr 23, 2023
1 parent 9cd7211 commit 14a33c0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
23 changes: 15 additions & 8 deletions lib/src/interval/int_interval_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,21 @@ extension IntIntervalExtension on int {
/// IntIntervalExtension.fromSemitones(12) == 8
/// IntIntervalExtension.fromSemitones(4) == null
/// ```
static int? fromSemitones(int semitones) =>
_intervalsToSemitonesDelta.keys.firstWhereOrNull(
(interval) =>
(semitones == chromaticDivisions
? chromaticDivisions
: semitones.chromaticMod) ==
_intervalsToSemitonesDelta[interval],
);
static int? fromSemitones(int semitones) {
final size = _intervalsToSemitonesDelta.keys.firstWhereOrNull(
(interval) =>
(semitones == chromaticDivisions
? chromaticDivisions
: semitones.chromaticMod) ==
_intervalsToSemitonesDelta[interval],
);
if (size == null) return null;
if (semitones == 12) return size;

final octaves = semitones ~/ chromaticDivisions;

return size + (octaves * 7);
}

/// Returns the number of semitones of this [int] for a perfect interval or a
/// minor interval, where appropriate.
Expand Down
13 changes: 11 additions & 2 deletions test/src/interval/int_interval_extension_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ void main() {
test(
'should return the int interval with the corresponding semitones',
() {
expect(IntIntervalExtension.fromSemitones(-5), 5);
expect(IntIntervalExtension.fromSemitones(-4), 6);
expect(IntIntervalExtension.fromSemitones(-2), 7);
expect(IntIntervalExtension.fromSemitones(0), 1);
expect(IntIntervalExtension.fromSemitones(1), 2);
expect(IntIntervalExtension.fromSemitones(3), 3);
Expand All @@ -15,8 +18,14 @@ void main() {
expect(IntIntervalExtension.fromSemitones(8), 6);
expect(IntIntervalExtension.fromSemitones(10), 7);
expect(IntIntervalExtension.fromSemitones(12), 8);
expect(IntIntervalExtension.fromSemitones(13), 2);
expect(IntIntervalExtension.fromSemitones(-2), 7);
expect(IntIntervalExtension.fromSemitones(13), 9);
expect(IntIntervalExtension.fromSemitones(15), 10);
expect(IntIntervalExtension.fromSemitones(17), 11);
expect(IntIntervalExtension.fromSemitones(19), 12);
expect(IntIntervalExtension.fromSemitones(20), 13);
expect(IntIntervalExtension.fromSemitones(22), 14);
expect(IntIntervalExtension.fromSemitones(24), 15);
expect(IntIntervalExtension.fromSemitones(36), 22);
},
);

Expand Down

0 comments on commit 14a33c0

Please sign in to comment.