Skip to content

Commit

Permalink
Merge 7919769 into 05b4656
Browse files Browse the repository at this point in the history
  • Loading branch information
albertms10 committed Apr 24, 2023
2 parents 05b4656 + 7919769 commit feea362
Show file tree
Hide file tree
Showing 8 changed files with 230 additions and 543 deletions.
70 changes: 55 additions & 15 deletions lib/src/interval/interval.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,53 @@ class Interval implements MusicItem {
const Interval._(this.size, this.quality, {this.descending = false})
: assert(size != 0, 'Size must be non-zero');

static const diminishedUnison =
Interval.perfect(1, PerfectQuality.diminished);
static const perfectUnison = Interval.perfect(1, PerfectQuality.perfect);
static const augmentedUnison = Interval.perfect(1, PerfectQuality.augmented);

static const diminishedSecond =
Interval.imperfect(2, ImperfectQuality.diminished);
static const minorSecond = Interval.imperfect(2, ImperfectQuality.minor);
static const majorSecond = Interval.imperfect(2, ImperfectQuality.major);
static const augmentedSecond =
Interval.imperfect(2, ImperfectQuality.augmented);

static const diminishedThird =
Interval.imperfect(3, ImperfectQuality.diminished);
static const minorThird = Interval.imperfect(3, ImperfectQuality.minor);
static const majorThird = Interval.imperfect(3, ImperfectQuality.major);
static const augmentedThird =
Interval.imperfect(3, ImperfectQuality.augmented);

static const diminishedFourth =
Interval.perfect(4, PerfectQuality.diminished);
static const perfectFourth = Interval.perfect(4, PerfectQuality.perfect);
static const augmentedFourth = Interval.perfect(4, PerfectQuality.augmented);

static const diminishedFifth = Interval.perfect(5, PerfectQuality.diminished);
static const perfectFifth = Interval.perfect(5, PerfectQuality.perfect);
static const augmentedFifth = Interval.perfect(5, PerfectQuality.augmented);

static const diminishedSixth =
Interval.imperfect(6, ImperfectQuality.diminished);
static const minorSixth = Interval.imperfect(6, ImperfectQuality.minor);
static const majorSixth = Interval.imperfect(6, ImperfectQuality.major);
static const augmentedSixth =
Interval.imperfect(6, ImperfectQuality.augmented);

static const diminishedSeventh =
Interval.imperfect(7, ImperfectQuality.diminished);
static const minorSeventh = Interval.imperfect(7, ImperfectQuality.minor);
static const majorSeventh = Interval.imperfect(7, ImperfectQuality.major);
static const augmentedSeventh =
Interval.imperfect(7, ImperfectQuality.augmented);

static const diminishedOctave =
Interval.perfect(8, PerfectQuality.diminished);
static const perfectOctave = Interval.perfect(8, PerfectQuality.perfect);
static const augmentedOctave = Interval.perfect(8, PerfectQuality.augmented);

/// Creates a new [Interval] allowing only perfect quality [size]s.
const Interval.perfect(
this.size,
Expand Down Expand Up @@ -52,14 +99,10 @@ class Interval implements MusicItem {
///
/// Example:
/// ```dart
/// Interval.fromSemitonesQuality(4)
/// == const Interval.imperfect(3, ImperfectQuality.minor)
///
/// Interval.fromSemitonesQuality(7)
/// == const Interval.perfect(4, PerfectQuality.augmented)
///
/// Interval.fromSemitonesQuality(4) == Interval.minorThird
/// Interval.fromSemitonesQuality(7) == Interval.augmentedFourth
/// Interval.fromSemitonesQuality(7, PerfectQuality.diminished)
/// == const Interval.perfect(5, PerfectQuality.diminished)
/// == Interval.diminishedFifth
/// ```
factory Interval.fromSemitonesQuality(
int semitones, [
Expand Down Expand Up @@ -87,10 +130,10 @@ class Interval implements MusicItem {
///
/// Example:
/// ```dart
/// const Interval.imperfect(2, ImperfectQuality.major).semitones == 2
/// Interval.majorSecond.semitones == 2
///
/// const Interval.perfect(5, PerfectQuality.diminished).semitones
/// == const Interval.perfect(4, PerfectQuality.augmented).semitones
/// Interval.diminishedFifth.semitones
/// == Interval.augmentedFourth.semitones
/// == 6
/// ```
@override
Expand All @@ -101,11 +144,8 @@ class Interval implements MusicItem {
///
/// Example:
/// ```dart
/// const Interval.imperfect(3, ImperfectQuality.minor).inverted
/// == const Interval.imperfect(6, ImperfectQuality.major)
///
/// const Interval.perfect(1, PerfectQuality.perfect).inverted
/// == const Interval.perfect(8, PerfectQuality.perfect)
/// Interval.minorThird.inverted == Interval.majorSixth
/// Interval.perfectUnison.inverted == Interval.perfectOctave
/// ```
Interval get inverted => Interval._(size.inverted, quality.inverted);

Expand Down
1 change: 1 addition & 0 deletions lib/src/interval/quality.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ abstract class Quality implements MusicItem {
/// The textual abbreviation of this [Quality].
String? get abbreviation;

/// Returns the inverted version of this [Quality].
Quality get inverted;

@override
Expand Down
3 changes: 1 addition & 2 deletions lib/src/music.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ final Set<EnharmonicNote> chromaticScale = SplayTreeSet<EnharmonicNote>.of({
final List<EnharmonicNote> circleOfFifths = [
for (var i = -1; i < chromaticDivisions - 1; i++)
chromaticScale.elementAt(
(i * const Interval.perfect(5, PerfectQuality.perfect).semitones)
.chromaticMod,
(i * Interval.perfectFifth.semitones).chromaticMod,
),
];
14 changes: 4 additions & 10 deletions lib/src/note/enharmonic_note.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,8 @@ class EnharmonicNote extends Enharmonic<Note>
/// EnharmonicNote.dSharp.shortestFifthsDistance(EnharmonicNote.g) == 4
/// ```
int shortestFifthsDistance(EnharmonicNote other) {
final distanceAbove = enharmonicIntervalDistance(
other,
const Interval.perfect(5, PerfectQuality.perfect),
);
final distanceAbove =
enharmonicIntervalDistance(other, Interval.perfectFifth);
final distanceBelow = enharmonicIntervalDistance(
other,
const Interval.perfect(5, PerfectQuality.perfect, descending: true),
Expand Down Expand Up @@ -179,16 +177,12 @@ class EnharmonicNote extends Enharmonic<Note>
/// ```dart
/// EnharmonicNote.e.enharmonicIntervalDistance(
/// EnharmonicNote.d,
/// const Interval.perfect(5, PerfectQuality.perfect),
/// Interval.perfectFifth,
/// ) == 10
///
/// EnharmonicNote.e.enharmonicIntervalDistance(
/// EnharmonicNote.d,
/// const Interval(
/// 5,
/// PerfectQuality.perfect,
/// descending: true
/// ),
/// const Interval(5, PerfectQuality.perfect, descending: true),
/// ) == 2
/// ```
int enharmonicIntervalDistance(
Expand Down
18 changes: 5 additions & 13 deletions lib/src/note/note.dart
Original file line number Diff line number Diff line change
Expand Up @@ -116,20 +116,15 @@ class Note implements MusicItem, Transposable<Note> {
/// Note.aFlat.exactFifthsDistance(Note.cSharp) == 11
/// Note.aFlat.exactFifthsDistance(Note.dFlat) == -1
/// ```
int exactFifthsDistance(Note other) => intervalDistance(
other,
const Interval.perfect(5, PerfectQuality.perfect),
);
int exactFifthsDistance(Note other) =>
intervalDistance(other, Interval.perfectFifth);

/// Returns the iteration distance of an [interval] between
/// this [Note] and [other].
///
/// Example:
/// ```dart
/// Note.c.intervalDistance(
/// Note.d,
/// const Interval.perfect(5, PerfectQuality.perfect),
/// ) == 2
/// Note.c.intervalDistance(Note.d, Interval.perfectFifth) == 2
/// ```
int intervalDistance(Note other, Interval interval) {
final distanceFlat = _runSemitonesDistance(
Expand Down Expand Up @@ -177,11 +172,8 @@ class Note implements MusicItem, Transposable<Note> {
///
/// Example:
/// ```dart
/// Note.c.exactInterval(Note.d)
/// == const Interval.imperfect(2, ImperfectQuality.minor)
///
/// Note.d.exactInterval(Note.aFlat)
/// == const Interval.perfect(5, PerfectQuality.diminished)
/// Note.c.exactInterval(Note.d) == Interval.minorSecond
/// Note.d.exactInterval(Note.aFlat) == Interval.diminishedFifth
/// ```
Interval exactInterval(Note other) {
final intervalSize = note.intervalSize(other.note);
Expand Down
59 changes: 28 additions & 31 deletions test/src/interval/enharmonic_interval_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,69 +10,66 @@ void main() {
'should return the correct Interval items for this EnharmonicInterval',
() {
expect(EnharmonicInterval.perfectUnison.items, {
const Interval.perfect(1, PerfectQuality.perfect),
const Interval.imperfect(2, ImperfectQuality.diminished),
Interval.perfectUnison,
Interval.diminishedSecond,
});
expect(EnharmonicInterval.minorSecond.items, {
const Interval.perfect(1, PerfectQuality.augmented),
const Interval.imperfect(2, ImperfectQuality.minor),
Interval.augmentedUnison,
Interval.minorSecond,
const Interval.imperfect(3, ImperfectQuality.doubleDiminished),
});
expect(EnharmonicInterval.majorSecond.items, {
const Interval.imperfect(2, ImperfectQuality.major),
const Interval.imperfect(3, ImperfectQuality.diminished),
Interval.majorSecond,
Interval.diminishedThird,
});
expect(EnharmonicInterval.minorThird.items, {
const Interval.imperfect(2, ImperfectQuality.augmented),
const Interval.imperfect(3, ImperfectQuality.minor),
Interval.augmentedSecond,
Interval.minorThird,
const Interval.perfect(4, PerfectQuality.doubleDiminished),
});
expect(EnharmonicInterval.majorThird.items, {
const Interval.imperfect(3, ImperfectQuality.major),
const Interval.perfect(4, PerfectQuality.diminished),
Interval.majorThird,
Interval.diminishedFourth,
});
expect(EnharmonicInterval.perfectFourth.items, {
const Interval.imperfect(3, ImperfectQuality.augmented),
const Interval.perfect(4, PerfectQuality.perfect),
Interval.augmentedThird,
Interval.perfectFourth,
const Interval.perfect(5, PerfectQuality.doubleDiminished),
});
expect(EnharmonicInterval.tritone.items, {
const Interval.perfect(4, PerfectQuality.augmented),
const Interval.perfect(5, PerfectQuality.diminished),
Interval.augmentedFourth,
Interval.diminishedFifth,
});
expect(EnharmonicInterval.perfectFifth.items, {
const Interval.perfect(4, PerfectQuality.doubleAugmented),
const Interval.perfect(5, PerfectQuality.perfect),
const Interval.imperfect(6, ImperfectQuality.diminished),
Interval.perfectFifth,
Interval.diminishedSixth,
});
expect(EnharmonicInterval.minorSixth.items, {
const Interval.perfect(5, PerfectQuality.augmented),
const Interval.imperfect(6, ImperfectQuality.minor),
const Interval.imperfect(
7,
ImperfectQuality.doubleDiminished,
),
Interval.augmentedFifth,
Interval.minorSixth,
const Interval.imperfect(7, ImperfectQuality.doubleDiminished),
});
expect(EnharmonicInterval.majorSixth.items, {
const Interval.imperfect(6, ImperfectQuality.major),
const Interval.imperfect(7, ImperfectQuality.diminished),
Interval.majorSixth,
Interval.diminishedSeventh,
});
expect(EnharmonicInterval.minorSeventh.items, {
const Interval.imperfect(6, ImperfectQuality.augmented),
const Interval.imperfect(7, ImperfectQuality.minor),
Interval.augmentedSixth,
Interval.minorSeventh,
const Interval.perfect(8, PerfectQuality.doubleDiminished),
});
expect(EnharmonicInterval.majorSeventh.items, {
const Interval.imperfect(7, ImperfectQuality.major),
const Interval.perfect(8, PerfectQuality.diminished),
Interval.majorSeventh,
Interval.diminishedOctave,
});
expect(EnharmonicInterval.perfectOctave.items, {
const Interval.imperfect(7, ImperfectQuality.augmented),
const Interval.perfect(8, PerfectQuality.perfect),
Interval.augmentedSeventh,
Interval.perfectOctave,
const Interval.imperfect(9, ImperfectQuality.diminished),
});
expect(const EnharmonicInterval(13).items, {
const Interval.perfect(8, PerfectQuality.augmented),
Interval.augmentedOctave,
const Interval.imperfect(9, ImperfectQuality.minor),
const Interval.imperfect(10, ImperfectQuality.doubleDiminished),
});
Expand Down
Loading

0 comments on commit feea362

Please sign in to comment.