Преглед изворни кода

Merge branch 'hqyDevNewVersion' of http://git.dayaedu.com/liushengqiang/music-score into ktyq-test-new

黄琪勇 пре 11 месеци
родитељ
комит
26d18f2658

+ 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();

+ 2 - 2
src/page-instrument/header-top/index.tsx

@@ -156,7 +156,7 @@ function modeChangeHandleTimes(oldPlayType: "play" | "sing", oldPlaySource: IPla
   // 演奏向演唱切
   if (oldPlayType === "play" && playType === "sing") {
     if (playSource === "mingSong") {
-      // 唱名文件也要加上弱起时间  他们制作曲子加了弱起时间
+      // 唱名文件也要加上弱起时间  他们制作曲子加了弱起时间  注意这修改了之后给总控平台的时值也需要改
       state.fixtime = difftime;
       state.times.map((item) => {
         item.time = item.xmlNoteTime + difftime;
@@ -228,7 +228,7 @@ function modeChangeHandleTimes(oldPlayType: "play" | "sing", oldPlaySource: IPla
     // 演唱之间切换
     // 切到唱名时候
     if (playSource === "mingSong") {
-      // 唱名文件也要加上弱起时间  他们制作曲子加了弱起时间
+      // 唱名文件也要加上弱起时间  他们制作曲子加了弱起时间  注意这修改了之后给总控平台的时值也需要改
       state.fixtime = difftime;
       state.times.map((item) => {
         item.time = item.xmlNoteTime + difftime;

+ 7 - 6
src/page-instrument/view-detail/index.tsx

@@ -250,7 +250,7 @@ export default defineComponent({
       // 需要向外面(iframe)派发计时器数据的时候触发
       if (query.isbeatTimes) {
         const { isOpenMetronome, isSingOpenMetronome } = state;
-        const { xmlMp3BeatFixTime } = state.times[0];
+        const { xmlMp3BeatFixTime, difftime } = state.times[0];
         const singBeatTime: number[][] = [];
         const beatTime = metronomeData.metroMeasure.map((metroMeasure) => {
           const singBeat: number[] = [];
@@ -268,11 +268,11 @@ export default defineComponent({
           return beatTimeItem;
         });
         //改为唱名
-        state.fixtime = 0;
+        state.fixtime = difftime;
         state.times.map((item) => {
-          item.time = item.xmlNoteTime;
-          item.endtime = item.xmlNoteEndTime;
-          item.fixtime = 0;
+          item.time = item.xmlNoteTime + difftime;
+          item.endtime = item.xmlNoteEndTime + difftime;
+          item.fixtime = difftime;
         });
         metronomeData.metro.calculation(state.times);
         const mingBeatTime: number[][] = metronomeData.metroMeasure.map((metroMeasure) => {
@@ -281,7 +281,8 @@ export default defineComponent({
           });
           return beatTimeItem;
         });
-        const webApi_beatTimes = { beatTime, singBeatTime, mingBeatTime, isBeatTime:!state.isEvxml, isSingBeatTime:!state.isEvxml, isMingBeatTime:!state.isEvxml }
+        debugger
+        const webApi_beatTimes = { beatTime, singBeatTime, mingBeatTime, isBeatTime:!state.evXmlBeginArr.length, isSingBeatTime:!state.evXmlBeginArr.length, isMingBeatTime:!state.evXmlBeginArr.length }
         console.log("webApi_beatTimes", webApi_beatTimes);
         window.parent.postMessage(
           {

+ 2 - 2
src/page-instrument/view-detail/smoothAnimation/index.ts

@@ -368,7 +368,7 @@ function getPointsPosByBatePos(): pointsPosType {
    const frequencyLineData = quantileScale(frequencyData, 8, _canvasDomHeight - 8) // 最小值和最大值
    const pointsPos = state.times.reduce((posArr: any[], item, index) => {
       // 当休止小节,可能当前音符在谱面上没有实际的音符(没有bbox)
-      if (item.bbox?.x != null && item.noteId != null) {
+      if (item.bbox?.x != null && ![-Infinity, Infinity].includes(item.bbox?.x) && item.noteId != null) {
          posArr.push({
             noteId: item.noteId,
             MeasureNumberXML: item.MeasureNumberXML,
@@ -381,7 +381,7 @@ function getPointsPosByBatePos(): pointsPosType {
             // 这里当第一个音符noteId为null,找不到前一个noteId,所以兼容一下
             noteId: item.noteId != null ? item.noteId : (posArr[posArr.length - 1]?.noteId != null ? posArr[posArr.length - 1]?.noteId : -1) + 0.01, // 这里+0.01 是制造一个假id
             MeasureNumberXML: item.MeasureNumberXML,
-            x: item.bbox?.x != null ? item.bbox.x : posArr[posArr.length - 1]?.x || 10,
+            x: item.bbox?.x != null && ![-Infinity, Infinity].includes(item.bbox?.x) ? item.bbox.x : posArr[posArr.length - 1]?.x || 10,
             y: _canvasDomHeight - frequencyLineData[index]
          })
       }