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); } }
//找到调所有的音 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)); } }