Browse Source

时值修改: 速度 改为1/4 音符的速度,按1/4拍为基准计算

黄琪勇 7 months ago
parent
commit
22e39d746f
5 changed files with 34 additions and 51 deletions
  1. 1 1
      osmd-extended
  2. 17 0
      src/helpers/beatConfig.ts
  3. 12 46
      src/helpers/formateMusic.ts
  4. 3 3
      src/state.ts
  5. 1 1
      vite.config.ts

+ 1 - 1
osmd-extended

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

+ 17 - 0
src/helpers/beatConfig.ts

@@ -0,0 +1,17 @@
+export const unitObj = {
+   "1/1": 1 / 1,
+   "1/2": 1 / 2,
+   "1/4": 1 / 4,
+   "1/8": 1 / 8,
+   "1/16": 1 / 16,
+   "1/2.": (1 / 2) * 1.5,
+   "1/4.": (1 / 4) * 1.5,
+   "1/8.": (1 / 8) * 1.5
+} as Record<string, any>
+
+/**
+ * 速度转换,几分音符的速度转为几分音符的速度
+ */
+export const speedBeatTo = (speedBeat: { unit: string; speed: number }, unit: string) => {
+   return (unitObj[speedBeat.unit] * speedBeat.speed) / unitObj[unit]
+}

+ 12 - 46
src/helpers/formateMusic.ts

@@ -32,7 +32,7 @@ export const getFixTime = (speed: number) => {
 	const duration: any = getDuration(state.osmd as unknown as OpenSheetMusicDisplay);
 	let numerator = duration.numerator || 0;
 	let denominator = duration.denominator || 4;
-	const beatUnit = duration.beatUnit || "quarter";
+	const beatUnit = "quarter";
 	// if (state.repeatedBeats) {
 	// 	// 音频制作问题仅2拍不重复
 	// 	numerator = numerator === 2 ? 4 : numerator;
@@ -149,9 +149,9 @@ export const getDuration = (osmd?: OpenSheetMusicDisplay): Duration => {
 		const { Duration, TempoInBPM, ActiveTimeSignature, TempoExpressions } = osmd.GraphicSheet.MeasureList[0][0]?.parentSourceMeasure;
 		if (Duration) {
 			let beatUnit = "quarter";
-			for (const item of TempoExpressions) {
-				beatUnit = item.InstantaneousTempo.beatUnit || "quarter";
-			}
+			// for (const item of TempoExpressions) {
+			// 	beatUnit = item.InstantaneousTempo.beatUnit || "quarter";
+			// }
 			const duration = formatDuration(ActiveTimeSignature, Duration) as unknown as FractionDefault;
 			return {
 				...duration,
@@ -238,11 +238,6 @@ export function formatBeatUnit(beatUnit: string) {
 	return multiple;
 }
 
-/** 根据音符单位,速度,几几拍计算正确的时间 */
-export function getTimeByBeatUnit(beatUnit: string, bpm: number, denominator: number) {
-	return (denominator / formatBeatUnit(beatUnit)) * bpm;
-}
-
 export type CustomInfo = {
 	showSpeed: boolean;
 	parsedXML: string;
@@ -1002,14 +997,14 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				preMeasureNumber = note?.sourceMeasure?.MeasureNumberXML
 				allMeasures.push(note.sourceMeasure);
 			}
-			if (si === 0 && state.isSpecialBookCategory) {
-				for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
-					if (expression?.InstantaneousTempo?.beatUnit) {
-						// 取最后一个有效的tempo
-						beatUnit = expression.InstantaneousTempo.beatUnit;
-					}
-				}
-			}
+			// if (si === 0 && state.isSpecialBookCategory) {
+			// 	for (const expression of (note.sourceMeasure as SourceMeasure)?.TempoExpressions) {
+			// 		if (expression?.InstantaneousTempo?.beatUnit) {
+			// 			// 取最后一个有效的tempo
+			// 			beatUnit = expression.InstantaneousTempo.beatUnit;
+			// 		}
+			// 	}
+			// }
 			// 判断是否是同一小节
 			if (staveIndex == note.sourceMeasure?.MeasureNumberXML && i !== 0) {
 				staveNoteIndex++
@@ -1117,7 +1112,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 				xmlMp3BeatFixTime = getFixTime(beatSpeed)
 				// console.log("fixtime:", fixtime, '速度:', beatSpeed, "state.isSpecialBookCategory:", state.isSpecialBookCategory, 'state.isOpenMetronome:', state.isOpenMetronome);
 			}
-			// console.log(getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator))
 			let gradualLength = 0;
 			let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1;
 			gradualChange = iterator.currentMeasure.speedInfo || gradualChange;
@@ -1157,34 +1151,6 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 						}
 					}
 				}
