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;
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
library sheet_music;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'util/clef_asset.dart';
|
||||
import 'util/pitch_asset.dart';
|
||||
import 'util/scale_asset.dart';
|
||||
|
||||
const String sheetMusicPackageName = "sheet_music";
|
||||
|
||||
/// Transparent Sheet Music View with [black] color.
|
||||
class SheetMusic extends StatelessWidget {
|
||||
final bool? trebleClef;
|
||||
final String? pitch, scale;
|
||||
|
||||
/// Hide the Sheet Music View.
|
||||
final bool? hide;
|
||||
|
||||
/// Color of the [background], everything else will be [black].
|
||||
/// Defaults to [transparent].
|
||||
final Color? backgroundColor;
|
||||
|
||||
/// Called when the [clef] section is tapped.
|
||||
final VoidCallback? clefTap;
|
||||
|
||||
/// Called when the [scale] section is tapped.
|
||||
final VoidCallback? scaleTap;
|
||||
|
||||
/// Called when the [note] section is tapped.
|
||||
final VoidCallback? pitchTap;
|
||||
|
||||
/// Specify a [height] and [width] for the view. Default [197x100].
|
||||
final double? width, height;
|
||||
|
||||
SheetMusic({
|
||||
required this.trebleClef,
|
||||
required this.scale,
|
||||
required this.pitch,
|
||||
this.pitchTap,
|
||||
this.clefTap,
|
||||
this.scaleTap,
|
||||
this.backgroundColor,
|
||||
this.hide,
|
||||
this.width,
|
||||
this.height,
|
||||
});
|
||||
|
||||
Widget _buildClef(
|
||||
{required double width, double? height, bool dark = false}) {
|
||||
final double _width = width * 0.1979;
|
||||
if (dark) {
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: clefTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getClefAsset(trebleClef ?? true),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: clefTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getClefAsset(trebleClef ?? true),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildScale(
|
||||
{required double width, double? height, bool dark = false}) {
|
||||
final double _width = width * 0.5076;
|
||||
if (dark) {
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: scaleTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getScaleAsset(scale ?? "C Major", trebleClef: trebleClef),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: scaleTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getScaleAsset(scale ?? "C Major", trebleClef: trebleClef),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildPitch(
|
||||
{required double width, double? height, bool dark = false}) {
|
||||
final double _width = width * 0.2944;
|
||||
if (dark) {
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: pitchTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getPitchAsset(pitch ?? "C4", trebleClef: trebleClef),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Container(
|
||||
child: InkWell(
|
||||
onTap: pitchTap,
|
||||
child: SizedBox(
|
||||
height: height,
|
||||
width: _width,
|
||||
child: Image.asset(
|
||||
getPitchAsset(pitch ?? "C4", trebleClef: trebleClef),
|
||||
package: sheetMusicPackageName,
|
||||
fit: BoxFit.fitWidth,
|
||||
colorBlendMode: BlendMode.srcATop,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (hide != null && hide!) return Container();
|
||||
final double _width = ((height ?? 100.0) * 197.0) / 100.0;
|
||||
final double _height = ((width ?? 197.0) * 100.0) / 197.0;
|
||||
final bool dark = Theme.of(context).brightness == Brightness.dark;
|
||||
|
||||
return Material(
|
||||
child: SizedBox(
|
||||
width: _width,
|
||||
height: _height,
|
||||
child: Container(
|
||||
color: backgroundColor,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
_buildClef(width: _width, height: _height, dark: dark),
|
||||
_buildScale(width: _width, height: _height, dark: dark),
|
||||
_buildPitch(width: _width, height: _height, dark: dark),
|
||||
]),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
const String _assetPath = "assets/images";
|
||||
|
||||
const String _clef_path = "$_assetPath/clef";
|
||||
const String _scale_path = "$_assetPath/scale";
|
||||
const String _note_path = "$_assetPath/note";
|
||||
|
||||
const String _treble_path = "treble";
|
||||
const String _bass_path = "bass";
|
||||
|
||||
// Clef
|
||||
const String trebleClef_asset = "$_clef_path/treble_clef.png";
|
||||
const String bassClef_asset = "$_clef_path/bass_clef.png";
|
||||
|
||||
// Scales
|
||||
const String cmajor_treble_asset = "$_scale_path/$_treble_path/c_major.png";
|
||||
const String cmajor_bass_asset = "$_scale_path/$_bass_path/c_major.png";
|
||||
const String gmajor_treble_asset = "$_scale_path/$_treble_path/g_major.png";
|
||||
const String gmajor_bass_asset = "$_scale_path/$_bass_path/g_major.png";
|
||||
const String dmajor_treble_asset = "$_scale_path/$_treble_path/d_major.png";
|
||||
const String dmajor_bass_asset = "$_scale_path/$_bass_path/d_major.png";
|
||||
const String amajor_treble_asset = "$_scale_path/$_treble_path/a_major.png";
|
||||
const String amajor_bass_asset = "$_scale_path/$_bass_path/a_major.png";
|
||||
const String emajor_treble_asset = "$_scale_path/$_treble_path/e_major.png";
|
||||
const String emajor_bass_asset = "$_scale_path/$_bass_path/e_major.png";
|
||||
const String bmajor_treble_asset = "$_scale_path/$_treble_path/b_major.png";
|
||||
const String bmajor_bass_asset = "$_scale_path/$_bass_path/b_major.png";
|
||||
const String fsmajor_treble_asset = "$_scale_path/$_treble_path/fs_major.png";
|
||||
const String fsmajor_bass_asset = "$_scale_path/$_bass_path/fs_major.png";
|
||||
const String csmajor_treble_asset = "$_scale_path/$_treble_path/cs_major.png";
|
||||
const String csmajor_bass_asset = "$_scale_path/$_bass_path/cs_major.png";
|
||||
const String fmajor_treble_asset = "$_scale_path/$_treble_path/f_major.png";
|
||||
const String fmajor_bass_asset = "$_scale_path/$_bass_path/f_major.png";
|
||||
const String bbmajor_treble_asset = "$_scale_path/$_treble_path/bb_major.png";
|
||||
const String bbmajor_bass_asset = "$_scale_path/$_bass_path/bb_major.png";
|
||||
const String ebmajor_treble_asset = "$_scale_path/$_treble_path/eb_major.png";
|
||||
const String ebmajor_bass_asset = "$_scale_path/$_bass_path/eb_major.png";
|
||||
const String abmajor_treble_asset = "$_scale_path/$_treble_path/ab_major.png";
|
||||
const String abmajor_bass_asset = "$_scale_path/$_bass_path/ab_major.png";
|
||||
const String dbmajor_treble_asset = "$_scale_path/$_treble_path/db_major.png";
|
||||
const String dbmajor_bass_asset = "$_scale_path/$_bass_path/db_major.png";
|
||||
const String gbmajor_treble_asset = "$_scale_path/$_treble_path/gb_major.png";
|
||||
const String gbmajor_bass_asset = "$_scale_path/$_bass_path/gb_major.png";
|
||||
const String cbmajor_treble_asset = "$_scale_path/$_treble_path/cb_major.png";
|
||||
const String cbmajor_bass_asset = "$_scale_path/$_bass_path/cb_major.png";
|
||||
|
||||
// Notes
|
||||
const String none_asset = "$_note_path/none.png";
|
||||
const String b1_bass_asset = "$_note_path/$_bass_path/b1.png";
|
||||
const String c2_bass_asset = "$_note_path/$_bass_path/c2.png";
|
||||
const String d2_bass_asset = "$_note_path/$_bass_path/d2.png";
|
||||
const String e2_bass_asset = "$_note_path/$_bass_path/e2.png";
|
||||
const String f2_bass_asset = "$_note_path/$_bass_path/f2.png";
|
||||
const String g2_bass_asset = "$_note_path/$_bass_path/g2.png";
|
||||
const String a2_bass_asset = "$_note_path/$_bass_path/a2.png";
|
||||
const String b2_bass_asset = "$_note_path/$_bass_path/b2.png";
|
||||
const String c3_bass_asset = "$_note_path/$_bass_path/c3.png";
|
||||
const String d3_bass_asset = "$_note_path/$_bass_path/d3.png";
|
||||
const String e3_bass_asset = "$_note_path/$_bass_path/e3.png";
|
||||
const String f3_bass_asset = "$_note_path/$_bass_path/f3.png";
|
||||
const String g3_bass_asset = "$_note_path/$_bass_path/g3.png";
|
||||
const String a3_bass_asset = "$_note_path/$_bass_path/a3.png";
|
||||
const String b3_bass_asset = "$_note_path/$_bass_path/b3.png";
|
||||
const String c4_bass_asset = "$_note_path/$_bass_path/c4.png";
|
||||
const String d4_bass_asset = "$_note_path/$_bass_path/d4.png";
|
||||
const String e4_bass_asset = "$_note_path/$_bass_path/e4.png";
|
||||
const String f4_bass_asset = "$_note_path/$_bass_path/f4.png";
|
||||
const String g3_treble_asset = "$_note_path/$_treble_path/g3.png";
|
||||
const String a3_treble_asset = "$_note_path/$_treble_path/a3.png";
|
||||
const String b3_treble_asset = "$_note_path/$_treble_path/b3.png";
|
||||
const String c4_treble_asset = "$_note_path/$_treble_path/c4.png";
|
||||
const String d4_treble_asset = "$_note_path/$_treble_path/d4.png";
|
||||
const String e4_treble_asset = "$_note_path/$_treble_path/e4.png";
|
||||
const String f4_treble_asset = "$_note_path/$_treble_path/f4.png";
|
||||
const String g4_treble_asset = "$_note_path/$_treble_path/g4.png";
|
||||
const String a4_treble_asset = "$_note_path/$_treble_path/a4.png";
|
||||
const String b4_treble_asset = "$_note_path/$_treble_path/b4.png";
|
||||
const String c5_treble_asset = "$_note_path/$_treble_path/c5.png";
|
||||
const String d5_treble_asset = "$_note_path/$_treble_path/d5.png";
|
||||
const String e5_treble_asset = "$_note_path/$_treble_path/e5.png";
|
||||
const String f5_treble_asset = "$_note_path/$_treble_path/f5.png";
|
||||
const String g5_treble_asset = "$_note_path/$_treble_path/g5.png";
|
||||
const String a5_treble_asset = "$_note_path/$_treble_path/a5.png";
|
||||
const String b5_treble_asset = "$_note_path/$_treble_path/b5.png";
|
||||
const String c6_treble_asset = "$_note_path/$_treble_path/c6.png";
|
||||
const String d6_treble_asset = "$_note_path/$_treble_path/d6.png";
|
||||
@@ -0,0 +1,6 @@
|
||||
import 'assets.dart';
|
||||
|
||||
String getClefAsset(bool trebleClef) {
|
||||
if (trebleClef) return trebleClef_asset;
|
||||
return bassClef_asset;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
const List<String> pitchesTreble = <String>[
|
||||
"G3",
|
||||
"A3",
|
||||
"B3",
|
||||
"C4",
|
||||
"D4",
|
||||
"E4",
|
||||
"F4",
|
||||
"G4",
|
||||
"A4",
|
||||
"B4",
|
||||
"C5",
|
||||
"D5",
|
||||
"E5",
|
||||
"F5",
|
||||
"G5",
|
||||
"A5",
|
||||
"B5",
|
||||
"C6",
|
||||
"D6"
|
||||
];
|
||||
|
||||
const List<String> pitchesBass = <String>[
|
||||
"B1",
|
||||
"C2",
|
||||
"D2",
|
||||
"E2",
|
||||
"F2",
|
||||
"G2",
|
||||
"A2",
|
||||
"B2",
|
||||
"C3",
|
||||
"D3",
|
||||
"E3",
|
||||
"F3",
|
||||
"G3",
|
||||
"A3",
|
||||
"B3",
|
||||
"C4",
|
||||
"D4",
|
||||
"E4",
|
||||
"F4"
|
||||
];
|
||||
@@ -0,0 +1,207 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../models/scale.dart';
|
||||
import 'assets.dart';
|
||||
|
||||
String getPitchAsset(String name, {bool? trebleClef}) {
|
||||
final String pitch = name
|
||||
.replaceAll("♯", "")
|
||||
.replaceAll("#", "")
|
||||
.replaceAll("b", "")
|
||||
.replaceAll("♭", "");
|
||||
|
||||
if (trebleClef != null && trebleClef) {
|
||||
switch (pitch) {
|
||||
case "G3":
|
||||
return g3_treble_asset;
|
||||
case "A3":
|
||||
return a3_treble_asset;
|
||||
case "B3":
|
||||
return b3_treble_asset;
|
||||
case "C4":
|
||||
return c4_treble_asset;
|
||||
case "D4":
|
||||
return d4_treble_asset;
|
||||
case "E4":
|
||||
return e4_treble_asset;
|
||||
case "F4":
|
||||
return f4_treble_asset;
|
||||
case "G4":
|
||||
return g4_treble_asset;
|
||||
case "A4":
|
||||
return a4_treble_asset;
|
||||
case "B4":
|
||||
return b4_treble_asset;
|
||||
case "C5":
|
||||
return c5_treble_asset;
|
||||
case "D5":
|
||||
return d5_treble_asset;
|
||||
case "E5":
|
||||
return e5_treble_asset;
|
||||
case "F5":
|
||||
return f5_treble_asset;
|
||||
case "G5":
|
||||
return g5_treble_asset;
|
||||
case "A5":
|
||||
return a5_treble_asset;
|
||||
case "B5":
|
||||
return b5_treble_asset;
|
||||
case "C6":
|
||||
return c6_treble_asset;
|
||||
case "D6":
|
||||
return d6_treble_asset;
|
||||
default:
|
||||
return none_asset;
|
||||
}
|
||||
}
|
||||
switch (pitch) {
|
||||
case "B1":
|
||||
return b1_bass_asset;
|
||||
case "C2":
|
||||
return c2_bass_asset;
|
||||
case "D2":
|
||||
return d2_bass_asset;
|
||||
case "E2":
|
||||
return e2_bass_asset;
|
||||
case "F2":
|
||||
return f2_bass_asset;
|
||||
case "G2":
|
||||
return g2_bass_asset;
|
||||
case "A2":
|
||||
return a2_bass_asset;
|
||||
case "B2":
|
||||
return b2_bass_asset;
|
||||
case "C3":
|
||||
return c3_bass_asset;
|
||||
case "D3":
|
||||
return d3_bass_asset;
|
||||
case "E3":
|
||||
return e3_bass_asset;
|
||||
case "F3":
|
||||
return f3_bass_asset;
|
||||
case "G3":
|
||||
return g3_bass_asset;
|
||||
case "A3":
|
||||
return a3_bass_asset;
|
||||
case "B3":
|
||||
return b3_bass_asset;
|
||||
case "C4":
|
||||
return c4_bass_asset;
|
||||
case "D4":
|
||||
return d4_bass_asset;
|
||||
case "E4":
|
||||
return e4_bass_asset;
|
||||
case "F4":
|
||||
return f4_bass_asset;
|
||||
default:
|
||||
return none_asset;
|
||||
}
|
||||
}
|
||||
|
||||
String getPitchName({String? scale, required String pitch}) {
|
||||
final PossibleScales? _scale = ScaleInfo.parse(scale ?? "C Major").scale;
|
||||
switch (_scale) {
|
||||
case PossibleScales.cMajor:
|
||||
//C Major
|
||||
break;
|
||||
case PossibleScales.gMajor:
|
||||
//G Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
break;
|
||||
case PossibleScales.dMajor:
|
||||
//D Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
break;
|
||||
case PossibleScales.aMajor:
|
||||
//A Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G#");
|
||||
break;
|
||||
case PossibleScales.eMajor:
|
||||
//E Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G#");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D#");
|
||||
break;
|
||||
case PossibleScales.bMajor:
|
||||
//B Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G#");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D#");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A#");
|
||||
break;
|
||||
case PossibleScales.fSMajor:
|
||||
//F# Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G#");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D#");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A#");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E#");
|
||||
break;
|
||||
case PossibleScales.cSMajor:
|
||||
//C# Major
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F#");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C#");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G#");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D#");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A#");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E#");
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B#");
|
||||
break;
|
||||
case PossibleScales.fMajor:
|
||||
//F Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
break;
|
||||
case PossibleScales.bbMajor:
|
||||
//Bb Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
break;
|
||||
case PossibleScales.ebMajor:
|
||||
//Eb Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A♭");
|
||||
break;
|
||||
case PossibleScales.abMajor:
|
||||
//Ab Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A♭");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D♭");
|
||||
break;
|
||||
case PossibleScales.dbMajor:
|
||||
//Db Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A♭");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D♭");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G♭");
|
||||
break;
|
||||
case PossibleScales.gbMajor:
|
||||
//Gb Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A♭");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D♭");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G♭");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C♭");
|
||||
break;
|
||||
case PossibleScales.cbMajor:
|
||||
//Cb Major
|
||||
if (pitch.contains("B")) return pitch.replaceAll("B", "B♭");
|
||||
if (pitch.contains("E")) return pitch.replaceAll("E", "E♭");
|
||||
if (pitch.contains("A")) return pitch.replaceAll("A", "A♭");
|
||||
if (pitch.contains("D")) return pitch.replaceAll("D", "D♭");
|
||||
if (pitch.contains("G")) return pitch.replaceAll("G", "G♭");
|
||||
if (pitch.contains("C")) return pitch.replaceAll("C", "C♭");
|
||||
if (pitch.contains("F")) return pitch.replaceAll("F", "F♭");
|
||||
break;
|
||||
}
|
||||
return pitch;
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import '../models/scale.dart';
|
||||
import 'assets.dart';
|
||||
|
||||
String getScaleAsset(String scale, {bool? trebleClef}) {
|
||||
final PossibleScales? _scale = ScaleInfo.parse(scale).scale;
|
||||
if (trebleClef != null && trebleClef) {
|
||||
switch (_scale) {
|
||||
case PossibleScales.cMajor:
|
||||
return cmajor_treble_asset;
|
||||
case PossibleScales.gMajor:
|
||||
return gmajor_treble_asset;
|
||||
case PossibleScales.dMajor:
|
||||
return dmajor_treble_asset;
|
||||
case PossibleScales.aMajor:
|
||||
return amajor_treble_asset;
|
||||
case PossibleScales.eMajor:
|
||||
return emajor_treble_asset;
|
||||
case PossibleScales.bMajor:
|
||||
return bmajor_treble_asset;
|
||||
case PossibleScales.fSMajor:
|
||||
return fsmajor_treble_asset;
|
||||
case PossibleScales.cSMajor:
|
||||
return csmajor_treble_asset;
|
||||
case PossibleScales.fMajor:
|
||||
return fmajor_treble_asset;
|
||||
case PossibleScales.bbMajor:
|
||||
return bbmajor_treble_asset;
|
||||
case PossibleScales.ebMajor:
|
||||
return ebmajor_treble_asset;
|
||||
case PossibleScales.abMajor:
|
||||
return abmajor_treble_asset;
|
||||
case PossibleScales.dbMajor:
|
||||
return dbmajor_treble_asset;
|
||||
case PossibleScales.gbMajor:
|
||||
return gbmajor_treble_asset;
|
||||
case PossibleScales.cbMajor:
|
||||
return cbmajor_treble_asset;
|
||||
}
|
||||
}
|
||||
switch (_scale) {
|
||||
case PossibleScales.cMajor:
|
||||
return cmajor_bass_asset;
|
||||
case PossibleScales.gMajor:
|
||||
return gmajor_bass_asset;
|
||||
case PossibleScales.dMajor:
|
||||
return dmajor_bass_asset;
|
||||
case PossibleScales.aMajor:
|
||||
return amajor_bass_asset;
|
||||
case PossibleScales.eMajor:
|
||||
return emajor_bass_asset;
|
||||
case PossibleScales.bMajor:
|
||||
return bmajor_bass_asset;
|
||||
case PossibleScales.fSMajor:
|
||||
return fsmajor_bass_asset;
|
||||
case PossibleScales.cSMajor:
|
||||
return csmajor_bass_asset;
|
||||
case PossibleScales.fMajor:
|
||||
return fmajor_bass_asset;
|
||||
case PossibleScales.bbMajor:
|
||||
return bbmajor_bass_asset;
|
||||
case PossibleScales.ebMajor:
|
||||
return ebmajor_bass_asset;
|
||||
case PossibleScales.abMajor:
|
||||
return abmajor_bass_asset;
|
||||
case PossibleScales.dbMajor:
|
||||
return dbmajor_bass_asset;
|
||||
case PossibleScales.gbMajor:
|
||||
return gbmajor_bass_asset;
|
||||
case PossibleScales.cbMajor:
|
||||
return cbmajor_bass_asset;
|
||||
}
|
||||
// Default: C Major
|
||||
return cmajor_bass_asset;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
const List<String> scalesMajor = <String>[
|
||||
"Cb Major",
|
||||
"Gb Major",
|
||||
"Db Major",
|
||||
"Ab Major",
|
||||
"Eb Major",
|
||||
"Bb Major",
|
||||
"F Major",
|
||||
"C Major",
|
||||
"G Major",
|
||||
"D Major",
|
||||
"A Major",
|
||||
"E Major",
|
||||
"B Major",
|
||||
"F# Major",
|
||||
"C# Major",
|
||||
];
|
||||
|
||||
const List<String> scalesMinor = <String>[
|
||||
"Ab Minor",
|
||||
"Eb Minor",
|
||||
"Bb Minor",
|
||||
"F Minor",
|
||||
"C Minor",
|
||||
"G Minor",
|
||||
"D Minor",
|
||||
"A Minor",
|
||||
"E Minor",
|
||||
"B Minor",
|
||||
"F# Minor",
|
||||
"C# Minor",
|
||||
"G# Minor",
|
||||
"D# Minor",
|
||||
"A# Minor",
|
||||
];
|
||||
Reference in New Issue
Block a user