Przeglądaj źródła

时值修改:增加初始谱面节拍器速度

黄琪勇 8 miesięcy temu
rodzic
commit
1983935c93
3 zmienionych plików z 56 dodań i 0 usunięć
  1. 43 0
      src/helpers/beatConfig.ts
  2. 9 0
      src/helpers/formateMusic.ts
  3. 4 0
      src/state.ts

+ 43 - 0
src/helpers/beatConfig.ts

@@ -15,3 +15,46 @@ export const unitObj = {
 export const speedBeatTo = (speedBeat: { unit: string; speed: number }, unit: string) => {
    return (unitObj[speedBeat.unit] * speedBeat.speed) / unitObj[unit]
 }
+
+/** 谱面速度节拍器转为 约定的节拍器符号 */
+export function beatUnitTo(beatUnit: string, isDot: boolean) {
+   let multiple = "1/4"
+   switch (beatUnit) {
+      case "1024th":
+         multiple = "1/1024"
+         break
+      case "512th":
+         multiple = "1/512"
+         break
+      case "256th":
+         multiple = "1/256"
+         break
+      case "128th":
+         multiple = "1/128"
+         break
+      case "64th":
+         multiple = "1/64"
+         break
+      case "32nd":
+         multiple = "1/32"
+         break
+      case "16th":
+         multiple = "1/16"
+         break
+      case "eighth":
+         multiple = "1/8"
+         break
+      case "quarter":
+         multiple = "1/4"
+         break
+      case "half":
+         multiple = "1/2"
+         break
+      case "whole":
+         multiple = "1/1"
+      default:
+         break
+   }
+   isDot && (multiple += ".")
+   return multiple
+}

+ 9 - 0
src/helpers/formateMusic.ts

@@ -14,6 +14,8 @@ import {
 	OpenSheetMusicDisplay,
 } from "/osmd-extended/src";
 import { GradualChange, speedInfo } from "./calcSpeed";
+import { beatUnitTo } from "/src/helpers/beatConfig"
+
 const browserInfo = browser();
 dayjs.extend(duration);
 
@@ -677,6 +679,13 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
 		state.originSpeed = speeds[0] ? speeds[0] : 100;
 		state.speed = state.originSpeed;
 	}
+	// 赋值谱面速度节拍器,没有的时候 以后台传入的为准
+	const metronomeXml = xmlParse.getElementsByTagName('metronome')?.[0]
+	const beatUnit = metronomeXml?.getElementsByTagName('beat-unit')?.[0]?.textContent || ''
+	if(beatUnit){
+		const beatUnitDot = metronomeXml?.getElementsByTagName('beat-unit-dot')?.[0]
+		state.speedBeatUnit = beatUnitTo(beatUnit, !!beatUnitDot)
+	}
 	// 如果谱面和小节都没有打速度,osmd设置的小节速度默认取后台设置的速度
 	if (speeds.length === 0) {
 		;(window as any).baseMeasureSpeed = state.originSpeed

+ 4 - 0
src/state.ts

@@ -361,6 +361,8 @@ const state = reactive({
   bizMusicCategoryId: 0,
   /** 资源类型: mp3 | midi */
   playMode: "MP3" as "MP3" | "MIDI",
+  /** 谱面的速度节拍 */
+  speedBeatUnit: "1/4",
   /** 设置的速度 */
   speed: 0,
   /** 曲谱音频正常的速度 */
@@ -1787,6 +1789,8 @@ const setState = (data: any, index: number) => {
   state.musicSheetCategoriesId = data.musicCategoryId;
   state.bizMusicCategoryId = data.bizMusicCategoryId
   state.playMode = data.playMode === "MP3" ? "MP3" : "MIDI";
+  // 设置速度节拍
+  state.speedBeatUnit = data.speedBeatUnit || "1/4"
   // 这里把后台设置的速度 转换为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;