|
@@ -48,6 +48,8 @@ import { addWatermark, convasToImg, imgToCanvas } from './imageFunction';
|
|
import ChangeVoice from './change-voice';
|
|
import ChangeVoice from './change-voice';
|
|
import { storage } from '@/helpers/storage';
|
|
import { storage } from '@/helpers/storage';
|
|
import { ACCESS_TOKEN } from '@/store/mutation-types';
|
|
import { ACCESS_TOKEN } from '@/store/mutation-types';
|
|
|
|
+import { sortMusical, getInstrumentName } from '@/helpers/utils'
|
|
|
|
+
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
name: 'co-ai',
|
|
name: 'co-ai',
|
|
setup() {
|
|
setup() {
|
|
@@ -98,7 +100,8 @@ export default defineComponent({
|
|
vipMember: state.user.data?.vipMember,
|
|
vipMember: state.user.data?.vipMember,
|
|
subjectStatus: false,
|
|
subjectStatus: false,
|
|
subjectList: [],
|
|
subjectList: [],
|
|
- subjectItem: {} as any // 当前乐器
|
|
|
|
|
|
+ subjectItem: {} as any, // 当前乐器,
|
|
|
|
+ trackList: [] as any, // 可筛选的分轨信息
|
|
});
|
|
});
|
|
const downRef = ref();
|
|
const downRef = ref();
|
|
const showGuide = ref(false);
|
|
const showGuide = ref(false);
|
|
@@ -267,10 +270,11 @@ export default defineComponent({
|
|
const musicIframeLoad = () => {
|
|
const musicIframeLoad = () => {
|
|
const token = storage.get(ACCESS_TOKEN);
|
|
const token = storage.get(ACCESS_TOKEN);
|
|
const details = data.musics[data.musicIndex];
|
|
const details = data.musics[data.musicIndex];
|
|
|
|
+ const musicRenderType = data.showMusicImg === 'first' ? 'firstTone' : data.showMusicImg === 'fixed' ? 'fixedTone' : data.showMusicImg === 'staff' ? 'staff' : 'firstTone'
|
|
const origin = /(localhost|192)/.test(location.host)
|
|
const origin = /(localhost|192)/.test(location.host)
|
|
? 'https://test.lexiaoya.cn'
|
|
? 'https://test.lexiaoya.cn'
|
|
: location.origin;
|
|
: location.origin;
|
|
- data.iframeSrc = `${origin}/instrument/?id=${details.id}&modelType=practise&modeType=json&Authorization=${token}&isPreView=true&part-index=${data.selectMusicInstrumentIndex}`;
|
|
|
|
|
|
+ data.iframeSrc = `${origin}/instrument/?id=${details.id}&modelType=practise&modeType=json&Authorization=${token}&isPreView=true&part-index=${data.selectMusicInstrumentIndex}&musicRenderType=${musicRenderType}`;
|
|
};
|
|
};
|
|
|
|
|
|
const setSearchBox = () => {
|
|
const setSearchBox = () => {
|
|
@@ -286,6 +290,13 @@ export default defineComponent({
|
|
|
|
|
|
const isEnsemble = computed(() => {
|
|
const isEnsemble = computed(() => {
|
|
const musics = data.musics[data.musicIndex]?.musicalInstruments;
|
|
const musics = data.musics[data.musicIndex]?.musicalInstruments;
|
|
|
|
+ if (musics && musics.length) {
|
|
|
|
+ let list: any = []
|
|
|
|
+ const arr = musics.forEach((item: any) => {
|
|
|
|
+ list.push({'name': item.name,'code': item.code})
|
|
|
|
+ })
|
|
|
|
+ console.log(999,list)
|
|
|
|
+ }
|
|
if (musics && musics.length > 1) {
|
|
if (musics && musics.length > 1) {
|
|
return true;
|
|
return true;
|
|
} else {
|
|
} else {
|
|
@@ -331,7 +342,61 @@ export default defineComponent({
|
|
//
|
|
//
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+ // 解析xml,获取分轨信息
|
|
|
|
+ const analyzeXml = async () => {
|
|
|
|
+ const details = data.musics[data.musicIndex];
|
|
|
|
+ if (details.xmlFileUrl) {
|
|
|
|
+ const res = await fetch(details.xmlFileUrl).then((response) => response.text());
|
|
|
|
+ filterTracks(res)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ // 过滤出能切换的分轨
|
|
|
|
+ const filterTracks = (xml: any) => {
|
|
|
|
+ const xmlParse = new DOMParser().parseFromString(xml, "text/xml");
|
|
|
|
+ const partList = xmlParse.getElementsByTagName("part-list")?.[0]?.getElementsByTagName("score-part") || [];
|
|
|
|
+ const partListNames = Array.from(partList).map((item) => item.getElementsByTagName("part-name")?.[0]?.textContent?.trim() || "");
|
|
|
|
+ const parts: any = xmlParse.getElementsByTagName("part");
|
|
|
|
+
|
|
|
|
+ /** 第一分谱如果是约定的配置分谱则跳过 */
|
|
|
|
+ if (partListNames[0]?.toLocaleUpperCase?.() === "COMMON") {
|
|
|
|
+ partListNames.shift();
|
|
|
|
+ }
|
|
|
|
+ // 根据后台已选择的分轨筛选出能切换的声轨
|
|
|
|
+ const multiTracksSelection = data.musics[data.musicIndex]?.multiTracksSelection
|
|
|
|
+ const canSelectTracks = multiTracksSelection ? multiTracksSelection?.split(',') : []
|
|
|
|
+ const arr = partListNames.map((item: any, index: number) => {
|
|
|
|
+ // 该声轨能否被选
|
|
|
|
+ const canselect = canSelectTracks.length == 0 || canSelectTracks.includes(item) ? true : false
|
|
|
|
+ // console.log(canselect,index)
|
|
|
|
+ const instrumentName = getInstrumentName(item)
|
|
|
|
+ const sortId = sortMusical(instrumentName, index)
|
|
|
|
+ return {
|
|
|
|
+ text: item + (instrumentName ? `(${instrumentName})` : ''),
|
|
|
|
+ value: index,
|
|
|
|
+ sortId,
|
|
|
|
+ canselect,
|
|
|
|
+ track: item,
|
|
|
|
+ }
|
|
|
|
+ }).filter((item: any) => item.canselect).sort((a: any, b: any) => a.sortId - b.sortId)
|
|
|
|
+ data.trackList = arr;
|
|
|
|
+ let track = arr.find((item: any) => item.value === data.selectMusicInstrumentIndex)?.track
|
|
|
|
+ track = track.replace(/[0-9]+/g,"").replace(/\s/g, '').toLocaleLowerCase()
|
|
|
|
+ let musicRenderType: 'staff' | 'first' | 'fixed' = 'first'
|
|
|
|
+ data.musics[data.musicIndex]?.musicalInstruments.forEach((item: any) => {
|
|
|
|
+ if (item.code.toLocaleLowerCase() === track) {
|
|
|
|
+ musicRenderType = item.defaultScore === 'STAVE' ? 'staff' : item.defaultScore === 'JIAN' ? 'fixed' : item.defaultScore === 'FIRST' ? 'first' : 'first'
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ data.showMusicImg = musicRenderType
|
|
|
|
+ }
|
|
|
|
+ watch(
|
|
|
|
+ () => data.musicIndex,
|
|
|
|
+ async () => {
|
|
|
|
+ data.selectMusicInstrumentIndex = 0
|
|
|
|
+ analyzeXml()
|
|
|
|
+ }
|
|
|
|
+ );
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|
|
// 安卓的状态栏
|
|
// 安卓的状态栏
|
|
postMessage({
|
|
postMessage({
|
|
@@ -363,6 +428,7 @@ export default defineComponent({
|
|
data.vipMember = res.data.vipMember;
|
|
data.vipMember = res.data.vipMember;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+ analyzeXml();
|
|
listenerMessage('webViewOnResume', () => {
|
|
listenerMessage('webViewOnResume', () => {
|
|
console.log('页面显示');
|
|
console.log('页面显示');
|
|
getUserInfo();
|
|
getUserInfo();
|
|
@@ -631,6 +697,7 @@ export default defineComponent({
|
|
onSelect={(item: any) => {
|
|
onSelect={(item: any) => {
|
|
data.showMusicImg = item.value;
|
|
data.showMusicImg = item.value;
|
|
data.popoverShow = false;
|
|
data.popoverShow = false;
|
|
|
|
+ musicIframeLoad();
|
|
}}
|
|
}}
|
|
// onSelect={onSelect}
|
|
// onSelect={onSelect}
|
|
>
|
|
>
|
|
@@ -710,13 +777,13 @@ export default defineComponent({
|
|
v-model:show={data.showChangeVoice}>
|
|
v-model:show={data.showChangeVoice}>
|
|
<ChangeVoice
|
|
<ChangeVoice
|
|
musicalInstruments={
|
|
musicalInstruments={
|
|
- data.musics[data.musicIndex]?.musicalInstruments || []
|
|
|
|
|
|
+ data.trackList || []
|
|
}
|
|
}
|
|
musicalInstrumentIndex={data.selectMusicInstrumentIndex}
|
|
musicalInstrumentIndex={data.selectMusicInstrumentIndex}
|
|
onClose={() => (data.showChangeVoice = false)}
|
|
onClose={() => (data.showChangeVoice = false)}
|
|
- onConfirm={(index: number) => {
|
|
|
|
|
|
+ onConfirm={ async (index: number) => {
|
|
data.selectMusicInstrumentIndex = index;
|
|
data.selectMusicInstrumentIndex = index;
|
|
-
|
|
|
|
|
|
+ await analyzeXml();
|
|
musicIframeLoad();
|
|
musicIframeLoad();
|
|
data.showChangeVoice = false;
|
|
data.showChangeVoice = false;
|
|
}}
|
|
}}
|