瀏覽代碼

增加formatBeatUnit

skyblued 2 年之前
父節點
當前提交
6255457e5e
共有 2 個文件被更改,包括 84 次插入6 次删除
  1. 11 3
      src/pages/detail/helpers.ts
  2. 73 3
      src/pages/detail/runtime.ts

+ 11 - 3
src/pages/detail/helpers.ts

@@ -215,10 +215,11 @@ export const getAllNodes = (osmd: any) => {
               ? getTimeByBeatUnit(beatUnit, measureSpeed, iterator.currentMeasure.activeTimeSignature.Denominator)
               : baseSpeed) || 1
           let speed = (state.isSpecialBookCategory ? measureSpeed : baseSpeed) || 1
-          console.log('曲谱设置的速度', { isTeshu:state.isSpecialBookCategory, beatSpeed, speed})
+          // console.log('曲谱设置的速度', { isTeshu:state.isSpecialBookCategory, beatSpeed, speed})
           if (i === 0) {
             fixtime += getFixTime(beatSpeed)
           }
+          // console.log({fixtime, relativeTime})
           let noteLength =
             (numerator === 0 && note.isRestFlag ? vRealValue : (wholeValue + numerator) / denominator) *
             vDenominator *
@@ -270,6 +271,7 @@ export const getAllNodes = (osmd: any) => {
           usetime += noteLength
           relaMeasureLength += noteLength
           let relaEndtime = noteLength + relativeTime
+          console.log({noteLength,relativeTime ,relaEndtime, endtime: relaEndtime + fixtime})
           const fixedKey = note.ParentVoiceEntry.ParentVoice.Parent.SubInstruments[0].fixedKey || 0
           // const svgElelent = activeVerticalMeasureList[0]?.vfVoices['1']?.tickables[si]
           const svgElelent = activeVerticalMeasureList[0]?.vfVoices['1']?.tickables[staveNoteIndex]
@@ -586,7 +588,8 @@ export const getIndex = (times: any[], currentTime: Number) => {
   return index
 }
 
-export const getSlursNote = (note: any, pos?: 'start' | 'end') => {
+export const getSlursNote = (_note: any, pos?: 'start' | 'end') => {
+  const note: any = state.times.find((n: any) => n.NoteToGraphicalNoteObjectId == _note.NoteToGraphicalNoteObjectId) || {}
   let itemNote = pos === 'end' ? note.noteElement.slurs[0]?.endNote : note.noteElement.slurs[0]?.startNote
   // console.log("🚀 ~ itemNote", itemNote, note)
   if (!itemNote) return undefined
@@ -729,11 +732,16 @@ export const getDuration = (osmd: any): any => {
     const firstMeasure = osmd?.graphic?.measureList[0][0]
     // console.log(osmd?.graphic?.measureList[0][0]?.parentSourceMeasure)
     if (firstMeasure) {
-      const { duration, tempoInBPM, activeTimeSignature } = firstMeasure?.parentSourceMeasure
+      const { duration, tempoInBPM, activeTimeSignature, TempoExpressions } = firstMeasure?.parentSourceMeasure
       if (duration) {
+        let beatUnit = 'quarter'
+        for (const item of TempoExpressions) {
+          beatUnit = item.InstantaneousTempo.beatUnit || 'quarter'
+        }
         return {
           ...formatDuration(activeTimeSignature, duration),
           tempoInBPM,
+          beatUnit
         }
       }
     }

+ 73 - 3
src/pages/detail/runtime.ts

@@ -49,17 +49,87 @@ export const getFixtimeRelaVal = () => {
   return 0 //(fixtimeRela as any)[(route.params.id || linkId)] || 0
 }
 
+
+export function formatBeatUnit(beatUnit: string) {
+  let multiple = 4
+  switch (beatUnit) {
+    case '1024th':
+      // bpm = bpm;
+      multiple = 1024
+      break
+    case '512th':
+      // divisionsFromNote = (noteDuration / 4) * 512;
+      multiple = 512
+      break
+    case '256th':
+      // divisionsFromNote = (noteDuration / 4) * 256;
+      multiple = 256
+      break
+    case '128th':
+      // divisionsFromNote = (noteDuration / 4) * 128;
+      multiple = 128
+      break
+    case '64th':
+      // divisionsFromNote = (noteDuration / 4) * 64;
+      multiple = 64
+      break
+    case '32nd':
+      // divisionsFromNote = (noteDuration / 4) * 32;
+      multiple = 32
+      break
+    case '16th':
+      // divisionsFromNote = (noteDuration / 4) * 16;
+      multiple = 16
+      break
+    case 'eighth':
+      // divisionsFromNote = (noteDuration / 4) * 8;
+      multiple = 8
+      break
+    case 'quarter':
+      multiple = 4
+      break
+    case 'half':
+      // divisionsFromNote = (noteDuration / 4) * 2;
+      multiple = 2
+      break
+    case 'whole':
+      // divisionsFromNote = (noteDuration / 4);
+      multiple = 1
+      break
+    case 'breve':
+      // divisionsFromNote = (noteDuration / 4) / 2;
+      multiple = 0.5
+      break
+    case 'long':
+      // divisionsFromNote = (noteDuration / 4) / 4;
+      multiple = 0.25
+      break
+    case 'maxima':
+      // divisionsFromNote = (noteDuration / 4) / 8;
+      multiple = 0.125
+      break
+    default:
+      break
+  }
+
+  return multiple
+}
 export const getFixTime = (speed: number) => {
   const duration: any = getDuration(state.osmd)
   let numerator = duration.numerator || 0
   let denominator = duration.denominator || 4
+  const beatUnit = duration.beatUnit || 'quarter'
   if (detailState.repeatedBeats) {
     // 音频制作问题仅2拍不重复
     numerator = numerator === 2 ? 4 : numerator
   }
   // 音频制作问题仅2拍不重复
   // numerator = numerator === 2 ? 4 : numerator
-  const time = !detailState.needTick && !detailState.skipTick ? ((denominator * 60) / speed / denominator) * numerator : 0//5 + getFixtimeRelaVal()
+  //酷乐秀计算方法
+  // const time = !detailState.needTick && !detailState.skipTick ? ((denominator * 60) / speed / denominator) * numerator : 0
+  // 管乐迷计算方法
+  const time = !detailState.needTick && !detailState.skipTick ? (60 / speed * formatBeatUnit(beatUnit)) * (numerator / denominator) : 0
+  // console.log({duration, t:(60 / speed * formatBeatUnit(beatUnit)) * (numerator / denominator), time, numerator,denominator, "duration.numerator": duration.numerator})
   return time
 }
 
@@ -705,8 +775,8 @@ export const toggleState = async (delay?: number) => {
   if (detailState.activeDetail.isAppPlay) {
     await cloudToggleState()
   } else {
-    console.log(detailState.activeDetail)
-    console.log('delay', delay)
+    // console.log(detailState.activeDetail)
+    // console.log('delay', delay)
     state.isFirstPlay = false
     setPlayerView()
     await state.audiosInstance.togglePlay(delay)