Jelajahi Sumber

feat: 音符数据添加速度和速度节拍标示

TIANYONG 8 bulan lalu
induk
melakukan
814b8302da
4 mengubah file dengan 25 tambahan dan 16 penghapusan
  1. 1 1
      osmd-extended
  2. 18 11
      src/helpers/formateMusic.ts
  3. 2 1
      src/page-instrument/header-top/speed/index.tsx
  4. 4 3
      src/state.ts

+ 1 - 1
osmd-extended

@@ -1 +1 @@
-Subproject commit 9d0f5875fcb9468ce0eba40b7849cffdb62bf6cc
+Subproject commit dd68ffab2f3f6e194b3886981036f05dcd1de4ca

+ 18 - 11
src/helpers/formateMusic.ts

@@ -14,7 +14,7 @@ import {
 	OpenSheetMusicDisplay,
 } from "/osmd-extended/src";
 import { GradualChange, speedInfo } from "./calcSpeed";
-import { beatUnitTo } from "/src/helpers/beatConfig"
+import { beatUnitTo, speedBeatTo } from "/src/helpers/beatConfig"
 
 const browserInfo = browser();
 dayjs.extend(duration);
@@ -975,15 +975,19 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			}
 			note.maxNoteNum = maxNoteNum;
 			note.trackIndex = minIndex;
-			currentRealTempo = iterator.currentMeasure.tempoExpressions.length ? iterator.currentMeasure.tempoExpressions.find((item: any) => item?.InstantaneousTempo?.isMetronomeMark) || currentRealTempo : currentRealTempo;
-			
+			currentRealTempo = iterator.currentMeasure.tempoExpressions.length ? iterator.currentMeasure.tempoExpressions.find((item: any) => item?.InstantaneousTempo?.isMetronomeMark)?.InstantaneousTempo || currentRealTempo : currentRealTempo;
+			const { beatUnit="quarter", dotted=false, tempoInBpm } = currentRealTempo
+			const speedBeatUnit = beatUnitTo(beatUnit, dotted)
 			_notes.push({
 				note,
 				iterator: { ...iterator },
 				currentTime,
 				isDouble,
 				isMutileSubject,
-				measuresTempoInBPM: note?.sourceMeasure?.tempoInBPM,
+				// measuresTempoInBPM: note?.sourceMeasure?.tempoInBPM,
+				// 转换成1/4拍的速度
+				measuresTempoInBPM: speedBeatTo({unit: speedBeatUnit || "1/4",speed: tempoInBpm || 0}, `1/4`),
+				speedBeatUnit, // 当前谱面小节的速度对应的是几分音符
 				currentRealTempo
 			});
 		}
@@ -1002,7 +1006,7 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 	console.log('变速曲子',hasVaryingSpeed, _notes)
 	let noteIds: any = [];
 	// let voicesBBox: any = null;
-	for (let { note, iterator, currentTime, isDouble, isMutileSubject } of _notes) {
+	for (let { note, iterator, currentTime, isDouble, isMutileSubject, speedBeatUnit, measuresTempoInBPM } of _notes) {
 		if (note) {
 			if (preMeasureNumber != note?.sourceMeasure?.MeasureNumberXML) {
 				si = 0
@@ -1110,11 +1114,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 
 			let beatSpeed = 0;
 			// 速度不能为0 此处的速度应该是按照设置的速度而不是校准后的速度,否则mp3速度不对
-			if (measureSpeed !== baseSpeed && !hasVaryingSpeed) {
-				beatSpeed = baseSpeed || measureSpeed || 100
-			} else {
-				beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
-			}
+			// if (measureSpeed !== baseSpeed && !hasVaryingSpeed) {
+			// 	beatSpeed = baseSpeed || measureSpeed || 100
+			// } else {
+			// 	beatSpeed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
+			// }
+			// 计算音符时值,使用转换成1/4的速度计算
+			beatSpeed = measuresTempoInBPM;
 			// let beatSpeed = measureSpeed || baseSpeed
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
@@ -1392,7 +1398,8 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				firstVerticalMeasure: activeVerticalMeasureList[0],
 				noteLength: 1,
 				//osdmContext: osmd,
-				speedbeatUnit: beatUnit,
+				// speedbeatUnit: beatUnit,
+				speedBeatUnit, // 当前谱面小节的速度对应的是几分音符
 				multipleRestMeasures: multipleRestMeasures, // 当前合并小节的索引,从1开始到当前的totalMultipleRestMeasures结束,
 				totalMultipleRestMeasures, // 当前小节总的合并小节数
 				measureSpeed,  // 小节速度

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

@@ -35,7 +35,8 @@ export default defineComponent({
 			() => speed.value,
 			() => {
 				// handleSetSpeed(speed.value);
-				state.speed = Math.floor(speed.value);
+				// state.speed = Math.floor(speed.value);
+				state.speed = speed.value
 				// handleSetSpeed(speed.value);
 				if (state.playState === 'paused') {
 					const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];

+ 4 - 3
src/state.ts

@@ -686,7 +686,7 @@ const dynamicShowPlaySpeed = (index: number, isPlaying?: boolean) => {
     const item: any = state.times[index];
     if (item && item.measureSpeed ) {
       // console.log('速度1',item.measureSpeed)
-      const newSpeed = Math.floor(state.basePlayRate * item.measureSpeed)
+      const newSpeed = state.basePlayRate * item.measureSpeed
       if (state.speed !== newSpeed) {
         state.speed = newSpeed;
       }
@@ -705,7 +705,7 @@ export const initSetPlayRate = () => {
   let item: any = (state.sectionStatus && state.section.length === 2) ? state.sectionFirst || state.section[0] : state.times[state.activeNoteIndex];
   console.log('播放状态',state.playState)
   if (item && item.measureSpeed) {
-    const ratio = state.speed / Math.floor(item.measureSpeed)
+    const ratio = state.speed / item.measureSpeed
     // state.audiosInstance?.setSpeed(ratio)
     state.basePlayRate = ratio || 1;
     console.log('播放倍率',state.basePlayRate)
@@ -823,7 +823,8 @@ export const skipNotePlay = async (itemIndex: number, isStart = false, handType?
   if (item) {
     // 非选段模式,点击音符,动态设置右下角的速度
     if (item.measureSpeed && state.section.length < 2) {
-      state.speed = Math.floor(state.basePlayRate * item.measureSpeed)
+      // console.log('速度3')
+      state.speed = state.basePlayRate * item.measureSpeed
     }
     setAudioCurrentTime(itemTime, itemIndex);
     // 一行谱,点击音符,或者播放完成,需要跳转音符位置