From efb3282f86e606f5fdcd707720042863fe591138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Ma=C3=B1osa?= Date: Tue, 9 May 2023 00:40:05 +0200 Subject: [PATCH] feat(note): add `circleOfFifthsDistance` getter --- lib/src/note/note.dart | 11 +++++++++++ lib/src/tonality/key_signature.dart | 10 ++++++++++ test/src/note/note_test.dart | 20 ++++++++++++++++++++ test/src/tonality/key_signature_test.dart | 10 ++++++++++ 4 files changed, 51 insertions(+) diff --git a/lib/src/note/note.dart b/lib/src/note/note.dart index d7257edc..f3964eb9 100644 --- a/lib/src/note/note.dart +++ b/lib/src/note/note.dart @@ -79,6 +79,17 @@ class Note implements MusicItem, Transposable { PositionedNote inOctave(int octave) => PositionedNote(note, accidental, octave); + /// Returns the distance in relation to the circle of fifths. + /// + /// Example: + /// ```dart + /// Note.c.circleOfFifthsDistance == 0 + /// Note.d.circleOfFifthsDistance == 2 + /// Note.aFlat.circleOfFifthsDistance == -4 + /// ``` + int get circleOfFifthsDistance => + Tonality(this, TonalMode.major).keySignature.distance; + /// Returns the exact fifths distance between this and [other]. /// /// Example: diff --git a/lib/src/tonality/key_signature.dart b/lib/src/tonality/key_signature.dart index f6f51f48..2f9362dd 100644 --- a/lib/src/tonality/key_signature.dart +++ b/lib/src/tonality/key_signature.dart @@ -28,6 +28,16 @@ class KeySignature implements Comparable { : Accidental.sharp, ); + /// Returns the fifths distance of this [KeySignature]. + /// + /// Example: + /// ```dart + /// const KeySignature(0).distance == 0 + /// const KeySignature(3, Accidental.sharp).distance == 3 + /// const KeySignature(4, Accidental.flat).distance == -4 + /// ``` + int get distance => accidentals * (accidental == Accidental.flat ? -1 : 1); + /// Returns the [Note] that corresponds to the major [Tonality] of this /// [KeySignature]. /// diff --git a/test/src/note/note_test.dart b/test/src/note/note_test.dart index 1312a9d2..5654abdf 100644 --- a/test/src/note/note_test.dart +++ b/test/src/note/note_test.dart @@ -54,6 +54,26 @@ void main() { ); }); + group('.circleOfFifthsDistance', () { + test('should return the circle of fifths distance of this Note', () { + expect(const Note(Notes.c, Accidental.flat).circleOfFifthsDistance, -7); + expect(Note.gFlat.circleOfFifthsDistance, -6); + expect(Note.dFlat.circleOfFifthsDistance, -5); + expect(Note.aFlat.circleOfFifthsDistance, -4); + expect(Note.eFlat.circleOfFifthsDistance, -3); + expect(Note.bFlat.circleOfFifthsDistance, -2); + expect(Note.f.circleOfFifthsDistance, -1); + expect(Note.c.circleOfFifthsDistance, 0); + expect(Note.g.circleOfFifthsDistance, 1); + expect(Note.d.circleOfFifthsDistance, 2); + expect(Note.a.circleOfFifthsDistance, 3); + expect(Note.e.circleOfFifthsDistance, 4); + expect(Note.b.circleOfFifthsDistance, 5); + expect(Note.fSharp.circleOfFifthsDistance, 6); + expect(Note.cSharp.circleOfFifthsDistance, 7); + }); + }); + group('.exactFifthsDistance()', () { test( 'should return the fifths distance between this and other Note', diff --git a/test/src/tonality/key_signature_test.dart b/test/src/tonality/key_signature_test.dart index fccb147f..68cdad4c 100644 --- a/test/src/tonality/key_signature_test.dart +++ b/test/src/tonality/key_signature_test.dart @@ -46,6 +46,16 @@ void main() { }); }); + group('.distance', () { + test('should return the fifths distance of this KeySignature', () { + expect(const KeySignature(7, Accidental.flat).distance, -7); + expect(const KeySignature(2, Accidental.flat).distance, -2); + expect(const KeySignature(0).distance, 0); + expect(const KeySignature(1, Accidental.sharp).distance, 1); + expect(const KeySignature(5, Accidental.sharp).distance, 5); + }); + }); + group('.majorNote', () { test( 'should return the Note that corresponds to the major Tonality of '