Example #1
0
        public Scale(string m, int f)
        {
            scaleNotes = new List <string>();
            mode       = m;
            fifth      = f;

            //通过五度关系定出主音位置
            //纯五度有7个半音
            var numOfSemitone = 7;

            //通过音程关系定出所有音
            baseNoteName = "C4";
            baseNoteName = NoteHelper.GetNote(baseNoteName, numOfSemitone * fifth);

            //如果超出了C0-B8范围
            if (baseNoteName.Last() == '8')
            {
                baseNoteName = baseNoteName.Replace('8', '4');
            }

            //小调的话把根音调成大调下方小三度
            if (mode == "minor")
            {
                baseNoteName = new Note(NoteHelper.GetNote(baseNoteName, -3)).pitch;
            }

            scaleNotes.Add(baseNoteName.Substring(0, baseNoteName.Length - 1));

            AddKeys(baseNoteName, mode);

            var baseNote   = new Note(scaleNotes[0] + "4");
            var secondNote = new Note(scaleNotes[1] + "4");
            var thirdNote  = new Note(scaleNotes[2] + "4");
            var fourthNote = new Note(scaleNotes[3] + "4");
            var fifthNote  = new Note(scaleNotes[4] + "4");
            var sixthNote  = new Note(scaleNotes[5] + "4");

            //建立和弦
            if (mode == "major")
            {
                main        = ChordHelper.BuildThree(baseNote, ChordThreeCategory.major);
                second      = ChordHelper.BuildThree(secondNote, ChordThreeCategory.minor);
                third       = ChordHelper.BuildThree(thirdNote, ChordThreeCategory.minor);
                subDominant = ChordHelper.BuildThree(fourthNote, ChordThreeCategory.major);
                dominant    = ChordHelper.BuildThree(fifthNote, ChordThreeCategory.major);
                sixth       = ChordHelper.BuildThree(sixthNote, ChordThreeCategory.minor);
            }
            else
            {
                main        = ChordHelper.BuildThree(baseNote, ChordThreeCategory.minor);
                second      = ChordHelper.BuildThree(secondNote, ChordThreeCategory.diminished);
                third       = ChordHelper.BuildThree(thirdNote, ChordThreeCategory.major);
                subDominant = ChordHelper.BuildThree(fourthNote, ChordThreeCategory.minor);
                dominant    = ChordHelper.BuildThree(fifthNote, ChordThreeCategory.major);
                sixth       = ChordHelper.BuildThree(sixthNote, ChordThreeCategory.major);
            }
        }
Example #2
0
        //找到调所有的音
        private void AddKeys(string baseNoteName, string mode)
        {
            if (mode == "major" || mode == string.Empty || mode == "none")
            {
                //大调:全全半全全全半
                var nextNoteName = baseNoteName;
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 1);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));

                //关系小调
                var extraNote = NoteHelper.GetNote(nextNoteName, -3);
                scaleNotes.Add(extraNote.Substring(0, extraNote.Length - 1));
            }
            else if (mode == "minor")
            {
                //小调:全半全全半3半
                var nextNoteName = baseNoteName;
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 1);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 2);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 1);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));
                nextNoteName = NoteHelper.GetNote(nextNoteName, 3);
                scaleNotes.Add(nextNoteName.Substring(0, nextNoteName.Length - 1));

                //关系大调
                var extraNote = NoteHelper.GetNote(nextNoteName, -1);
                scaleNotes.Add(extraNote.Substring(0, extraNote.Length - 1));
            }
        }