Browse Source

feat: 和弦支持测评功能

TIANYONG 3 months ago
parent
commit
47182dc6bd
2 changed files with 17 additions and 2 deletions
  1. 12 1
      src/helpers/formateMusic.ts
  2. 5 1
      src/page-instrument/evaluat-model/index.tsx

+ 12 - 1
src/helpers/formateMusic.ts

@@ -1418,7 +1418,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				xmlMp3BeatFixTime,  //xml上节拍器的时间
 				notBeatFixtime: state.isOpenMetronome ? fixtime - xmlMp3BeatFixTime : fixtime, // 不含节拍器的fixtime值 唱名用
 				notBeatTime: state.isEvxml && evNoteStartTime ? retain(evNoteStartTime) : retain(relativeTime + (state.isOpenMetronome ? fixtime - xmlMp3BeatFixTime : fixtime)), // 不含节拍器的 音符开始时间
-				notBeatEndTime: state.isEvxml && evNoteEndTime ? retain(evNoteEndTime) : retain(relaEndtime + (state.isOpenMetronome ? fixtime - xmlMp3BeatFixTime : fixtime)) // 不含节拍器的 音符结束时间
+				notBeatEndTime: state.isEvxml && evNoteEndTime ? retain(evNoteEndTime) : retain(relaEndtime + (state.isOpenMetronome ? fixtime - xmlMp3BeatFixTime : fixtime)), // 不含节拍器的 音符结束时间
+				frequencyList: [note?.pitch?.frequency || -1], // 如果是和弦音符,需要添加多个音符的频率,用于评测
 			};
 			// console.log(i,'当前的小节',nodeDetail.MeasureNumberXML,totalMultipleRestMeasures,multipleRestMeasures)
 			// 如果是妙极客的曲子,并且第二遍循环播放需要等待时间,并且是第二遍循环的第一个小节的第一个音符
@@ -1429,6 +1430,16 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// 	relativeTime = relativeTime + state.secondEvXmlBeginTime;
 			// }
 			// if (state.isEvxml && nodeDetail.repeatIdx && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
+
+			// 如果是和弦音符,需要添加多个音符的频率,用于评测
+			if (note.voiceEntry.notes.length > 1) {
+				note.voiceEntry.notes.forEach((cnote: any) => {
+					if (cnote?.IsChordNote && cnote?.pitch?.frequency) {
+						nodeDetail.frequencyList.push(cnote.pitch.frequency)
+					}
+				})
+			}
+
 			const firstRepeatNodeId = allNotes.find((item: any) => item.MeasureNumberXML === state.timegapRepeatMeasureIndex)?.noteId || 0;
 			if (state.isEvxml && nodeDetail.repeatIdx && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === state.timegapRepeatMeasureIndex && nodeDetail.noteId === firstRepeatNodeId) {
 				const currentWaitTime = state.evXmlBeginArr[nodeDetail.repeatIdx] || 0;

+ 5 - 1
src/page-instrument/evaluat-model/index.tsx

@@ -262,7 +262,7 @@ export default defineComponent({
         // 音符是否不需要评测
         let noteNeedEvaluat = item.hasGraceNote || ListenMode || dontEvaluatingMode || !!item?.voiceEntry?.ornamentContainer || !!item.noteElement?.speedInfo?.startWord?.includes('rit.') || item.skipMode
         noteNeedEvaluat = noteNeedEvaluat == true ? true : false;
-        const data = {
+        const data: any = {
           timeStamp: (start * 1000) / rate,
           duration: ((end * 1000) / rate - (start * 1000) / rate) * noteRate,
           frequency: item.frequency,
@@ -279,6 +279,10 @@ export default defineComponent({
           isTenutoSound,
           isStaccato: item?.voiceEntry?.isStaccato ? true : false, // 是否是重音
         };
+        // 如果是和弦音符,需要添加多个音符的频率,用于评测
+        if (item.frequencyList?.length > 1) {
+          data.frequencyList = item.frequencyList
+        }
         datas.push(data);
       }
       return {