Sfoglia il codice sorgente

区分演唱和演奏 mp3节拍器和系统节拍器的时间点计算

黄琪勇 1 anno fa
parent
commit
0f3b88281c

+ 9 - 3
src/helpers/formateMusic.ts

@@ -1,6 +1,7 @@
 import dayjs from "dayjs";
 import duration from "dayjs/plugin/duration";
 import state, { customData } from "/src/state";
+import { metronomeData as metronomeDataState } from "./metronome"
 import { browser } from "../utils/index";
 import {
 	isSpecialMark,
@@ -43,7 +44,7 @@ export const getFixTime = (speed: number) => {
 		numerator = numerator*2;
 	}
 	// console.log('diff', speed, duration, formatBeatUnit(beatUnit), denominator, numerator, (numerator / denominator))
-	return state.isOpenMetronome ? (60 / speed) * formatBeatUnit(beatUnit) * (numerator / denominator) : 0;
+	return (60 / speed) * formatBeatUnit(beatUnit) * (numerator / denominator);
 };
 
 export const retain = (time: number) => {
@@ -975,8 +976,13 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			// let beatSpeed = measureSpeed || baseSpeed
 			// 如果有节拍器,需要将节拍器的时间算出来
 			if (i === 0) {
-				fixtime += getFixTime(beatSpeed);
-				state.fixtime = fixtime;
+				if(state.isOpenMetronome){
+					fixtime += getFixTime(beatSpeed);
+					state.fixtime = fixtime;
+				}
+				// 存储mp3节拍器时间
+				metronomeDataState.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))

+ 1 - 0
src/helpers/metronome.ts

@@ -42,6 +42,7 @@ export const metronomeData = reactive({
 	cursorTips: '' as string, // 光标模式提示文字
 	followAudioIndex: 1, // 当前的拍数
 	totalNumerator: 2, // 总拍数
+	xmlMp3BeatFixTime: 0   // 当前xml mp3节拍器的时间 切换演奏和演唱计算时间用
 });
 
 watch(

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

@@ -9,7 +9,7 @@ import { Badge, Circle, Popover, Popup, showConfirmDialog, showToast, NoticeBar
 import Speed from "./speed";
 import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
 import Settting from "./settting";
-import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, resetPlaybackToStart } from "/src/state";
+import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay } from "/src/state";
 import { getAudioCurrentTime } from "/src/view/audio-list";
 import { followData, toggleFollow } from "/src/view/follow-practice";
 import { api_back } from "/src/helpers/communication";
@@ -428,6 +428,60 @@ export default defineComponent({
       }
     };
 
+    // 切换 演唱和演奏模式的时候处理
+    function handlerRefreshPlayType() {
+      // 妙极客的 曲子 时间是不变的,所以不做处理
+      if( !state.isEvxml ) {
+        // 重新计算state.times
+        const { isOpenMetronome, isSingOpenMetronome } = state
+        const { xmlMp3BeatFixTime } = metronomeData
+        if(state.playType === "play"){
+          if(isOpenMetronome && !isSingOpenMetronome){
+            state.fixtime = state.fixtime + xmlMp3BeatFixTime
+          } else if(!isOpenMetronome && isSingOpenMetronome){
+            state.fixtime = state.fixtime - xmlMp3BeatFixTime
+          }
+        }else{
+          if(isSingOpenMetronome && !isOpenMetronome){
+            state.fixtime = state.fixtime + xmlMp3BeatFixTime
+          } else if(!isSingOpenMetronome && isOpenMetronome){
+            state.fixtime = state.fixtime - xmlMp3BeatFixTime
+          }
+        }
+        const fixtime = state.fixtime
+        state.times.map(item => {
+          if(state.playType === "play"){
+            if(isOpenMetronome && !isSingOpenMetronome){
+              item.time = item.time + xmlMp3BeatFixTime
+              item.endtime = item.endtime + xmlMp3BeatFixTime
+              item.fixtime = fixtime
+            } else if(!isOpenMetronome && isSingOpenMetronome){
+              item.time = item.time - xmlMp3BeatFixTime
+              item.endtime = item.endtime - xmlMp3BeatFixTime
+              item.fixtime = fixtime
+            }
+          }else{
+            if(isSingOpenMetronome && !isOpenMetronome){
+              item.time = item.time + xmlMp3BeatFixTime
+              item.endtime = item.endtime + xmlMp3BeatFixTime
+              item.fixtime = fixtime
+            } else if(!isSingOpenMetronome && isOpenMetronome){
+              item.time = item.time - xmlMp3BeatFixTime
+              item.endtime = item.endtime - xmlMp3BeatFixTime
+              item.fixtime = fixtime
+            }
+          }
+        })
+        try {
+          metronomeData.metro.calculation(state.times);
+        } catch (error) {}
+        console.log("重新之后的times", state.times, fixtime)
+      }
+      // 重置播放状态
+      handleRessetState()
+      // 隐藏重播按钮
+      resetBtn.value.display = false
+    }
     return () => (
       <>
         <div
@@ -517,7 +571,7 @@ export default defineComponent({
                   state.playType = "play"
                   state.playSource = state.music?"music":"background"
                 }
-                resetPlaybackToStart()
+                handlerRefreshPlayType()
               }}
             >
               <img style={{ display: state.playType === "play" ? "" : "none" }} class={styles.iconBtn} src={headImg(`perform.png`)} />

+ 3 - 3
src/page-instrument/view-detail/smoothAnimation/index.ts

@@ -42,7 +42,7 @@ export const smoothAnimationState = {
 } as smoothAnimationType
 
 // 监听显示与隐藏
-watch(smoothAnimationState.isShow, (a,c) => {
+watch(smoothAnimationState.isShow, () => {
    if (smoothAnimationState.isShow.value) {
       smoothAnimationState.smoothAnimationBoxDom?.classList.remove("smoothAnimationBoxHide")
       moveSmoothAnimation(moveState.progress, moveState.activeIndex)
@@ -59,7 +59,7 @@ export function initSmoothAnimation() {
    createSmoothAnimation()
    // 初始化动画数据
    const batePos = getPointsPosByBatePos()
-   console.log(batePos)
+   console.log(batePos, "batePos")
    smoothAnimationState.pointsPos = createSmoothCurvePoints(batePos, undefined, undefined, _numberOfSegments)
    // 谱面的平均速度(因为可能有反复的情况所以实际距离要加上反复的距离)
    const canvasDomPath = batePos.reduce((path, item, index, arr) => {
@@ -75,7 +75,7 @@ export function initSmoothAnimation() {
    calcClientWidth()
    document.addEventListener("resize", calcClientWidth)
    smoothAnimationState.isShow.value = true
-   console.log(smoothAnimationState, 777777)
+   console.log(smoothAnimationState, "一行谱小鸟数据")
 }
 
 /**