Skip to content

Commit

Permalink
💥 feat(interval)!: move isDissonant getter from `IntervalSizeExtens…
Browse files Browse the repository at this point in the history
…ion` (#222)
  • Loading branch information
albertms10 committed Jul 22, 2023
1 parent a62c69f commit 0ed198b
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 52 deletions.
17 changes: 17 additions & 0 deletions lib/src/interval/interval.dart
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,23 @@ final class Interval implements Comparable<Interval> {
/// ```
Interval get simplified => Interval._(size.simplified, quality);

/// Whether this [Interval] is dissonant.
///
/// Example:
/// ```dart
/// Interval.P1.isDissonant == false
/// Interval.P5.isDissonant == false
/// Interval.d5.isDissonant == true
/// Interval.M7.isDissonant == true
/// (-Interval.m9).isDissonant == true
/// ```
bool get isDissonant =>
switch (quality) {
PerfectQuality(:final semitones) => semitones != 0,
ImperfectQuality(:final semitones) => semitones < 0 && semitones > 1,
} ||
const {2, 7}.contains(simplified.size.abs());

/// Returns this [Interval] respelled by [size] while keeping the same
/// number of [semitones].
///
Expand Down
15 changes: 0 additions & 15 deletions lib/src/interval/interval_size_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,21 +104,6 @@ extension IntervalSizeExtension on int {
return abs() > 8;
}

/// Whether this [Interval.size] is dissonant.
///
/// Example:
/// ```dart
/// 1.isDissonant == false
/// 5.isDissonant == false
/// 7.isDissonant == true
/// (-9).isDissonant == true
/// ```
bool get isDissonant {
assert(this != 0, 'Size must be non-zero');

return const {2, 7}.contains(simplified.abs());
}

/// Returns the simplified version of this [Interval.size].
///
/// Example:
Expand Down
37 changes: 0 additions & 37 deletions test/src/interval/interval_size_extension_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,43 +135,6 @@ void main() {
});
});

group('.isDissonant', () {
test('should throw an assertion error when size is zero', () {
expect(() => 0.isDissonant, throwsA(isA<AssertionError>()));
});

test('should return whether this Interval size is dissonant', () {
expect((-14).isDissonant, isTrue);
expect((-13).isDissonant, isFalse);
expect((-12).isDissonant, isFalse);
expect((-11).isDissonant, isFalse);
expect((-10).isDissonant, isFalse);
expect((-9).isDissonant, isTrue);
expect((-8).isDissonant, isFalse);
expect((-7).isDissonant, isTrue);
expect((-6).isDissonant, isFalse);
expect((-5).isDissonant, isFalse);
expect((-4).isDissonant, isFalse);
expect((-3).isDissonant, isFalse);
expect((-2).isDissonant, isTrue);
expect((-1).isDissonant, isFalse);
expect(1.isDissonant, isFalse);
expect(2.isDissonant, isTrue);
expect(3.isDissonant, isFalse);
expect(4.isDissonant, isFalse);
expect(5.isDissonant, isFalse);
expect(6.isDissonant, isFalse);
expect(7.isDissonant, isTrue);
expect(8.isDissonant, isFalse);
expect(9.isDissonant, isTrue);
expect(10.isDissonant, isFalse);
expect(11.isDissonant, isFalse);
expect(12.isDissonant, isFalse);
expect(13.isDissonant, isFalse);
expect(14.isDissonant, isTrue);
});
});

group('.simplified', () {
test('should throw an assertion error when size is zero', () {
expect(() => 0.simplified, throwsA(isA<AssertionError>()));
Expand Down
47 changes: 47 additions & 0 deletions test/src/interval/interval_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,53 @@ void main() {
});
});

group('.isDissonant', () {
test('should return whether this Interval is dissonant', () {
expect((-Interval.A8).isDissonant, isTrue);
expect((-Interval.P8).isDissonant, isFalse);
expect((-Interval.d8).isDissonant, isTrue);
expect((-Interval.A7).isDissonant, isTrue);
expect((-Interval.M7).isDissonant, isTrue);
expect((-Interval.m7).isDissonant, isTrue);
expect((-Interval.d7).isDissonant, isTrue);
expect((-Interval.M6).isDissonant, isFalse);
expect((-Interval.m6).isDissonant, isFalse);
expect((-Interval.A5).isDissonant, isTrue);
expect((-Interval.P5).isDissonant, isFalse);
expect((-Interval.d5).isDissonant, isTrue);
expect((-Interval.A4).isDissonant, isTrue);
expect((-Interval.P4).isDissonant, isFalse);
expect((-Interval.d4).isDissonant, isTrue);
expect((-Interval.M3).isDissonant, isFalse);
expect((-Interval.m3).isDissonant, isFalse);
expect((-Interval.M2).isDissonant, isTrue);
expect((-Interval.m2).isDissonant, isTrue);
expect((-Interval.P1).isDissonant, isFalse);
expect(Interval.d1.isDissonant, isTrue);
expect(Interval.P1.isDissonant, isFalse);
expect(Interval.A1.isDissonant, isTrue);
expect(Interval.m2.isDissonant, isTrue);
expect(Interval.M2.isDissonant, isTrue);
expect(Interval.m3.isDissonant, isFalse);
expect(Interval.M3.isDissonant, isFalse);
expect(Interval.d4.isDissonant, isTrue);
expect(Interval.P4.isDissonant, isFalse);
expect(Interval.A4.isDissonant, isTrue);
expect(Interval.d5.isDissonant, isTrue);
expect(Interval.P5.isDissonant, isFalse);
expect(Interval.A5.isDissonant, isTrue);
expect(Interval.m6.isDissonant, isFalse);
expect(Interval.M6.isDissonant, isFalse);
expect(Interval.d7.isDissonant, isTrue);
expect(Interval.m7.isDissonant, isTrue);
expect(Interval.M7.isDissonant, isTrue);
expect(Interval.A7.isDissonant, isTrue);
expect(Interval.d8.isDissonant, isTrue);
expect(Interval.P8.isDissonant, isFalse);
expect(Interval.A8.isDissonant, isTrue);
});
});

group('.respellBySize()', () {
test('should return this Interval respelled by size', () {
expect(Interval.A4.respellBySize(5), Interval.d5);
Expand Down

0 comments on commit 0ed198b

Please sign in to comment.