Browse Source

fix: #9877 bug修复

TIANYONG 1 year ago
parent
commit
3d2357b451
2 changed files with 22 additions and 5 deletions
  1. 12 2
      src/helpers/formateMusic.ts
  2. 10 3
      src/helpers/metronome.ts

+ 12 - 2
src/helpers/formateMusic.ts

@@ -740,6 +740,9 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 		const voiceEntries = iterator.CurrentVoiceEntries?.[0] ? [iterator.CurrentVoiceEntries?.[0]] : [];
 
 		let currentVoiceEntries: any[] = [];
+		// 多分轨,当前小节最大音符数量
+		let maxNoteNum = 0;
+		iterator.currentMeasure.verticalMeasureList.forEach((item: any) => maxNoteNum = Math.max(maxNoteNum, item?.staffEntries?.length || 0))
 		// 单声部多声轨
 		if (state.multitrack > 0) {
 			currentVoiceEntries = [...iterator.CurrentVoiceEntries];
@@ -801,6 +804,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			if (state.multitrack > 0 && currentTime > note.length.realValue) {
 				currentTime = note.length.realValue;
 			}
+			note.maxNoteNum = maxNoteNum
 			_notes.push({
 				note,
 				iterator: { ...iterator },
@@ -1068,6 +1072,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				speedbeatUnit: beatUnit,
 				multipleRestMeasures: multipleRestMeasures,
 				measureSpeed,  // 小节速度
+				maxNoteNum: note.maxNoteNum, // 当前小节音符最多的分轨的音符数量
 			};
 			nodeDetail.realKey = formatRealKey(note.halfTone - fixedKey * 12, nodeDetail);
 			nodeDetail.duration = nodeDetail.endtime - nodeDetail.time;
@@ -1078,11 +1083,16 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// console.log(note.sourceMeasure.MeasureNumberXML, note.sourceMeasure.verticalSourceStaffEntryContainers.length)
 			// console.log('👀看看endtime', nodeDetail.duration, relaEndtime, fixtime, i)
 			tickables = tickables.filter((tickable: any) => tickable.attrs?.type !== "GhostNote")
-			nodeDetail.noteLength = tickables.length || 1;
+			const maxNum = (state.isCombineRender && note.maxNoteNum) ? note.maxNoteNum : tickables.length;
+			nodeDetail.noteLength = maxNum || 1;
 			allNotes.push(nodeDetail);
 			allNoteId.push(nodeDetail.id);
 			measures.push(nodeDetail);
-			if (si < tickables.length - 1) {
+			/**
+			 * bug: #9877
+			 * 多分轨合并展示的曲子,不同分轨,同一小节音符的数量可能不能,不能只通过tickables的长度判断该小节的音符数量
+			 */
+			if (si < maxNum - 1) {
 				si++;
 			} else {
 				si = 0;

+ 10 - 3
src/helpers/metronome.ts

@@ -174,7 +174,7 @@ class Metronome {
 			metronomeData.isClick = false;
 			return;
 		}
-		toggleLine()
+		// toggleLine()
 		metronomeData.isClick = false;
 	};
 	// 播放
@@ -191,7 +191,7 @@ class Metronome {
 		} else {
 			this.source.muted = false
 		}
-		console.log('节拍器播放的时间',tickTockPlayTime)
+		// console.log('节拍器播放的时间',tickTockPlayTime)
 		this.source.play();
 	};
 
@@ -325,7 +325,7 @@ class Metronome {
 				}
 			}
 		}
-		// console.log(measures, measures.length);
+		console.log(measures, measures.length,'小节汇总');
 
 		let metroList: number[] = [];
 		const metroMeasure: any[] = [];
@@ -440,6 +440,13 @@ function calculateMetroStep(arr: any[], m: any): number[] {
 			if (state.musicRenderType !== "staff") {
 				measure_bbox = item?.svgElement?.attrs?.el?.parentElement?.parentElement?.querySelector('.vf-stave')?.getBoundingClientRect?.() || { x: 0 };
 			}			
+			/**
+			 * 如果measure_bbox不存在(多分轨合并显示可能会出现),则用note再获取一次
+			 */
+			if (!measure_bbox.width && notes.length > 0) {
+				measure_bbox = state.musicRenderType !== "staff" ? notes[0]?.svgElement?.attrs?.el?.parentElement?.parentElement?.querySelector('.vf-stave')?.getBoundingClientRect?.() || { x: 0 } : 
+				notes[0]?.svgElement?.attrs?.el?.parentElement?.parentElement?.getBoundingClientRect?.() || { x: 0 }
+			}
 			if (notes.length > 0) {
 				let bbox = notes[0]?.svgElement?.attrs?.el?.getBoundingClientRect?.() || { x: 0 };
 				let x: any = bbox.x - measure_bbox.x;