예제 #1
0
        public void test_chord()
        {
            //建立一个c1上的大三和弦(c1e1g1)
            var c             = ChordHelper.BuildThree(new Note("C1"), ChordThreeCategory.major);
            var chordNoteList = c.notes.Select(n => n.pitch).ToList();

            Assert.AreEqual("E1", chordNoteList[1]);
            Assert.AreEqual("G1", chordNoteList[2]);

            var inputFile = @"D:\新西兰学习生活\大学上课\乐谱数据\古典\【古典】莫扎特C大调奏鸣曲K.545第一乐章.musicxml";
            var song      = new Song(inputFile, "");

            song.Parse();

            //第一小节第1拍
            var songNotes = song.songNotes.Where(s => s.position < 1).SelectMany(s => s.notes);
            var notes     = songNotes.Where(s => s.measureNumber == 1);

            var degreeOfCon = ChordHelper.DegreeOfConsonance(notes.ToList(), c);

            Assert.AreEqual(1, degreeOfCon);

            //第一小节第2拍
            songNotes = song.songNotes.Where(s => s.position >= 1 && s.position < 2).SelectMany(s => s.notes);
            notes     = songNotes.Where(s => s.measureNumber == 1);

            degreeOfCon = ChordHelper.DegreeOfConsonance(notes.ToList(), c);
            Assert.AreEqual(1, degreeOfCon);

            //第2小节第1拍
            songNotes = song.songNotes.Where(s => s.position < 1).SelectMany(s => s.notes);
            notes     = songNotes.Where(s => s.measureNumber == 2);

            degreeOfCon = ChordHelper.DegreeOfConsonance(notes.ToList(), c);
            Assert.AreNotEqual(1, degreeOfCon);

            //第2小节第2拍
            songNotes = song.songNotes.Where(s => s.position >= 1 && s.position < 2).SelectMany(s => s.notes);
            notes     = songNotes.Where(s => s.measureNumber == 2);

            degreeOfCon = ChordHelper.DegreeOfConsonance(notes.ToList(), c);
            Assert.AreNotEqual(1, degreeOfCon);

            //遍历
            var    ret  = ChordHelper.ChordAnalysis(1, song.numOfMeasures, song.songNotes, song.scaleList, song.division, song.numOfMeasures);
            double non1 = (double)ret.Where(r => r.Contains("none")).Count() / (double)ret.Count;

            inputFile = @"D:\新西兰学习生活\大学上课\乐谱数据\现代\【现代】普罗科菲耶夫罗密欧与朱丽叶阳台场景.musicxml";
            var song2 = new Song(inputFile, "");

            song2.Parse();
            var    ret2 = ChordHelper.ChordAnalysis(1, song2.numOfMeasures, song2.songNotes, song2.scaleList, song2.division, song2.numOfMeasures);
            double non2 = (double)ret2.Where(r => r.Contains("none")).Count() / (double)ret2.Count;

            Assert.AreEqual(true, non1 < non2);
        }