Parcourir la source

feat: xml速度和后台设置的速度不一致,增加originAudioPlayRate逻辑

TIANYONG il y a 1 an
Parent
commit
c0ca62bd76

+ 2 - 0
src/pages/detail/helpers.ts

@@ -1125,6 +1125,8 @@ export const formatXML = (xml: string, initInfo?: InitXmlInfo): string => {
 	// 如果谱面和小节都没有打速度,osmd设置的小节速度默认取后台设置的速度
 	if (speeds.length === 0) {
 		;(window as any).baseMeasureSpeed = state.baseSpeed
+	} else {
+		runtime.originAudioPlayRate = speeds[0] / state.baseSpeed
 	}
 	console.log('是否是变速的曲子:',hasVaryingSpeed,speeds)
 

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

@@ -140,6 +140,8 @@ const state = reactive({
   } as {[key: string]: () => void},  
   /** 阶段评测,延迟检测是否检测过 */
   delayCheckFirst: false,  
+  /** xml的速度和后台设置的速度,计算出的基础音频播放倍率 */
+  originAudioPlayRate: 1,  
   /** 开始播放时,记录的mp3播放倍率,用户当前设置的速度/当前小节的速度 */
   basePlayRate: 1,
   /** 播放中,更加当前小节速度动态计算的展示速度 */
@@ -337,8 +339,10 @@ export const changeSpeed = (speed: number, isSave: boolean = true) => {
   // 当前的音符
   const currentItem: any = (detailState.sectionStatus && detailState.section.length === 2) ? detailState.befireSection || detailState.section[0] : detailState.times[state.activeIndex];
   state.basePlayRate = currentItem?.measureSpeed ? state.speed / currentItem.measureSpeed : state.speed / detailState.baseSpeed;
+  const actualRate = state.originAudioPlayRate * state.basePlayRate;
   if (!detailState.activeDetail) return
-  state.audiosInstance?.setSpeed(state.basePlayRate)
+  state.audiosInstance?.setSpeed(actualRate)
+  console.log('速度设置',speed,isSave,'小节计算的倍率',state.basePlayRate,'实际播放倍率',actualRate)
   promisefiyPostMessage({
     api: 'cloudChangeSpeed',
     content: {

+ 6 - 6
src/subpages/colexiu/buttons/evaluating.tsx

@@ -322,7 +322,7 @@ export const formatPitch = (num?: number): number => {
 let starTime = 0
 const formatTimes = () => {
   // const rate = runtime.speed / detailState.baseSpeed //1
-  const rate = runtime.basePlayRate; // 播放倍率
+  const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
   console.log('评测倍率123',rate)
   actualBeatLength = Math.round(detailState.times[0].fixtime * 1000 / rate)
   const difftime = detailState.times?.[0]?.difftime || 0
@@ -389,7 +389,7 @@ const formatTimes = () => {
     const item = times[index]
     const note = getNoteByMeasuresSlursStart(item)
     // const rate = runtime.speed / detailState.baseSpeed //1
-    const rate = runtime.basePlayRate; // 播放倍率
+    const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
     const start = difftime + (item.sourceRelativeTime || item.relativeTime) - starTime
     const end = difftime + (item.sourceRelaEndtime || item.relaEndtime) - starTime
     // console.log(start, end, starTime)
@@ -459,7 +459,7 @@ const connect = async () => {
   const search = useOriginSearch()
   connentLoading.value = true
   const behaviorId = sessionStorage.getItem('behaviorId') || search.behaviorId || initBehaviorId
-  const rate = runtime.speed / detailState.baseSpeed //1
+  const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
   calculateInfo = formatTimes()
   detailState.firstNoteTime = calculateInfo.firstNoteTime;
   const content = {
@@ -483,7 +483,7 @@ const connect = async () => {
     // beatLength: Math.round((RuntimeUtils.getFixTime(detailState.times[0].beatSpeed) * 1000) / rate),
     beatLength: actualBeatLength,
     evaluationCriteria: getEvaluationCriteria(),
-    speedRate: parseFloat(runtime.basePlayRate.toFixed(2)), // 播放倍率
+    speedRate: parseFloat(rate.toFixed(2)), // 播放倍率
   }
   // console.log("🚀 ~ content:", content, rate)
   const clientType = useClientType()
@@ -720,14 +720,14 @@ const evaluatStart = () => {
     RuntimeUtils.setCaptureMode()
   }
   console.log('开始录音', new Date().getTime())
-  
+  const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
   postMessage(
     {
       api: 'startRecording',
       content: {
         accompanimentState: SettingState.eva.mute ? 1 : 0,
         firstNoteTime: calculateInfo.firstNoteTime || 0,
-        speedRate: parseFloat(runtime.basePlayRate.toFixed(2)), // 播放倍率
+        speedRate: parseFloat(rate.toFixed(2)), // 播放倍率
       }
     },
     () => {

+ 2 - 1
src/subpages/colexiu/popups/evaluating/content.tsx

@@ -144,8 +144,9 @@ export default defineComponent({
     // 播放倍率不等于1,或者是选段评测,APP暂时不支持保存演奏,需要给出提示
     const noSaveTips = computed(() => {
       let tipContent = '';
+      const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
       if (isUnitTest || detailState.section.length === 2 || detailState.activeDetail.isAppPlay || runtime.basePlayRate != 1 || !runtime.songs.background) {
-        tipContent = isUnitTest ? '单元测验暂不支持保存作品噢~' : (!runtime.songs.background || detailState.activeDetail.isAppPlay) ? '该曲目暂不支持保存作品噢~' : detailState.section.length === 2 ? '选段后暂不支持保存作品噢~' : runtime.basePlayRate != 1 ? '调速后暂不支持保存作品噢~' : '';
+        tipContent = isUnitTest ? '单元测验暂不支持保存作品噢~' : (!runtime.songs.background || detailState.activeDetail.isAppPlay) ? '该曲目暂不支持保存作品噢~' : detailState.section.length === 2 ? '选段后暂不支持保存作品噢~' : rate != 1 ? '调速后暂不支持保存作品噢~' : '';
       }
       return tipContent
     })

+ 2 - 1
src/subpages/colexiu/popups/evaluating/index.tsx

@@ -99,12 +99,13 @@ export default defineComponent({
         confirmShow.value = true
       } else {
         if (props.data?.recordIdStr) {
+          const rate = runtime.basePlayRate * runtime.originAudioPlayRate; // 播放倍率
           // 上传云端
           api_openAdjustRecording({
             recordId: String(props.data?.recordIdStr),
             title: detailState.activeDetail?.musicSheetName || "曲谱演奏",
             coverImg: detailState.activeDetail?.titleImg || '',
-            speedRate: parseFloat(runtime.basePlayRate.toFixed(2)), // 播放倍率
+            speedRate: parseFloat(rate.toFixed(2)), // 播放倍率
             // firstNoteTime: detailState.firstNoteTime,
           });
         }