瀏覽代碼

feat: #10290bugxiu修复

TIANYONG 1 年之前
父節點
當前提交
f60c03aa5c
共有 3 個文件被更改,包括 19 次插入4 次删除
  1. 15 2
      src/helpers/formateMusic.ts
  2. 2 0
      src/state.ts
  3. 2 2
      vite.config.ts

+ 15 - 2
src/helpers/formateMusic.ts

@@ -675,7 +675,7 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
 			const wordList = Array.from(measure.getElementsByTagName("words")) || [];
 			const wordList = Array.from(measure.getElementsByTagName("words")) || [];
 			wordList.forEach((word: any) => {
 			wordList.forEach((word: any) => {
 				// TODO:删除妙极客曲子无意义的words
 				// TODO:删除妙极客曲子无意义的words
-				if (word?.textContent && word?.parentNode?.parentNode) {
+				if (word?.textContent && !word?.textContent?.includes('D') && word?.parentNode?.parentNode) {
 					measure.removeChild(word.parentNode.parentNode);
 					measure.removeChild(word.parentNode.parentNode);
 				}
 				}
 				// if(hideSpeedWords.includes(word?.textContent) && word?.parentNode?.parentNode) {
 				// if(hideSpeedWords.includes(word?.textContent) && word?.parentNode?.parentNode) {
@@ -863,7 +863,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	}
 	}
 	// 是否是变速的曲子
 	// 是否是变速的曲子
 	const hasVaryingSpeed = _notes.some((item: any) => item.measuresTempoInBPM !== _notes[0].measuresTempoInBPM)
 	const hasVaryingSpeed = _notes.some((item: any) => item.measuresTempoInBPM !== _notes[0].measuresTempoInBPM)
-	// console.log('变速曲子',hasVaryingSpeed, _notes)
+	console.log('变速曲子',hasVaryingSpeed, _notes)
 	let noteIds: any = [];
 	let noteIds: any = [];
 	// let voicesBBox: any = null;
 	// let voicesBBox: any = null;
 	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
 	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
@@ -1112,6 +1112,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				const idx = noteIds.filter((item: any) => item === svgElement?.attrs.id)?.length || 0
 				const idx = noteIds.filter((item: any) => item === svgElement?.attrs.id)?.length || 0
 				evNoteStartTime = note?.noteTimeInfo[idx]?.begin
 				evNoteStartTime = note?.noteTimeInfo[idx]?.begin
 				evNoteEndTime = note?.noteTimeInfo[idx]?.end
 				evNoteEndTime = note?.noteTimeInfo[idx]?.end
+				relativeTime = evNoteStartTime - fixtime
+				// usetime = evNoteStartTime - fixtime
 			}
 			}
 			svgElement?.attrs.id && noteIds.push(svgElement?.attrs.id)
 			svgElement?.attrs.id && noteIds.push(svgElement?.attrs.id)
 			const nodeDetail = {
 			const nodeDetail = {
@@ -1161,6 +1163,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				measureSpeed,  // 小节速度
 				measureSpeed,  // 小节速度
 				maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
 				maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
 			};
 			};
+			// 如果是妙极客的曲子,并且第二遍循环播放需要等待时间,并且是第二遍循环的第一个小节的第一个音符
+			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;
+			}
 			nodeDetail.realKey = formatRealKey(note.halfTone - fixedKey * 12, nodeDetail);
 			nodeDetail.realKey = formatRealKey(note.halfTone - fixedKey * 12, nodeDetail);
 			nodeDetail.duration = nodeDetail.endtime - nodeDetail.time;
 			nodeDetail.duration = nodeDetail.endtime - nodeDetail.time;
 			let tickables = activeVerticalMeasureList[0]?.vfVoices["1"]?.tickables || [];
 			let tickables = activeVerticalMeasureList[0]?.vfVoices["1"]?.tickables || [];
