Browse Source

Merge branch 'feature-tianyong-newVersion' of http://git.dayaedu.com/liushengqiang/music-score into hqyDevNewVersion

黄琪勇 11 months ago
parent
commit
f2751318a2

+ 1 - 1
osmd-extended

@@ -1 +1 @@
-Subproject commit bab1ca04065946e20f10fa1aacdb0c25b533a6f2
+Subproject commit 04cdcc6b47b35e95857ea00f870814b61dd8e78a

+ 22 - 0
src/helpers/formateMusic.ts

@@ -616,6 +616,22 @@ export const formatZoom = (num = 1) => {
 	return num * state.zoom;
 	return num * state.zoom;
 };
 };
 
 
+/** 妙极客多分轨的曲子,可能没有part-name标签,需要手动加上该标签 */
+export const xmlAddPartName = (xml: string) => {
+	if (!xml) return "";
+	const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
+	const scoreParts = Array.from(xmlParse.getElementsByTagName("score-part"));
+	for (const scorePart of scoreParts) {
+		if (scorePart.getElementsByTagName("part-name").length === 0) {
+			const name = scorePart.getAttribute("id") || "";
+			const newPartName = `<part-name>${name}</part-name>`
+			// scorePart.prepend(newPartName);
+			scorePart.innerHTML = newPartName + scorePart.innerHTML;
+		}
+	}
+	return new XMLSerializer().serializeToString(xmlParse);
+}
+
 /** 格式化曲谱
 /** 格式化曲谱
  * 1.全休止符的小节,没有音符默认加个全休止符
  * 1.全休止符的小节,没有音符默认加个全休止符
  */
  */
@@ -624,6 +640,12 @@ export const formatXML = (xml: string, xmlUrl?: string): string => {
 	
 	
 	const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
 	const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
 
 
+	// 声调
+	const fifths = xmlParse.getElementsByTagName("fifths");
+	if (fifths && fifths.length) {
+		// 是否是C调
+		state.isCTone = fifths[0].textContent === '0'
+	}
 	const measures = Array.from(xmlParse.getElementsByTagName("measure"));
 	const measures = Array.from(xmlParse.getElementsByTagName("measure"));
 	const minutes: any = xmlParse.getElementsByTagName("per-minute");
 	const minutes: any = xmlParse.getElementsByTagName("per-minute");
 	let speeds: any = []
 	let speeds: any = []

+ 16 - 2
src/page-instrument/header-top/index.tsx

@@ -9,7 +9,7 @@ import { Badge, Circle, Popover, Popup, showConfirmDialog, showToast, NoticeBar
 import Speed from "./speed";
 import Speed from "./speed";
 import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
 import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
 import Settting from "./settting";
 import Settting from "./settting";
-import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, IPlayState, refreshMusicSvg } from "/src/state";
+import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, IPlayState, refreshMusicSvg, EnumMusicRenderType } from "/src/state";
 import { getAudioCurrentTime } from "/src/view/audio-list";
 import { getAudioCurrentTime } from "/src/view/audio-list";
 import { followData, toggleFollow } from "/src/view/follow-practice";
 import { followData, toggleFollow } from "/src/view/follow-practice";
 import { api_back } from "/src/helpers/communication";
 import { api_back } from "/src/helpers/communication";
@@ -905,7 +905,21 @@ export default defineComponent({
             playBtn.value.disabled && styles.disabled,
             playBtn.value.disabled && styles.disabled,
             state.platform === IPlatform.PC && state.musicScoreBtnDirection === "left" ? styles.playLeftButton : state.platform === IPlatform.PC && state.musicScoreBtnDirection === "right" ? styles.playRightButton : "",
             state.platform === IPlatform.PC && state.musicScoreBtnDirection === "left" ? styles.playLeftButton : state.platform === IPlatform.PC && state.musicScoreBtnDirection === "right" ? styles.playRightButton : "",
           ]}
           ]}
-          onClick={() => togglePlay(state.playState === "play" ? "paused" : "play")}
+          onClick={() => {
+            // C调能播放唱名,非C调时,只有谱面类型是首调时,才能播放唱名
+            if (!state.isCTone && state.playSource === 'mingSong') {
+              const notPlayDesc = state.musicRenderType === EnumMusicRenderType.staff ? '该曲目的五线谱目前还不支持播放唱名' : state.musicRenderType === EnumMusicRenderType.fixedTone ? '该曲目的固定调目前还不支持播放唱名' : '';
+              if (notPlayDesc) {
+                showToast({
+                  message: notPlayDesc,
+                  position: "top",
+                  className: "selectionToast",
+                });
+                return
+              }
+            }
+            togglePlay(state.playState === "play" ? "paused" : "play")
+          }}
         >
         >
           <div class={styles.btnWrap}>
           <div class={styles.btnWrap}>
             <img style={{ display: state.playState === "play" ? "none" : "" }} class={styles.iconBtn} src={headImg("icon_play.png")} />
             <img style={{ display: state.playState === "play" ? "none" : "" }} class={styles.iconBtn} src={headImg("icon_play.png")} />

+ 6 - 3
src/state.ts

