TIANYONG 1 rok temu
rodzic
commit
648a93efbe
2 zmienionych plików z 34 dodań i 8 usunięć
  1. 32 8
      src/helpers/formateMusic.ts
  2. 2 0
      src/state.ts

+ 32 - 8
src/helpers/formateMusic.ts

@@ -782,6 +782,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	let isSetNextNoteReal = false;
 	let differFrom = 0;
 	// let testIdx = 0;
+	let repeatIdx = 0; // 循环的次数
 	while (!iterator.EndReached) {
 		// console.log({ ...iterator });
 		const voiceEntries = iterator.CurrentVoiceEntries?.[0] ? [iterator.CurrentVoiceEntries?.[0]] : [];
@@ -865,7 +866,12 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 		}
 
 		iterator.moveToNextVisibleVoiceEntry(false);
-		// console.log('小节',testIdx,iterator.EndReached,iterator.currentMeasureIndex)
+		// 从头开始循环,repeatIdx标记+1
+		if (iterator.backJumpOccurred) {
+			repeatIdx += 1;
+		}
+		iterator.repeatIdx = repeatIdx;
+		// console.log('小节',testIdx,iterator.repeatIdx,iterator.EndReached,iterator.currentMeasureIndex,iterator.backJumpOccurred,iterator.forwardJumpOccurred)
 		// testIdx += 1;
 	}
 	// 是否是变速的曲子
@@ -1171,14 +1177,22 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				totalMultipleRestMeasures, // 当前小节总的合并小节数
 				measureSpeed,  // 小节速度
 				maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
+				repeatIdx: iterator.repeatIdx, // 标记是第几遍循环,从0开始
 			};
 			// 如果是妙极客的曲子,并且第二遍循环播放需要等待时间,并且是第二遍循环的第一个小节的第一个音符
-			if (state.isEvxml && state.secondEvXmlBeginTime && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
-				nodeDetail.time = nodeDetail.time + state.secondEvXmlBeginTime;
-				nodeDetail.endtime = nodeDetail.endtime + state.secondEvXmlBeginTime;
-				usetime = usetime + state.secondEvXmlBeginTime;
-				relativeTime = relativeTime + state.secondEvXmlBeginTime;
-			}
+			// if (state.isEvxml && state.secondEvXmlBeginTime && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
+			// 	nodeDetail.time = nodeDetail.time + state.secondEvXmlBeginTime;
+			// 	nodeDetail.endtime = nodeDetail.endtime + state.secondEvXmlBeginTime;
+			// 	usetime = usetime + state.secondEvXmlBeginTime;
+			// 	relativeTime = relativeTime + state.secondEvXmlBeginTime;
+			// }
+			if (state.isEvxml && nodeDetail.repeatIdx && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
+				const currentWaitTime = state.evXmlBeginArr[nodeDetail.repeatIdx] || 0;
+				nodeDetail.time = nodeDetail.time + currentWaitTime;
+				nodeDetail.endtime = nodeDetail.endtime + currentWaitTime;
+				usetime = usetime + currentWaitTime;
+				relativeTime = relativeTime + currentWaitTime;
+			}			
 			nodeDetail.realKey = formatRealKey(note.halfTone - fixedKey * 12, nodeDetail);
 			nodeDetail.duration = nodeDetail.endtime - nodeDetail.time;
 			let tickables = activeVerticalMeasureList[0]?.vfVoices["1"]?.tickables || [];
@@ -1377,6 +1391,7 @@ const analyzeEvxml = (xmlParse: any, xmlUrl?: string) => {
 	const denNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('den');
 	const xmlNum2 = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[1]?.getAttribute('num');
 	const denNum2 = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[1]?.getAttribute('den');
+	const timeGaps: any = Array.from(xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item"));
 	// 第一个音符的起始时间
 	const firstMeasure = xmlParse.getElementsByTagName("measure")[0];
 	if (firstMeasure) {
@@ -1385,7 +1400,16 @@ const analyzeEvxml = (xmlParse: any, xmlUrl?: string) => {
 		state.secondEvXmlBeginTime = firstNoteBeginTime ? 0 : xmlNum2 ? 60 / state.originSpeed * xmlNum2 * 4/denNum2 : 0;
 		const hasTimeGap = xmlParse.getElementsByTagName("timegap").length > 0;
 		const hasTimes = xmlParse.getElementsByTagName("times").length > 0;
-		console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes)
+
+		if (timeGaps && timeGaps.length && !firstNoteBeginTime) {
+			for (const timeGap of timeGaps) {
+				const num: any = timeGap?.getAttribute('num'), den: any = timeGap?.getAttribute('den');
+				const startTime = num ? 60 / state.originSpeed * num * 4/den : 0;
+				state.evXmlBeginArr.push(startTime)
+			}
+		}
+
+		console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes,'timegap集合',state.evXmlBeginArr,'第一个timegap',state.evXmlBeginTime)
 	}
 
 	// if (!hasTimeGap && !hasTimes) {

+ 2 - 0
src/state.ts

@@ -380,6 +380,8 @@ const state = reactive({
   evXmlBeginTime: 0,
   /** 第二遍循环evxml等待播放的时间 */
   secondEvXmlBeginTime: 0,
+  /** evxml等待播放的时间集合,多遍反复播放,会有多个timegap(前奏)时间 */
+  evXmlBeginArr: [] as any,
   /** 指法信息 */
   fingeringInfo: {} as IFingering,
   /** 滚动容器的ID */