فهرست منبع

Merge branch 'gyt-feature-tianyong' of http://git.dayaedu.com/liushengqiang/orchestra-music-score into feature-pc-choose

TIANYONG 9 ماه پیش
والد
کامیت
540ff5e1ae

+ 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 里面最后的文字重叠问题,向后偏移

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/bg.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/left_ adorn.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/right_ adorn.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/step1_icon.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/step2_icon.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/step3_icon.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/step4_icon.json


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
src/pages/detail/CheckDelayPopup/image/step5_icon.json


+ 39 - 2
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,8 +311,12 @@ export const changeSpeed = (speed: number, isSave: boolean = true) => {
     store.set('speeds', speeds)
   }
   state.speed = speed
+  state.playIngSpeed = speed
+  // 当前的音符
+  const currentItem: any = detailState.times[state.activeIndex];
+  state.basePlayRate = currentItem?.measureSpeed ? state.speed / currentItem.measureSpeed : state.speed / detailState.baseSpeed;
   if (!detailState.activeDetail) return
-  state.audiosInstance?.setSpeed(speed / detailState.baseSpeed)
+  state.audiosInstance?.setSpeed(state.basePlayRate)
   promisefiyPostMessage({
     api: 'cloudChangeSpeed',
     content: {
@@ -368,6 +376,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 +407,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 +642,7 @@ let nowTime = 0
 
 let prevTime: number = 0
 
+// 播放中一直触发
 const accelerateRefreshPlayer = () => {
   if (timer || !state.audiosInstance) {
     return
@@ -1061,9 +1091,16 @@ export const noteClick = (evt: MouseEvent) => {
     Toast('开始播放后才能调整进度')
     return
   }
+  state.speedShow = false;
   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

+ 1 - 1
src/pages/detail/section-box/index.tsx

@@ -297,7 +297,7 @@ export default defineComponent({
           const boundingBox = getBoundingBoxByverticalNote(item)
           let X: number | undefined = undefined
           try {
-            const bbox = item.svgElelent.bbox || item.svgElelent?.getBoundingBox()
+            const bbox = item.svgElelent?.bbox || item.svgElelent?.getBoundingBox && item.svgElelent?.getBoundingBox()
             X = formatZoom(bbox?.x || (index === 0 ? boundingBox.start_x : boundingBox.end_x))
           } catch (error) {
             console.log(error)

+ 27 - 7
src/pages/detail/speed.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, reactive, ref, toRefs } from 'vue'
+import { defineComponent, reactive, ref, toRefs, watch } from 'vue'
 import { Button, Slider } from 'vant'
 import classnames from 'classnames'
 import detailState from '/src/pages/detail/state'
@@ -7,10 +7,12 @@ import styles from './speed.module.less'
 import iconMinus from './icons/icon-minus.svg'
 import iconPlus from './icons/icon-plus.svg'
 import iconresetMinus from './icons/icon-resetMinus.svg'
+import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
 
 const state = reactive({
   speed: 90,
   showHint: false,
+  maxSpeed: 315,
 })
 
 export default defineComponent({
@@ -53,11 +55,14 @@ export default defineComponent({
 
     const updateSpeed = (speed: number) => {
       state.speed = speed
+      state.speed = Math.min(state.speed, 270)
+      state.speed = Math.max(state.speed, 45)
       props.updateSpeed(state.speed)
     }
 
     const minusSpeed = () => {
       state.speed = Math.max(state.speed - 1, 45)
+      state.speed = Math.min(state.speed, 270)
       props.changed(state.speed)
     }
 
@@ -66,6 +71,17 @@ export default defineComponent({
       props.changed(state.speed)
     }
 
+    watch(
+      () => runtime.speed,
+      (val) => {
+        if (val) {
+          state.maxSpeed = runtime.speed > 270 ? runtime.speed + 45 : 315;
+          //console.log('速度123456',state.maxSpeed,runtime.speed,runtime.playIngSpeed)
+        }
+      },
+      { immediate: true }
+    )
+
     return () => (
       <div class={styles['speed-change']}>
         <div class={styles.speed}>
@@ -77,21 +93,25 @@ export default defineComponent({
               type="primary"
               size="mini"
               round
-              disabled={state.speed == 270}
+              disabled={state.speed >= 270}
               onClick={plusSpeed}
             />
             <Slider
               class={styles.slider}
-              max={270}
+              max={runtime.playIngSpeed > 270 ? runtime.playIngSpeed : 270}
               min={45}
               barHeight="3px"
               buttonSize="18px"
-              modelValue={315 - state.speed}
-              onUpdate:modelValue={(speed: number) => updateSpeed(315 - speed)}
+              modelValue={state.maxSpeed - state.speed}
+              onUpdate:modelValue={(speed: number) => {
+                // console.log('速度123',state.maxSpeed,speed,runtime.playIngSpeed,runtime.speed)
+                const currentSpeed = (runtime.playIngSpeed > 270 ? runtime.playIngSpeed + 45 : state.maxSpeed) - speed
+                updateSpeed(currentSpeed)
+              }}
               step="1"
               vertical
               activeColor="#ebedf0"
-              onChange={(speed: number) => changeSpeed(315 - speed)}
+              onChange={(speed: number) => changeSpeed(state.maxSpeed - speed)}
               onDragStart={onDragStart}
               onDragEnd={onDragEnd}
               vSlots={{
@@ -112,7 +132,7 @@ export default defineComponent({
               type="primary"
               size="mini"
               round
-              disabled={state.speed == 45}
+              disabled={state.speed <= 45}
               onClick={minusSpeed}
             />
             <Button

+ 7 - 4
src/subpages/colexiu/buttons/index.tsx

@@ -429,24 +429,27 @@ 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}
-                  lib={{ speed: runtime.speed }}
+                  lib={{ speed: runtime.playIngSpeed || runtime.speed }}
                   class={styles.speed}
                 />
               </Popover>

+ 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) {

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است