@@ -1192,6 +1201,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	}
 	}
 	// 按照时间轴排序
 	// 按照时间轴排序
 	const sortArray = allNotes.sort((a, b) => a.relativeTime - b.relativeTime).map((item, index) => ({ ...item, i: index }));
 	const sortArray = allNotes.sort((a, b) => a.relativeTime - b.relativeTime).map((item, index) => ({ ...item, i: index }));
+	// const sortArray = allNotes.sort((a, b) => a.time - b.time).map((item, index) => ({ ...item, i: index }));
 	console.timeEnd("音符跑完时间");
 	console.timeEnd("音符跑完时间");
 	try {
 	try {
 		osmd.cursor.reset();
 		osmd.cursor.reset();
@@ -1325,11 +1335,14 @@ const analyzeEvxml = (xmlParse: any, xmlUrl?: string) => {
 	// xml拍号数
 	// xml拍号数
 	const xmlNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('num');
 	const xmlNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('num');
 	const denNum = xmlParse.getElementsByTagName("timegap")[0]?.getElementsByTagName("values")[0]?.getElementsByTagName("item")[0]?.getAttribute('den');
 	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 firstMeasure = xmlParse.getElementsByTagName("measure")[0];
 	const firstMeasure = xmlParse.getElementsByTagName("measure")[0];
 	if (firstMeasure) {
 	if (firstMeasure) {
 		const firstNoteBeginTime = firstMeasure.getElementsByTagName("times")[0]?.getElementsByTagName("time")[0]?.getAttribute('begin');
 		const firstNoteBeginTime = firstMeasure.getElementsByTagName("times")[0]?.getElementsByTagName("time")[0]?.getAttribute('begin');
 		state.evXmlBeginTime = firstNoteBeginTime ? firstNoteBeginTime / 1000 : xmlNum ? 60 / state.originSpeed * xmlNum * 4/denNum : 0;
 		state.evXmlBeginTime = firstNoteBeginTime ? firstNoteBeginTime / 1000 : xmlNum ? 60 / state.originSpeed * xmlNum * 4/denNum : 0;
+		state.secondEvXmlBeginTime = firstNoteBeginTime ? 0 : xmlNum2 ? 60 / state.originSpeed * xmlNum2 * 4/denNum2 : 0;
 		const hasTimeGap = xmlParse.getElementsByTagName("timegap").length > 0;
 		const hasTimeGap = xmlParse.getElementsByTagName("timegap").length > 0;
 		const hasTimes = xmlParse.getElementsByTagName("times").length > 0;
 		const hasTimes = xmlParse.getElementsByTagName("times").length > 0;
 		console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes)
 		console.log('🚀 ~ evxml解析','有timegap:',hasTimeGap,'有times:',hasTimes)

+ 2 - 0
src/state.ts

@@ -378,6 +378,8 @@ const state = reactive({
   fixtime: 0,
   fixtime: 0,
   /** evxml等待播放的时间 */
   /** evxml等待播放的时间 */
   evXmlBeginTime: 0,
   evXmlBeginTime: 0,
+  /** 第二遍循环evxml等待播放的时间 */
+  secondEvXmlBeginTime: 0,
   /** 指法信息 */
   /** 指法信息 */
   fingeringInfo: {} as IFingering,
   fingeringInfo: {} as IFingering,
   /** 滚动容器的ID */
   /** 滚动容器的ID */

+ 2 - 2
vite.config.ts

@@ -76,9 +76,9 @@ export default defineConfig({
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
         // target: "https://test.lexiaoya.cn",
         // target: "https://test.lexiaoya.cn",
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
-        // target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
+        target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
         // target: "https://dev.resource.colexiu.com",
         // target: "https://dev.resource.colexiu.com",
-        target: "https://test.kt.colexiu.com",
+        // target: "https://test.kt.colexiu.com",
         // target: "https://mec.colexiu.com",
         // target: "https://mec.colexiu.com",
         changeOrigin: true,
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),
         rewrite: (path) => path.replace(/^\/instrument/, ""),