adding packages
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
import 'package:tonic/tonic.dart';
|
||||
|
||||
enum PitchType { c, d, f, g, a, b }
|
||||
|
||||
enum PitchTune { sharp, flat, natural }
|
||||
|
||||
class PitchInfo {
|
||||
final PitchType? type;
|
||||
final PitchTune? tune;
|
||||
|
||||
PitchInfo({this.tune, this.type});
|
||||
|
||||
PitchInfo.parse(Pitch pitch)
|
||||
: type = null,
|
||||
tune = _getTune(pitch.accidentalsString);
|
||||
|
||||
static PitchTune _getTune(String pitch) {
|
||||
if (pitch.contains("#")) return PitchTune.sharp;
|
||||
if (pitch.contains("♯")) return PitchTune.sharp;
|
||||
if (pitch.contains("b")) return PitchTune.flat;
|
||||
if (pitch.contains("♭")) return PitchTune.flat;
|
||||
return PitchTune.natural;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,286 @@
|
||||
import 'scale.dart';
|
||||
|
||||
enum Step { DO, RE, MI, FA, SOL, LA, TI }
|
||||
|
||||
Step updateStep(String scale, String pitch) {
|
||||
// print("Scale: $scale, Pitch: $pitch");
|
||||
|
||||
if (pitch == null) return Step.DO;
|
||||
if (scale == null) return Step.DO;
|
||||
|
||||
final PossibleScales? _scale = ScaleInfo.parse(scale).scale;
|
||||
|
||||
switch (_scale) {
|
||||
case PossibleScales.cMajor:
|
||||
//C Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.TI;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.gMajor:
|
||||
//G Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.MI;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.dMajor:
|
||||
//D Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.LA;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.aMajor:
|
||||
//A Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.RE;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.eMajor:
|
||||
//E Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.SOL;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.bMajor:
|
||||
//B Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.DO;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.fSMajor:
|
||||
//F# Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.FA;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.cSMajor:
|
||||
//C# Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.TI;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.fMajor:
|
||||
//F Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.FA;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.bbMajor:
|
||||
//Bb Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.DO;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.ebMajor:
|
||||
//Eb Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.SOL;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.abMajor:
|
||||
//Ab Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.RE;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.dbMajor:
|
||||
//Db Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.LA;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.gbMajor:
|
||||
//Gb Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.TI;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.MI;
|
||||
}
|
||||
break;
|
||||
case PossibleScales.cbMajor:
|
||||
//Cb Major
|
||||
if (pitch.contains("C")) {
|
||||
return Step.DO;
|
||||
} else if (pitch.contains("D")) {
|
||||
return Step.RE;
|
||||
} else if (pitch.contains("E")) {
|
||||
return Step.MI;
|
||||
} else if (pitch.contains("F")) {
|
||||
return Step.FA;
|
||||
} else if (pitch.contains("G")) {
|
||||
return Step.SOL;
|
||||
} else if (pitch.contains("A")) {
|
||||
return Step.LA;
|
||||
} else if (pitch.contains("B")) {
|
||||
return Step.TI;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return Step.DO;
|
||||
}
|
||||
Reference in New Issue
Block a user