示例#1
0
        public static string GetCombinedName(this DiatonicMode mode)
        {
            var name            = mode.GetName();
            var alternativeName = mode.GetAlternativeName();

            return(name != alternativeName ? $"{name} ({alternativeName})" : name);
        }
示例#2
0
        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;
                }
            }
        }
示例#3
0
        public DiatonicScale(Note keyNote, DiatonicMode diatonicMode)
        {
            if (diatonicMode < DiatonicMode.Ionian || diatonicMode > DiatonicMode.Locrian)
            {
                throw new ArgumentOutOfRangeException(nameof(diatonicMode));
            }

            KeyNote      = keyNote;
            DiatonicMode = diatonicMode;
        }
示例#4
0
        public static string GetAlternativeName(this DiatonicMode mode)
        {
            switch (mode)
            {
            case DiatonicMode.Major: return("Major");

            case DiatonicMode.Minor: return("Minor");

            default: return(mode.GetName());
            }
        }
示例#5
0
        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));
        }
示例#6
0
        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;
            }
        }
示例#7
0
        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));
            }
        }
示例#8
0
        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();
            }
        }
示例#9
0
        public static string GetName(this DiatonicMode mode)
        {
            FieldInfo field = typeof(DiatonicMode).GetField(mode.ToString());

            return(field.GetCustomAttribute <DescriptionAttribute>().Description);
        }
示例#10
0
        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();
            }
        }