瀏覽代碼

预备节拍器调整

黄琪勇 8 月之前
父節點
當前提交
803b3e4412
共有 3 個文件被更改,包括 19 次插入15 次删除
  1. 4 0
      src/helpers/metronome.ts
  2. 1 1
      src/page-instrument/view-detail/index.tsx
  3. 14 14
      src/view/tick/index.tsx

+ 4 - 0
src/helpers/metronome.ts

@@ -42,6 +42,7 @@ export const metronomeData = reactive({
 	cursorTips: '' as string, // 光标模式提示文字
 	followAudioIndex: 1, // 当前的拍数
 	totalNumerator: 2, // 总拍数
+	firstBeatTypeArr:[] as number[] // 第一小节的节拍
 });
 
 watch(
@@ -408,6 +409,9 @@ class Metronome {
 				const measure = measures[i];
 				// 87拍和45拍要根据小节返回的CompoundTempo特殊处理
 				const beatTypeArr = getBeatTypeArr(measure.CompoundTempo)
+				if(i===0){
+					metronomeData.firstBeatTypeArr = beatTypeArr
+				}
 				metroMeasure[i] = [] as number[];
 				for (let j = 0; j < beatTypeArr.length; j++) {
 					// 累加

+ 1 - 1
src/page-instrument/view-detail/index.tsx

@@ -300,7 +300,7 @@ export default defineComponent({
        * 设置节拍器,跟练需要播放系统节拍器,所以不需要判断needTick状态
        */
       // if (state.needTick) {
-      handleInitTick(osmd?.Sheet?.SheetPlaybackSetting?.Rhythm?.Numerator || 4, osmd?.Sheet?.SheetPlaybackSetting?.Rhythm?.denominator);
+      handleInitTick();
       // }
       // api_cloudLoading();
       // state.playBtnDirection = query.imagePos === 'left' ? 'left' : 'right';

+ 14 - 14
src/view/tick/index.tsx

@@ -7,14 +7,14 @@ import state from "/src/state";
 import { browser } from "/src/utils/index";
 import tickWav from "/src/assets/tick.mp3";
 import tockWav from "/src/assets/tock.mp3";
+import { metronomeData } from "/src/helpers/metronome"
 
 const tickData = reactive({
 	len: 0,
-	denominator: undefined as undefined | number,
 	reduceLen: 0,
 	tickEnd: false,
 	/** 节拍器时间 */
-	beatLengthInMilliseconds: 0,
+	beatLengthInMilliseconds: [] as number[],
 	index: 0,
 	show: false
 });
@@ -70,7 +70,7 @@ const handlePlay = (i: number, source: any | null) => {
 		} else {
 			_time=setTimeout(() => {
 				tickPlayCb(i, resolve, source);
-			}, tickData.beatLengthInMilliseconds);
+			}, tickData.beatLengthInMilliseconds[i-1]*1000/state.basePlayRate);
 		}
 	});
 };
@@ -95,17 +95,18 @@ const createAudio = (src: string): Promise<HTMLAudioElement | null> => {
 };
 
 /** 设置节拍器
- * @param beat 节拍数
- * @param denominator 节拍器分母
  */
-export const handleInitTick = (beat: number, denominator?: number) => {
-	tickData.len = beat;
-	tickData.denominator = denominator;
-	// 节拍器的个数除以2 直到小于等于4为止 
-	while (beat > 4 && beat % 2 === 0) {
-        beat = beat / 2;
-    }
-	tickData.reduceLen = beat
+export const handleInitTick = () => {
+	const beatLen = metronomeData.firstBeatTypeArr.length
+	tickData.beatLengthInMilliseconds = metronomeData.firstBeatTypeArr.map(item=>{
+		return Math.abs(item)*state.times[0].measureLength
+	})
+	tickData.len = beatLen;
+	// // 节拍器的个数除以2 直到小于等于4为止 
+	// while (beat > 4 && beat % 2 === 0) {
+    //     beat = beat / 2;
+    // }
+	tickData.reduceLen = beatLen
 };
 
 /** 开始节拍器 */
@@ -114,7 +115,6 @@ export const handleStartTick = async () => {
 	tickData.show = true;
 	tickData.tickEnd = false;
 	tickData.index = 0;
-	tickData.beatLengthInMilliseconds = tickData.denominator ? 4 / tickData.denominator * (60 / state.speed) * 1000 : (60 / state.speed) * 1000;
 	for(let i = 0; i <= useLen.value; i++){
 		// 提前结束, 直接放回false
 		if (tickData.tickEnd) return false;