public static string GetCombinedName(this DiatonicMode mode) { var name = mode.GetName(); var alternativeName = mode.GetAlternativeName(); return(name != alternativeName ? $"{name} ({alternativeName})" : name); }
public static void GetNotes(Note[] notes, Note keyNote, DiatonicMode diatonicMode) { if (notes == null) { throw new ArgumentNullException(nameof(notes)); } if (notes.Length != NumberOfDegrees + 1) { throw new ArgumentException(null, nameof(notes)); } if (diatonicMode < DiatonicMode.Ionian || diatonicMode > DiatonicMode.Locrian) { throw new ArgumentOutOfRangeException(nameof(diatonicMode)); } var pitch = new Pitch(keyNote, 4); int intervalIndex = diatonicMode - DiatonicMode.Ionian; for (int degree = 0; degree <= NumberOfDegrees; degree++) { notes[degree] = pitch.Note; pitch += s_majorScaleIntervals[intervalIndex]; intervalIndex++; if (intervalIndex >= NumberOfDegrees) { intervalIndex -= NumberOfDegrees; } } }
public DiatonicScale(Note keyNote, DiatonicMode diatonicMode) { if (diatonicMode < DiatonicMode.Ionian || diatonicMode > DiatonicMode.Locrian) { throw new ArgumentOutOfRangeException(nameof(diatonicMode)); } KeyNote = keyNote; DiatonicMode = diatonicMode; }
public static string GetAlternativeName(this DiatonicMode mode) { switch (mode) { case DiatonicMode.Major: return("Major"); case DiatonicMode.Minor: return("Minor"); default: return(mode.GetName()); } }
private static bool EvaluateModeAnswer(DiatonicMode mode, Guitar guitar, int stringNumber, int position, int[][] fretNumbers, string answer) { var pitch = guitar.GetPitch(stringNumber, position + fretNumbers[0][0]); var combinations = from keyNote in new[] { pitch.Note, pitch.Note.Invert() }.Distinct() from modeName in new[] { mode.GetName(), mode.GetAlternativeName() }.Distinct() select $"{keyNote.ToString().ToLowerInvariant()} {modeName.ToLowerInvariant()}"; return(combinations.Contains(answer)); }
private static void PrintDiatonicScales(DiatonicMode diatonicMode) { var notes = CreateScaleArray(); GetNotes(notes, Note.GFlat, Major); var keyNote = notes[diatonicMode - Ionian]; var title = $"Circle of {diatonicMode.GetName()} scales"; Console.WriteLine(title); Console.WriteLine(new string('-', title.Length)); Console.WriteLine(); var sb = new StringBuilder(); for (var i = -SemitonesPerOctave / 2; i <= SemitonesPerOctave / 2; i++) { GetNotes(notes, keyNote, diatonicMode); sb.Clear(); if (i < 0) { sb.AppendFormat("[{0}b] ", -i); } else if (i > 0) { sb.AppendFormat("[{0}#] ", i); } else { sb.Append(' ', 5); } string note = notes[0].ToString(); sb.Append(note); for (var j = 1; j < notes.Length; j++) { sb.Append(',').Append(' ', 3 - note.Length); note = notes[j].ToString(); sb.Append(note); } Console.WriteLine(sb.ToString()); keyNote = (new Pitch(keyNote, 4) + PerfectFifth).Note; } }
public static string GetName(this DiatonicMode mode) { switch (mode) { case DiatonicMode.Ionian: return("Ionian"); case DiatonicMode.Dorian: return("Dorian"); case DiatonicMode.Phrygian: return("Phrygian"); case DiatonicMode.Lydian: return("Lydian"); case DiatonicMode.Mixolydian: return("Mixolydian"); case DiatonicMode.Aeolian: return("Aeolian"); case DiatonicMode.Locrian: return("Locrian"); default: throw new ArgumentOutOfRangeException(nameof(mode)); } }
private static bool EvaluateDegreeAnswer(DiatonicMode degree, string answer) { switch (degree) { case Ionian: return(answer == "d" || answer == "do"); case Dorian: return(answer == "r" || answer == "re"); case Phrygian: return(answer == "m" || answer == "mi"); case Lydian: return(answer == "f" || answer == "fa"); case Mixolydian: return(answer == "s" || answer == "sol"); case Aeolian: return(answer == "l" || answer == "la"); case Locrian: return(answer == "t" || answer == "ti"); default: throw new InvalidOperationException(); } }
public static string GetName(this DiatonicMode mode) { FieldInfo field = typeof(DiatonicMode).GetField(mode.ToString()); return(field.GetCustomAttribute <DescriptionAttribute>().Description); }
private static void Practice() { s_practiceStats = new PracticeStats(); Console.CancelKeyPress += (s, e) => PrintPracticeStats(); var guitar = new Guitar(); var random = new Random(); for (; ;) { var mode = (DiatonicMode)random.Next(DiatonicScale.NumberOfDegrees); var scale = new DiatonicScale(Note.C, mode); var pattern = (Pattern)random.Next(numberOfPatterns); int[][] fretNumbers = CreateFretNumbers(pattern); int stringNumber = random.Next(guitar.NumberOfStrings - fretNumbers.Length + 1); int maxFretNumber = FillFretNumbers(fretNumbers, guitar, stringNumber, scale); int questionStringIndex; int questionFretIndex; if (random.Next(10) != 0) { questionStringIndex = random.Next(fretNumbers.Length); questionFretIndex = random.Next(fretNumbers[questionStringIndex].Length); } else { questionStringIndex = questionFretIndex = -1; } int position = random.Next(guitar.NumberOfFrets - maxFretNumber + 1); PrintExcercise(guitar, stringNumber, fretNumbers, maxFretNumber, questionStringIndex, questionFretIndex, position); Console.WriteLine(); Console.Write(questionStringIndex >= 0 ? "Enter scale degree: " : "Enter scale name: "); Console.WriteLine($"({s_practiceStats.Stopwatch.Elapsed:hh':'mm':'ss})"); for (; ;) { var answer = Console.ReadLine()?.ToLowerInvariant(); if (answer == null || answer == "q" || answer == "quit") { PrintPracticeStats(); return; } bool isCorrectAnswer; if (questionStringIndex >= 0) { DiatonicMode degree = mode; for (var i = 0; i < fretNumbers.Length; i++) { for (var j = 0; j < fretNumbers[i].Length; j++) { if (i < questionStringIndex || j < questionFretIndex) { degree++; if (degree - Ionian >= DiatonicScale.NumberOfDegrees) { degree -= DiatonicScale.NumberOfDegrees; } } else { goto EndOfLoop; } } } EndOfLoop: isCorrectAnswer = EvaluateDegreeAnswer(degree, answer); } else { isCorrectAnswer = EvaluateModeAnswer(mode, guitar, stringNumber, position, fretNumbers, answer); } if (isCorrectAnswer) { s_practiceStats.NumberOfCorrectAnswers++; Console.WriteLine("Correct!"); break; } else { s_practiceStats.NumberOfWrongAnswers++; Console.WriteLine("Wrong!"); } } Console.WriteLine(); } }