-			} else if (state.appName === "GYM" && gradualChange && gradualSpeed && (gradualChange.startXmlNoteIndex === si || gradualChangeIndex > 0)) {
-				const startSpeed = gradualSpeed[0] - (gradualSpeed[1] - gradualSpeed[0]);
-				const { resetXmlNoteIndex, endXmlNoteIndex } = gradualChange;
-				const noteDiff = endXmlNoteIndex;
-				let stepSpeed = (gradualSpeed[gradualSpeed.length - 1] - startSpeed) / noteDiff;
-				stepSpeed = note.DotsXml ? stepSpeed / 1.5 : stepSpeed;
-				if (gradualChangeIndex < noteDiff) {
-					const tempSpeed = Math.ceil(speed + stepSpeed * gradualChangeIndex);
-					let tmpSpeed = getTimeByBeatUnit(beatUnit, tempSpeed, iterator.currentMeasure.activeTimeSignature.Denominator);
-					const maxLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
-					// speed += stepSpeeds.reduce((a, b) => a + b, 0)
-					speed += Math.ceil(stepSpeed * (gradualChangeIndex + 1));
-					tmpSpeed = getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator);
-					const minLength = (wholeValue + numerator / denominator) * vDenominator * (60 / tmpSpeed);
-					gradualLength = (maxLength + minLength) / 2;
-				} else if (resetXmlNoteIndex > gradualChangeIndex) {
-					speed = allNotes[i - 1]?.speed;
-				}
-				beatSpeed =
-					(state.isSpecialBookCategory ? getTimeByBeatUnit(beatUnit, speed, iterator.currentMeasure.activeTimeSignature.Denominator) : baseSpeed) || 1;
-				const isEnd = !(gradualChangeIndex < noteDiff) && !(resetXmlNoteIndex > gradualChangeIndex);
-				gradualChangeIndex++;
-				if (isEnd) {
-					gradualChangeIndex = 0;
-					gradualChange = undefined;
-					gradualSpeed = undefined;
-					stepSpeeds = [];
-				}
 			}
 			const _noteLength = NoteRealValue;
 			// 当前音符的持续时长,当前音符的RealValue值*拍数*(60/后台设置的基准速度)

+ 3 - 3
src/state.ts

@@ -23,6 +23,7 @@ import { headTopData } from "/src/page-instrument/header-top/index";
 import { api_lessonTrainingTrainingStudentDetail } from "/src/page-instrument/api"
 import { undoData, moveData } from "/src/view/plugins/move-music-score"
 import { HANDLE_WORK_ADD } from "/src/page-instrument/custom-plugins/work-index";
+import { speedBeatTo } from "/src/helpers/beatConfig"
 
 const query: any = getQuery();
 
@@ -1786,9 +1787,8 @@ const setState = (data: any, index: number) => {
   state.musicSheetCategoriesId = data.musicCategoryId;
   state.bizMusicCategoryId = data.bizMusicCategoryId
   state.playMode = data.playMode === "MP3" ? "MP3" : "MIDI";
-  state.originSpeed = state.speed = parseFloat(data.playSpeed) || 0;
-  // state.originSpeed = state.speed = data.playSpeed;
-  // state.playIngSpeed = data.playSpeed;
+  // 这里把后台设置的速度 转换为1/4拍的速度 
+  state.originSpeed = state.speed = speedBeatTo({unit: data.speedBeatUnit || "1/4",speed: parseFloat(data.playSpeed) || 0}, `1/4`);
   const track = data.code || data.track;
   state.track = track ? track.replace(/ /g, "").toLocaleLowerCase() : "";
   // 能否评测,根据当前声轨有无伴奏判断

+ 1 - 1
vite.config.ts

@@ -52,7 +52,7 @@ export default defineConfig({
     // https: true,
     proxy: {
       "^/instrument/.*": {
-        target: "https://test.gym.lexiaoya.cn",
+        target: "https://dev.gym.lexiaoya.cn",
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),
       },