Browse Source

Merge branch 'feature-tianyong' into gym-test

TIANYONG 8 months ago
parent
commit
247e644d7d
3 changed files with 13 additions and 6 deletions
  1. 8 4
      src/helpers/formateMusic.ts
  2. 4 1
      src/helpers/metronome.ts
  3. 1 1
      src/view/selection/index.tsx

+ 8 - 4
src/helpers/formateMusic.ts

@@ -1123,6 +1123,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// 计算音符时值,使用转换成1/4的速度计算
 			beatSpeed = measuresTempoInBPM;
 			// let beatSpeed = measureSpeed || baseSpeed
+			beatSpeed = beatSpeed / state.originAudioPlayRate;
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
 				if(state.isOpenMetronome){
@@ -1134,7 +1135,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				// console.log("fixtime:", fixtime, '速度:', beatSpeed, "state.isSpecialBookCategory:", state.isSpecialBookCategory, 'state.isOpenMetronome:', state.isOpenMetronome);
 			}
 			let gradualLength = 0;
-			let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			// let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			let speed = measureSpeed ? measureSpeed : baseSpeed;
 			gradualChange = iterator.currentMeasure.speedInfo || gradualChange;
 			gradualSpeed = osmd.Sheet.SoundTempos?.get(note.sourceMeasure.measureListIndex) || gradualSpeed;
 			if (!gradualSpeed || gradualSpeed.length < 2) {
@@ -1218,9 +1220,11 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				const staffEntries = note.sourceMeasure.verticalMeasureList?.[0]?.staffEntries || [];
 				//计算第一个小节里面的音符时值是否等于整个小节的时值
 				staffEntries.forEach((_a: any) => {
-					if (_a?.sourceStaffEntry?.voiceEntries?.[0]?.notes?.[0]?.length?.realValue) {
-						_firstMeasureRealValue += _a.sourceStaffEntry.voiceEntries[0].notes[0].length.realValue;
-					}
+					// 需要过滤掉倚音音符
+					const matchNote = _a?.sourceStaffEntry?.voiceEntries?.length > 1 ? _a?.sourceStaffEntry?.voiceEntries.find((item: any) => !item.isGrace) : _a?.sourceStaffEntry?.voiceEntries?.[0]
+					if (matchNote?.notes?.[0]?.length?.realValue) {
+						_firstMeasureRealValue += matchNote.notes[0].length.realValue;
+					}					
 				});
 				if (_firstMeasureRealValue < vRealValue) {
 					// console.log(_firstMeasureRealValue, vRealValue)

+ 4 - 1
src/helpers/metronome.ts

@@ -421,6 +421,9 @@ class Metronome {
 				const widthStep = 100 / (beatTypeArr.length+1);
 				// 当前拍子的组合数(2+3+2,3+2)中的数字
 				let beatNum = 0;
+				// if (measure.measureNumberXML == 98) {
+				// 	debugger
+				// }
 				for (let j = 0; j < beatTypeArr.length; j++) {
 					// 累加
 					const beatMuit = Array(j).fill("").reduce((num:number,v:any,i:number) => {
@@ -445,7 +448,7 @@ class Metronome {
 						left = measure.stepList[currentIdx] + "px";
 					} else {
 						const preLeft = measure.stepList[j - 1];
-						left = !preLeft || preLeft.toString().indexOf("%") > -1 ? `${widthStep*(j+1)}%` : `${preLeft}px + ${widthStep*(j+1)}%`;
+						left = !preLeft || preLeft.toString().indexOf("%") > -1 ? `${widthStep}%` : `${preLeft}px + ${widthStep}%`;
 						measure.stepList[j] = left;
 					}					
 					metroMeasure[i].push({

+ 1 - 1
src/view/selection/index.tsx

@@ -225,7 +225,7 @@ export default defineComponent({
 						})
 						// 获取stave里面vf-custom-bg的位置坐标,才是准确的坐标
 						// const currBgX = document.getElementById(currItem.stave.attrs.id)?.querySelector('.vf-custom-bg')?.getBoundingClientRect()?.x || 0;
-						const currBgX = document.getElementById(currItem.stave.attrs.id)?.querySelector('.vf-custom-bg')?.getBBox()?.x * state.zoom || 0;
+						const currBgX = currItem.stave?.attrs && currItem.stave.attrs.id ? document.getElementById(currItem.stave.attrs.id)?.querySelector('.vf-custom-bg')?.getBBox()?.x * state.zoom || 0 : 0;
 						return currItem && {
 							left: currBgX ? currBgX + 'px' : currItem.staveBox.left,
 							top: currItem.staveBox.top,