فهرست منبع

支持总谱渲染

黄琪勇 11 ماه پیش
والد
کامیت
3fa39dd6f1
2فایلهای تغییر یافته به همراه81 افزوده شده و 28 حذف شده
  1. 79 28
      src/state.ts
  2. 2 0
      src/view/plugins/toggleMusicSheet/index.tsx

+ 79 - 28
src/state.ts

@@ -489,6 +489,8 @@ const state = reactive({
   isScoreRender: false,  
   /** 是否默认显示总谱 */
   defaultScoreRender: false,
+  /** 没有音源字段 */
+  noMusicSource: false,
   /** 小节的持续时长,以后台设置的播放速度计算 */
   measureTime: 0,
   /** 跟练模式,节拍器播放的时间 */
@@ -1320,17 +1322,20 @@ export const getMusicDetail = async (id: string, type?: string) => {
 
 
 const getMusicInfo = async (res: any) => {
+  // 是否支持总谱
+  state.isScoreRender = res.data?.isScoreRender
+  // 是否默认显示总谱
+  state.defaultScoreRender = res.data?.defaultScoreRender
+  const partIndex = query["part-index"] ? parseInt(query["part-index"]) : -1 // -1为partIndex没有值的时候
+  /* 获取声轨列表 */
   const xmlString = await fetch(res.data.xmlFileUrl).then((response) => response.text());
   downloadXmlStr.value = xmlString //给musice-score 赋值xmlString 以免加载2次
   const tracks = xmlToTracks(xmlString) //获取声轨列表
-  let index = query["part-index"] ? parseInt(query["part-index"]) : 0
-  const musicObj = state.isSimplePage ? {} : initMusicSource(res.data, tracks[index]) //当前part-index找不到声源的时候以第一个为准
-  index = tracks.findIndex(item => {  // 筛选出当前的index
-    return item === musicObj?.track
-  })
+  // 设置音源  track 为当前的声轨 index为当前的
+  const { track, index } = state.isSimplePage ? { track:tracks[0], index:0} : initMusicSource(res.data, tracks, partIndex)
   const musicInfo = {
     ...res.data,
-    track: musicObj?.track
+    track
   };
   console.log("🚀 ~ musicInfo:", musicInfo);
   setState(musicInfo, index);
@@ -1348,13 +1353,14 @@ function xmlToTracks(xmlString: string) {
   }, []);
 }
 // 设置音源
-function initMusicSource(data: any, track?: string) {
+function initMusicSource(data: any, tracks: string[], partIndex: number) {
+  let track:string,index:number
   const { instrumentId } = storeData.user
   let { musicSheetType, isAllSubject, musicSheetSoundList, musicSheetAccompanimentList } = data
   musicSheetSoundList || (musicSheetSoundList = [])
   musicSheetAccompanimentList || (musicSheetAccompanimentList = [])
   let musicObj, accompanyObj, fanSongObj, banSongObj
-  // 独奏
+   /* 独奏 */
   if (musicSheetType === "SINGLE") {
     // 适用声部(isAllSubject)为true 时候没有乐器只有一个原音;当前用户有乐器就匹配  不然取第一个原音
     musicObj = musicSheetSoundList.find((item: any) => {
@@ -1370,22 +1376,70 @@ function initMusicSource(data: any, track?: string) {
     banSongObj = musicSheetAccompanimentList.find((item: any) => {
       return item.audioPlayType === "SING"
     })
+    accompanyObj = musicSheetAccompanimentList.find((item: any) => {
+      return item.audioPlayType === "PLAY"
+    })
+    track = musicObj.track   //没有原音的时候track为空 不显示指法
+    index = tracks.findIndex(item => {
+      return item === track
+    })
   } else {
-    // 合奏  合奏根据声轨来区分原音
-    musicObj = track ? musicSheetSoundList.find((item: any) => {
-      return item.track === track
-    }) : musicSheetSoundList[0]
+    /* 合奏 */
+    // 支持总谱 并且当前是总谱。partIndex是999时候,或者默认是总谱并且partIndex为-1时候  -1就是partIndex没有值
+    if(state.isScoreRender && (partIndex===999 || (state.defaultScoreRender && partIndex===-1))){
+        // 总谱渲染
+        state.isCombineRender = true
+        state.partListNames = tracks
+        banSongObj = musicSheetAccompanimentList.find((item: any) => {
+          return item.audioPlayType === "SING"
+        })
+        // 先取scoreAudioFileUrl的值
+        if(banSongObj?.scoreAudioFileUrl){
+          banSongObj.audioFileUrl = banSongObj.scoreAudioFileUrl
+          banSongObj.audioBeatMixUrl = banSongObj.scoreAudioBeatMixUrl
+        }
+        accompanyObj = musicSheetAccompanimentList.find((item: any) => {
+          return item.audioPlayType === "PLAY"
+        })
+        // 先取scoreAudioFileUrl的值
+        if(accompanyObj?.scoreAudioFileUrl){
+          accompanyObj.audioFileUrl = accompanyObj.scoreAudioFileUrl
+          accompanyObj.audioBeatMixUrl = accompanyObj.scoreAudioBeatMixUrl
+        }
+        track = "总谱"
+        index = 999
+    }else{
+      // 合奏只显示一个声轨
+      track = tracks[partIndex===-1?0:partIndex]
+      // 根据当前的声轨 取数据
+      musicObj = musicSheetSoundList.find((item: any) => {
+        return item.audioPlayType === "PLAY" && item.track === track
+      })
+      fanSongObj = musicSheetSoundList.find((item: any) => {
+        return item.audioPlayType === "SING" && item.track === track
+      })
+      banSongObj = musicSheetAccompanimentList.find((item: any) => {
+        return item.audioPlayType === "SING"
+      })
+      accompanyObj = musicSheetAccompanimentList.find((item: any) => {
+        return item.audioPlayType === "PLAY"
+      })
+      index = tracks.findIndex(item => {
+        return item === track
+      })
+    }
   }
-  accompanyObj = musicSheetAccompanimentList.find((item: any) => {
-    return item.audioPlayType === "PLAY"
-  })
   // 当没有任何曲目的时候报错
-  if (!musicObj?.audioFileUrl && !accompanyObj?.audioFileUrl && !fanSongObj?.audioFileUrl && !banSongObj?.audioFileUrl && !fanSongObj?.solmizationFileUrl) {
-    // 并且是midi没有midi文件的时候
-    if(data.playMode === "MIDI" && !data.midiFileUrl) {
-      // 是预览的时候 不报错
-      if(!query.isPreView){
-        throw new Error("该曲目无任何音源");
+  if (!musicObj?.audioFileUrl && !accompanyObj?.audioFileUrl && !fanSongObj?.audioFileUrl && !banSongObj?.audioFileUrl && !fanSongObj?.solmizationFileUrl && !fanSongObj?.femaleSolmizationFileUrl) {
+    state.noMusicSource = true // 没有音源文件
+    // 独奏的时候
+    if(musicSheetType === "SINGLE"){
+      // 并且是midi没有midi文件的时候
+      if(data.playMode === "MIDI" && !data.midiFileUrl) {
+        // 是预览的时候 不报错
+        if(!query.isPreView){
+          throw new Error("该曲目无任何音源");
+        }
       }
     }
   }
@@ -1415,7 +1469,10 @@ function initMusicSource(data: any, track?: string) {
     state.beatSong.mingSong = fanSongObj?.solmizationBeatUrl
     state.beatSong.mingSongGirl = fanSongObj?.femaleSolmizationBeatUrl
   }
-  return musicObj
+  return {
+    index,
+    track
+  }
 }
 const setState = (data: any, index: number) => {
   // 根据当前文件有没有 设置当前的播放模式
@@ -1462,12 +1519,6 @@ const setState = (data: any, index: number) => {
   state.cbsExamSongId = data.id + "";
   state.examSongName = data.name;
   state.coverImg = data.musicCover ?? "";
-  // 是否支持总谱
-  state.isScoreRender = data.isScoreRender
-  // 是否默认显示总谱
-  state.defaultScoreRender = data.defaultScoreRender
-  // 单声部多声轨合并展示
-  state.isCombineRender = data.musicSheetType === "SINGLE" && data.musicSheetSoundList?.length > 1
   // 如果是simple页面,只显示单轨
   if (state.isSimplePage) {
     state.isCombineRender = false;

+ 2 - 0
src/view/plugins/toggleMusicSheet/index.tsx

@@ -38,6 +38,8 @@ export default defineComponent({
           canselect
         }
       }).filter((item: any) => item.canselect).sort((a: any, b: any) => a.sortId - b.sortId)
+      // 支持总谱渲染的时候 加上总谱字段
+      state.isScoreRender && arr.unshift({canselect:true, sortId:999, text: "总谱", value: 999})
       return arr
     })