Browse Source

feat: 调速逻辑修改(播放过程中不支持调速,速度以当前选中的小节速度为基准)

TIANYONG 9 months ago
parent
commit
4ac9cf11d6

+ 3 - 2
osmd-extended/src/MusicalScore/Graphical/MusicSheetCalculator.ts

@@ -738,10 +738,11 @@ export abstract class MusicSheetCalculator {
                 multiExpression.getFontstyleOfFirstEntry(),
                 placement,
                 fontHeight);
-
+            
+            // @ts-ignore    
             const gue: GraphicalUnknownExpression = new GraphicalUnknownExpression(
                 staffLine, graphLabel, placement, measures[staffIndex]?.parentSourceMeasure, multiExpression);
-                console.log(gue)
+            // console.log(gue)
             //    multiExpression); // TODO would be nice to hand over and save reference to original expression,
             //                         but MultiExpression is not an AbstractExpression.
             // staffline 里面最后的文字重叠问题,向后偏移

+ 34 - 1
src/pages/detail/runtime.ts

@@ -140,6 +140,10 @@ const state = reactive({
   } as {[key: string]: () => void},  
   /** 阶段评测,延迟检测是否检测过 */
   delayCheckFirst: false,  
+  /** 开始播放时,记录的mp3播放倍率,用户当前设置的速度/当前小节的速度 */
+  basePlayRate: 1,
+  /** 播放中,更加当前小节速度动态计算的展示速度 */
+  playIngSpeed: 90,
 })
 
 const syncStepIndex = (i: number) => {
@@ -299,7 +303,7 @@ export const changeAllMode = () => {
 }
 
 export const changeSpeed = (speed: number, isSave: boolean = true) => {
-  // console.log(speed)
+  console.log('速度设置',speed,isSave)
   // const route: any = router.currentRoute.value
   const speeds = store.get('speeds') || {}
   if (isSave){
@@ -307,6 +311,7 @@ export const changeSpeed = (speed: number, isSave: boolean = true) => {
     store.set('speeds', speeds)
   }
   state.speed = speed
+  state.playIngSpeed = speed
   if (!detailState.activeDetail) return
   state.audiosInstance?.setSpeed(speed / detailState.baseSpeed)
   promisefiyPostMessage({
@@ -368,6 +373,26 @@ export const refreshIndexBase = (index: number) => {
   }
 }
 
+// 练习模式下,开始播放时,记录mp3的播放倍率
+export const initSetPlayRate = () => {
+  const item: any = detailState.times[state.activeIndex];
+  if (item && modelType.value === "practice" && item.measureSpeed) {
+    const ratio = state.speed / item.measureSpeed
+    // state.audiosInstance?.setSpeed(ratio)
+    state.basePlayRate = ratio || 1;
+    console.log('播放倍率',state.basePlayRate)
+  }
+}
+
+// 根据当前小节动态设置,右上角展示的速度
+const dynamicShowPlaySpeed = (index: number) => {
+  const item: any = detailState.times[index];
+
+  if (item && modelType.value === "practice" && state.playState === "play" && item.measureSpeed ) {
+    state.playIngSpeed = Math.floor(state.basePlayRate * item.measureSpeed)
+  }
+}
+
 export const refreshIndex = (ctime?: number) => {
   const { osmd }: any = state
   if (osmd && (ctime || state.audiosInstance.audio)) {
@@ -379,6 +404,7 @@ export const refreshIndex = (ctime?: number) => {
     const index = getIndex(detailState.times, currentTimeNum)
     // 监听app返回的ctime
     // console.log(777777777,index,ctime)
+    dynamicShowPlaySpeed(index);
     state.activeIndex = index
     removeRepateBackground(index)
     // console.log(currentTimeNum, index, detailState.times[detailState.times.length - 1]?.endtime)
@@ -613,6 +639,7 @@ let nowTime = 0
 
 let prevTime: number = 0
 
+// 播放中一直触发
 const accelerateRefreshPlayer = () => {
   if (timer || !state.audiosInstance) {
     return
@@ -1062,8 +1089,14 @@ export const noteClick = (evt: MouseEvent) => {
     return
   }
   let activeNote = getNoteBySlursStart(getActtiveNoteByTimes(evt))
+  console.log('点击音符',activeNote)
   if (activeNote) {
     const time = activeNote.sourceStartTime || activeNote.time
+    // 点击音符,动态设置右上角的速度
+    if (activeNote.measureSpeed) {
+      state.speed = Math.floor(state.basePlayRate * activeNote.measureSpeed)
+      state.playIngSpeed = state.speed
+    }
     setCurrentTime(time)
     setStepView(activeNote.i, time)
     detailState.fixedKey = activeNote.realKey

+ 6 - 3
src/subpages/colexiu/buttons/index.tsx

@@ -429,20 +429,23 @@ export default defineComponent({
                       class={[styles.button, styles.hasText, styles.speedButton]}
                       disabled={runtime.evaluatingStatus || runtime.playState === 'play'}
                       onClick={() => {
-                        speedRef.value?.refUpdateSpeed(runtime.speed)
+                        speedRef.value?.refUpdateSpeed(runtime.playIngSpeed || runtime.speed)
                         runtime.speedShow = !runtime.speedShow
                       }}
                     >
                       <ButtonIcon name="speed" />
                       <span>速度</span>
-                      <span class={styles.label}>{runtime.speed}</span>
+                      <span class={styles.label}>{runtime.playIngSpeed || runtime.speed}</span>
                     </Button>
                   ),
                 }}
               >
                 <Speed
                   ref={speedRef}
-                  updateSpeed={(speed: number) => (runtime.speed = speed)}
+                  updateSpeed={(speed: number) => {
+                    runtime.speed = speed
+                    runtime.playIngSpeed = speed
+                  }}
                   changed={RuntimeUtils.changeSpeed}
                   mode={runtime.mode}
                   changeMode={RuntimeUtils.changeMode}

+ 1 - 0
src/subpages/colexiu/buttons/player.tsx

@@ -88,6 +88,7 @@ export default defineComponent({
                           name="play"
                           onClick={() => {
                             console.log('开始播放')
+                            RuntimeUtils.initSetPlayRate();
                             RuntimeUtils.sendParentMessage('play')
                           }}
                         />

+ 1 - 0
src/subpages/colexiu/index.tsx

@@ -263,6 +263,7 @@ export default defineComponent({
       // const freeRate = await useConfigMusicSheetFreeRate()
       // detailState.freeRate = freeRate.value
       useCamera()
+      // 获取详情接口后,初始化右上角的播放速度
       RuntimeUtils.changeSpeed(detailState.activeSpeed)
       if (((detailState.setting?.resets || []) as string[]).includes('SPEED')) {
         if (detailState.activeDetail) {

+ 1 - 1
src/subpages/colexiu/popups/setting/practise.tsx

@@ -24,7 +24,7 @@ export default defineComponent({
       return (
         <div>
           <div class={styles.groupBox}>
-            <Cell center border={false} title="循环播放">
+            <Cell center border={false} title="循环播放2">
               <Switch v-model={SettingState.sett.loop} {...switchProps}>
                 off
               </Switch>