浏览代码

解决 有些曲目 返回的时值 顺序不对,导致唱名 顺序出错的问题

黄琪勇 10 月之前
父节点
当前提交
8f48dab14a
共有 1 个文件被更改,包括 13 次插入7 次删除
  1. 13 7
      src/helpers/formateMusic.ts

+ 13 - 7
src/helpers/formateMusic.ts

@@ -826,7 +826,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	let multipleRestMeasures = 0;
 	let staveNoteIndex = 0;
 	let staveIndex = 0;
-	let xmlNoteTime = 0  // xml上面的音符时间
 	let xmlMp3BeatFixTime = 0 // xml上节拍器的时间
 
 	let preNoteEndTime = 0; // 上一个音符的结束时间
@@ -1264,9 +1263,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				const allowRange = Math.abs(_notes[idx+1]?.note?.noteTimeInfo?.[0]?.begin - _notes[idx-1]?.note?.noteTimeInfo?.[0]?.end) < 10;
 				if (allowRange) {
 					note.maxNoteNum = note.maxNoteNum - 1;
-					// 唱名时间补齐,唱名上一个音符的结束时候,也需要补上这个时间
-					allNotes[allNotes.length-1].xmlNoteEndTime = retain(xmlNoteTime + noteLength)
-					xmlNoteTime += noteLength
+					// 唱名时间补齐,当删除这个音符的时候,上个音符的持续时间要加上这个音符的时间
+					allNotes[allNotes.length - 1].noteLengthTime += noteLength
 					continue;
 				}
 			}
@@ -1348,14 +1346,14 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
 				// repeatIdx: iterator.repeatIdx || 0, // 标记是第几遍循环,从0开始
 				repeatIdx: filterRepeatIdx,
-				xmlNoteTime: retain(xmlNoteTime), // xml上音符开始时间 唱名用
-				xmlNoteEndTime: retain(xmlNoteTime + noteLength), //xml上音符结束时间 唱名用
+				noteLengthTime: noteLength, //当前音符时长
+				xmlNoteTime: 0, // xml上音符开始时间 唱名用
+				xmlNoteEndTime: 0, //xml上音符结束时间 唱名用
 				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)) // 不含节拍器的 音符结束时间
 			};
-			xmlNoteTime += noteLength
 			// 如果是妙极客的曲子,并且第二遍循环播放需要等待时间,并且是第二遍循环的第一个小节的第一个音符
 			// if (state.isEvxml && state.secondEvXmlBeginTime && nodeDetail.i > 0 && nodeDetail.MeasureNumberXML === 1 && nodeDetail.noteId === 0) {
 			// 	nodeDetail.time = nodeDetail.time + state.secondEvXmlBeginTime;
@@ -1415,6 +1413,14 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	const sortArray = allNotes.sort((a, b) => a.relativeTime - b.relativeTime).map((item, index) => Object.assign(item,{i:index}));
 	// const sortArray = allNotes.sort((a, b) => a.time - b.time).map((item, index) => ({ ...item, i: index }));
 	// const sortArray = allNotes.map((item, index) => ({ ...item, i: index }));
+	// 给 xmlNoteTime 和 xmlNoteEndTime 赋值
+	let xmlNoteTime = 0
+	sortArray.map(item => {
+		const noteLengthTime = item.noteLengthTime
+		item.xmlNoteTime = retain(xmlNoteTime)
+		item.xmlNoteEndTime = retain(xmlNoteTime + noteLengthTime)
+		xmlNoteTime += noteLengthTime
+	})
 	console.timeEnd("音符跑完时间");
 	try {
 		osmd.cursor.reset();