@@ -10,7 +10,7 @@ import { audioListStart, getAudioCurrentTime, getAudioDuration, setAudioCurrentT
 import { toggleFollow } from "./view/follow-practice";
 import { toggleFollow } from "./view/follow-practice";
 import { browser, setStorageSpeed, setGlobalData } from "./utils";
 import { browser, setStorageSpeed, setGlobalData } from "./utils";
 import { api_cloudGetMediaStatus, api_createMusicPlayer, api_cloudChangeSpeed, api_cloudSuspend, api_cloudSetCurrentTime, api_cloudDestroy } from "./helpers/communication";
 import { api_cloudGetMediaStatus, api_createMusicPlayer, api_cloudChangeSpeed, api_cloudSuspend, api_cloudSetCurrentTime, api_cloudDestroy } from "./helpers/communication";
-import { verifyCanRepeat, getDuration } from "./helpers/formateMusic";
+import { verifyCanRepeat, getDuration, xmlAddPartName } from "./helpers/formateMusic";
 import { getMusicSheetDetail } from "./utils/baseApi"
 import { getMusicSheetDetail } from "./utils/baseApi"
 import { getQuery } from "/src/utils/queryString";
 import { getQuery } from "/src/utils/queryString";
 import { followData, skipNotePractice } from "/src/view/follow-practice/index"
 import { followData, skipNotePractice } from "/src/view/follow-practice/index"
@@ -560,6 +560,8 @@ const state = reactive({
   workSectionNeedReset: false,
   workSectionNeedReset: false,
   /** 旋律线开关 */
   /** 旋律线开关 */
   melodyLine: true,
   melodyLine: true,
+  /** 是否是C调,切换到唱名时,只有C调所有的谱面类型都可以播放唱名文件;其它调的只有首调可以播放唱名,因为唱名是按照C调制作的,没有其它调的唱名文件 */
+  isCTone: false,
 });
 });
 const browserInfo = browser();
 const browserInfo = browser();
 let offset_duration = 0;
 let offset_duration = 0;
@@ -1057,7 +1059,7 @@ export const getNote = (currentTime: number) => {
   const len = state.times.length;
   const len = state.times.length;
   /** 播放超过了最后一个音符的时间,直接结束, 2秒误差 */
   /** 播放超过了最后一个音符的时间,直接结束, 2秒误差 */
   if (currentTime > times[len - 1].endtime + 2 && !state.isAppPlay && !state.isSimplePage) {
   if (currentTime > times[len - 1].endtime + 2 && !state.isAppPlay && !state.isSimplePage) {
-    onEnded();
+    // onEnded();
     return;
     return;
   }
   }
   let _item = null as any;
   let _item = null as any;
@@ -1339,7 +1341,8 @@ const getMusicInfo = async (res: any) => {
   state.defaultScoreRender = res.data?.defaultScoreRender
   state.defaultScoreRender = res.data?.defaultScoreRender
   const partIndex = query["part-index"] ? parseInt(query["part-index"]) : -1 // -1为partIndex没有值的时候
   const partIndex = query["part-index"] ? parseInt(query["part-index"]) : -1 // -1为partIndex没有值的时候
   /* 获取声轨列表 */
   /* 获取声轨列表 */
-  const xmlString = await fetch(res.data.xmlFileUrl).then((response) => response.text());
+  let xmlString = await fetch(res.data.xmlFileUrl).then((response) => response.text());
+  xmlString = xmlAddPartName(xmlString);
   downloadXmlStr.value = xmlString //给musice-score 赋值xmlString 以免加载2次
   downloadXmlStr.value = xmlString //给musice-score 赋值xmlString 以免加载2次
   const tracks = xmlToTracks(xmlString) //获取声轨列表
   const tracks = xmlToTracks(xmlString) //获取声轨列表
   // 设置音源  track 为当前的声轨 index为当前的
   // 设置音源  track 为当前的声轨 index为当前的

+ 1 - 0
src/view/music-score/index.tsx

@@ -148,6 +148,7 @@ export default defineComponent({
 			}
 			}
 			osmd.EngravingRules.DYMusicScoreId = state.examSongId || ''
 			osmd.EngravingRules.DYMusicScoreId = state.examSongId || ''
 			osmd.EngravingRules.DYCustomRepeatCount = state.maxLyricNum || 0;
 			osmd.EngravingRules.DYCustomRepeatCount = state.maxLyricNum || 0;
+			osmd.EngravingRules.DYIsSingleLine = state.isSingleLine;
 			await osmd.load(musicData.score);
 			await osmd.load(musicData.score);
 			// 对外暴露 一行谱时候 缩小谱面
 			// 对外暴露 一行谱时候 缩小谱面
 			if(state.isSimplePage){
 			if(state.isSimplePage){

+ 2 - 2
vite.config.ts

@@ -76,8 +76,8 @@ export default defineConfig({
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
         // target: "https://test.lexiaoya.cn",
         // target: "https://test.lexiaoya.cn",
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
-        // target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
-        target: "https://test.kt.colexiu.com",
+        target: "https://test.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
+        // target: "https://test.kt.colexiu.com",
         //target: "https://mec.colexiu.com",
         //target: "https://mec.colexiu.com",
         changeOrigin: true,
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),
         rewrite: (path) => path.replace(/^\/instrument/, ""),