Files
packages.dart/deprecated/sheet_music/lib/models/scale.dart
2026-01-15 14:38:46 -08:00

131 lines
3.2 KiB
Dart

import 'package:tonic/tonic.dart';
enum PossibleScales {
cMajor,
gMajor,
dMajor,
aMajor,
eMajor,
bMajor,
fSMajor,
cSMajor,
fMajor,
bbMajor,
ebMajor,
abMajor,
dbMajor,
gbMajor,
cbMajor,
}
class ScaleInfo {
final PossibleScales? scale;
final String? name, pattern, note;
ScaleInfo({this.scale, this.name, this.pattern, this.note});
ScaleInfo.parse(String name)
: scale = _getScale(name),
pattern = _getPattern(name),
note = _getNote(name),
name = name.toString();
static String _getNote(String name) {
if (name.isEmpty) return "";
String _note = name;
_note = _note.replaceAll(" ", "");
_note = _note.toLowerCase().replaceAll("major", "");
_note = _note.toLowerCase().replaceAll("minor", "");
_note = _note.toUpperCase();
return _note.trim() + "4";
}
static String _getPattern(String name) {
if (name.toLowerCase().contains('major')) return 'Diatonic Major';
if (name.toLowerCase().contains('minor')) return 'Harmonic Minor';
return 'Diatonic Major';
}
static PossibleScales _getScale(String name) {
switch (name) {
case "C Major":
case "A Minor":
return PossibleScales.cMajor;
case "G Major":
case "E Minor":
return PossibleScales.gMajor;
case "D Major":
case "B Minor":
return PossibleScales.dMajor;
case "A Major":
case "F# Minor":
case "F♯ Minor":
return PossibleScales.aMajor;
case "E Major":
case "C# Minor":
case "C♯ Minor":
return PossibleScales.eMajor;
case "B Major":
case "G# Minor":
case "G♯ Minor":
return PossibleScales.bMajor;
case "F# Major":
case "F♯ Major":
case "D# Minor":
case "D♯ Minor":
return PossibleScales.fSMajor;
case "C# Major":
case "C♯ Major":
case "A# Minor":
case "A♯ Minor":
return PossibleScales.cSMajor;
case "F Major":
case "D Minor":
return PossibleScales.fMajor;
case "Bb Major":
case "B♭ Major":
case "G Minor":
return PossibleScales.bbMajor;
case "Eb Major":
case "E♭ Major":
case "C Minor":
return PossibleScales.ebMajor;
case "Ab Major":
case "A♭ Major":
case "F Minor":
return PossibleScales.abMajor;
case "Db Major":
case "D♭ Major":
case "B♭ Minor":
case "Bb Minor":
return PossibleScales.dbMajor;
case "Gb Major":
case "G♭ Major":
case "E♭ Minor":
case "Eb Minor":
return PossibleScales.gbMajor;
case "Cb Major":
case "C♭ Major":
case "A♭ Minor":
case "Ab Minor":
return PossibleScales.cbMajor;
}
return PossibleScales.cMajor;
}
}
Pitch? getScaleRoot(String scaleName) {
final Pitch _root = Chord.parse(scaleName).root;
final String _newRoot =
_root.toString().replaceAllMapped(new RegExp(r'[0-9]'), (Match match) {
return '4'; // Default Octave
}).trim();
final String scaleRoot = _newRoot.toString();
try {
return Pitch.parse(scaleRoot);
} catch (e) {
print("$scaleRoot => $e");
return null;
}
}