|
@@ -17,13 +17,14 @@ import { followData, skipNotePractice } from "/src/view/follow-practice/index"
|
|
|
import { changeSongSourceByBeat } from "/src/view/audio-list"
|
|
|
import { moveSmoothAnimation, smoothAnimationState, moveSmoothAnimationByPlayTime, moveTranslateXNum, destroySmoothAnimation, calcClientWidth } from "/src/page-instrument/view-detail/smoothAnimation"
|
|
|
import { storeData } from "/src/store";
|
|
|
-import { downloadXmlStr } from "./view/music-score"
|
|
|
+import { downloadXmlStr, xmlDocRef } from "./view/music-score"
|
|
|
import { musicScoreRef, headerColumnHide } from "/src/page-instrument/view-detail/index"
|
|
|
import { headTopData } from "/src/page-instrument/header-top/index";
|
|
|
import { api_lessonTrainingTrainingStudentDetail } from "/src/page-instrument/api"
|
|
|
import { undoData, moveData } from "/src/view/plugins/move-music-score"
|
|
|
import { HANDLE_WORK_ADD } from "/src/page-instrument/custom-plugins/work-index";
|
|
|
import { speedBeatTo, unitImgs } from "/src/helpers/beatConfig"
|
|
|
+import IndexedDBService from "/src/utils/indexedDB";
|
|
|
import { musicalInstrumentCodeInfo, instruments, fixInstrumentNameCode } from "/src/constant/instruments";
|
|
|
|
|
|
const query: any = getQuery();
|
|
@@ -352,7 +353,7 @@ const state = reactive({
|
|
|
// 加载条
|
|
|
isLoading: true,
|
|
|
/** 加载中的文案 */
|
|
|
- loadingText: '音频资源加载中,请稍后…',
|
|
|
+ loadingText: '资源加载中,请稍后…',
|
|
|
/** 是否是简单的单行谱模式页面 */
|
|
|
isSimplePage: false,
|
|
|
/** xml的速度和后台设置的速度,计算出的基础音频播放倍率 */
|
|
@@ -398,6 +399,8 @@ const state = reactive({
|
|
|
isWebAudit: false,
|
|
|
/** 是否是单声轨多声部的声轨 */
|
|
|
isSingleMutliTrack: false,
|
|
|
+ /** 是否是来源于缓存的xml */
|
|
|
+ xmlFromStore: false,
|
|
|
});
|
|
|
const browserInfo = browser();
|
|
|
let offset_duration = 0;
|
|
@@ -664,7 +667,7 @@ export const skipNotePlay = async (itemIndex: number, isStart = false, handType?
|
|
|
export const togglePlay = async (playState: "play" | "paused", isForceCLoseToast?:boolean) => {
|
|
|
// 如果mp3资源还在加载中,给出提示
|
|
|
if (!state.isAppPlay && !state.audioDone) {
|
|
|
- if (!isForceCLoseToast) showToast('音频资源加载中,请稍后')
|
|
|
+ if (!isForceCLoseToast) showToast('资源加载中,请稍后')
|
|
|
return
|
|
|
}
|
|
|
// 播放之前 当为评测模式和不为MIDI时候按 是否禁用节拍器 切换音源
|
|
@@ -1282,6 +1285,25 @@ const initInstrumentCode = async () => {
|
|
|
// console.log('声轨codes',instruments)
|
|
|
}
|
|
|
|
|
|
+// 判断有没有xml缓存,有则直接使用
|
|
|
+const queryMusicXml = async (id: string, xmlUr: string) => {
|
|
|
+ let xmlString = ''
|
|
|
+ const dbService = new IndexedDBService("MyDatabase", "MyStore");
|
|
|
+ console.time('缓存获取xml')
|
|
|
+ const storeXmlData: any = await dbService.get(id).then((data) => data );
|
|
|
+ if (storeXmlData && storeXmlData.xmlString) {
|
|
|
+ xmlString = storeXmlData && storeXmlData.xmlString
|
|
|
+ state.xmlFromStore = true;
|
|
|
+ console.timeEnd('缓存获取xml')
|
|
|
+ // 使用完后删除数据
|
|
|
+ dbService.delete(id)
|
|
|
+ } else {
|
|
|
+ state.xmlFromStore = false;
|
|
|
+ xmlString = await fetch(xmlUr).then((response) => response.text());
|
|
|
+ }
|
|
|
+ return xmlString;
|
|
|
+}
|
|
|
+
|
|
|
const getMusicInfo = async (res: any) => {
|
|
|
try {
|
|
|
await initInstrumentCode()
|
|
@@ -1292,10 +1314,11 @@ const getMusicInfo = async (res: any) => {
|
|
|
state.isScoreRender = res.data?.isScoreRender
|
|
|
// 是否默认显示总谱
|
|
|
state.defaultScoreRender = res.data?.defaultScoreRender
|
|
|
- /* 获取声轨列表 */
|
|
|
- let xmlString = await fetch(res.data.xmlFileUrl).then((response) => response.text());
|
|
|
+ // let xmlString = await fetch(res.data.xmlFileUrl).then((response) => response.text());
|
|
|
+ let xmlString: string = await queryMusicXml(res.data.bizId + "", res.data.xmlFileUrl);
|
|
|
xmlString = xmlAddPartName(xmlString);
|
|
|
downloadXmlStr.value = xmlString //给musice-score 赋值xmlString 以免加载2次
|
|
|
+ /* 获取声轨列表 */
|
|
|
const tracks = xmlToTracks(xmlString) //获取声轨列表
|
|
|
// 是否显示节拍器 (管乐迷 默认显示节拍器)
|
|
|
state.isMixBeat = res.data?.isMixBeat
|
|
@@ -1355,9 +1378,14 @@ const getMusicInfo = async (res: any) => {
|
|
|
};
|
|
|
//获取xml中的音轨数据
|
|
|
function xmlToTracks(xmlString: string) {
|
|
|
- const xmlParse = new DOMParser().parseFromString(xmlString, "text/xml");
|
|
|
- const partNames = Array.from(xmlParse.getElementsByTagName('part-name'));
|
|
|
- return partNames.reduce((arr: string[], item) => {
|
|
|
+ //console.time('domparse')
|
|
|
+ // console.time('解析xml 耗时1')
|
|
|
+ // const xmlParse = new DOMParser().parseFromString(xmlString, "text/xml");
|
|
|
+ const xmlParse = xmlDocRef.value;
|
|
|
+ // console.timeEnd('解析xml 耗时1')
|
|
|
+ //console.timeEnd('domparse')
|
|
|
+ const partNames = xmlParse ? Array.from(xmlParse.getElementsByTagName('part-name')) : [];
|
|
|
+ return partNames.reduce((arr: string[], item: any) => {
|
|
|
const textContent = item?.textContent?.trim()
|
|
|
if (textContent?.toLocaleLowerCase() === "common") {
|
|
|
(window as any).HasCommonTrack = true;
|