|
@@ -4,13 +4,17 @@ import { OpenSheetMusicDisplay } from "../osmd-extended/src";
|
|
|
import { metronomeData } from "./helpers/metronome";
|
|
|
import { GradualNote, GradualTimes, GradualVersion } from "./type";
|
|
|
import { handleEndEvaluat, handleStartEvaluat } from "./view/evaluating";
|
|
|
-import { IFingering } from "src/view/fingering/fingering-config";
|
|
|
+import { IFingering, mappingVoicePart, subjectFingering } from "/src/view/fingering/fingering-config";
|
|
|
import { handleStartTick } from "./view/tick";
|
|
|
import { audioListStart, getAudioCurrentTime, getAudioDuration, setAudioCurrentTime, setAudioPlaybackRate } from "./view/audio-list";
|
|
|
import { toggleFollow } from "./view/follow-practice";
|
|
|
-import { browser, setStorageSpeed } from "./utils";
|
|
|
+import { browser, setStorageSpeed, setGlobalData } from "./utils";
|
|
|
import { api_createMusicPlayer } from "./helpers/communication";
|
|
|
import { verifyCanRepeat } from "./helpers/formateMusic";
|
|
|
+import { getMusicSheetDetail } from "./utils/baseApi"
|
|
|
+import { getQuery } from "/src/utils/queryString";
|
|
|
+
|
|
|
+const query: any = getQuery();
|
|
|
|
|
|
/** 入门 | 进阶 | 大师 */
|
|
|
export type IDifficulty = "BEGINNER" | "ADVANCED" | "PERFORMER";
|
|
@@ -35,6 +39,11 @@ export enum IPlatform {
|
|
|
PC = "PC",
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 特殊教材分类id
|
|
|
+ */
|
|
|
+const classids = [1, 2, 6, 7, 8, 9, 3, 10, 11, 12, 13, 4, 14, 15, 16, 17, 30, 31, 35, 36, 46, 108]; // 大雅金唐, 竖笛教程, 声部训练展开的分类ID
|
|
|
+
|
|
|
const state = reactive({
|
|
|
/** 来源 : PC , app */
|
|
|
platform: "" as IPlatform,
|
|
@@ -637,3 +646,108 @@ export const evaluatCreateMusicPlayer = () => {
|
|
|
tuneSrc: "https://oss.dayaedu.com/cloud-coach/1686725501654check_music1_(1).mp3", //效音音频url
|
|
|
});
|
|
|
};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/** 获取内容平台的接口详情并初始化state信息 */
|
|
|
+export const getMusicDetail = async (id: string) => {
|
|
|
+ const res = await getMusicSheetDetail('8198' || id);
|
|
|
+ if (res?.code === 200) {
|
|
|
+ getMusicInfo(res)
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+const getMusicInfo = (res: any) => {
|
|
|
+ const index = query["part-index"] ? parseInt(query["part-index"] as string) : 0;
|
|
|
+ // 原音声轨
|
|
|
+ const musicData = res.data.musicSheetSoundList?.[index] || {};
|
|
|
+ // 伴奏声轨
|
|
|
+ const accompanyData = res.data.musicSheetAccompanimentList?.[0] || {}
|
|
|
+ const musicInfo = {
|
|
|
+ ...res.data,
|
|
|
+ music: musicData.audioFileUrl || '',
|
|
|
+ accompany: accompanyData.audioFileUrl || '',
|
|
|
+ musicSheetId: musicData.musicSheetId || res.data.id,
|
|
|
+ track: musicData.track || '',
|
|
|
+ };
|
|
|
+ console.log("🚀 ~ musicInfo:", musicInfo);
|
|
|
+ setState(musicInfo, index);
|
|
|
+ setCustom();
|
|
|
+};
|
|
|
+
|
|
|
+const setState = (data: any, index: number) => {
|
|
|
+ state.appName = "COLEXIU";
|
|
|
+ state.detailId = data.id;
|
|
|
+ state.xmlUrl = data.xmlFileUrl;
|
|
|
+ state.partIndex = index;
|
|
|
+ state.trackId = data.track;
|
|
|
+ state.subjectId = data.subjectIds;
|
|
|
+ state.categoriesId = data.musicCategoryId;
|
|
|
+ state.categoriesName = data.musicTagNames;
|
|
|
+ state.enableEvaluation = data.isEvaluated ? true : false;
|
|
|
+ state.examSongId = data.id + "";
|
|
|
+ state.examSongName = data.name;
|
|
|
+ state.coverImg = data.musicCover ?? "";
|
|
|
+ // 解析扩展字段
|
|
|
+ if (data.extConfigJson) {
|
|
|
+ try {
|
|
|
+ state.extConfigJson = JSON.parse(data.extConfigJson as string);
|
|
|
+ } catch (error) {
|
|
|
+ console.error("解析扩展字段错误:", error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ state.isOpenMetronome = data.isPlayBeat ? true : false;
|
|
|
+ // 曲子包含节拍器,就不开启节拍器
|
|
|
+ state.needTick = data.isUseSystemBeat ? false : true;
|
|
|
+ state.isShowFingering = data.isShowFingering ? true : false;
|
|
|
+ state.music = data.music;
|
|
|
+ state.accompany = data.accompany;
|
|
|
+ state.midiUrl = data.midiFileUrl;
|
|
|
+ state.parentCategoriesId = data.musicTag;
|
|
|
+ state.musicSheetCategoriesId = data.musicCategoryId;
|
|
|
+ state.playMode = data.playMode === "MP3" ? "MP3" : "MIDI";
|
|
|
+ state.originSpeed = state.speed = data.playSpeed;
|
|
|
+ const track = data.code || data.track;
|
|
|
+ state.track = track ? track.replace(/ /g, "").toLocaleLowerCase() : "";
|
|
|
+ state.enableNotation = data.isConvertibleScore ? true : false;
|
|
|
+ state.isConcert = data.musicSheetType === "CONCERT" ? true : false
|
|
|
+ // 开启预备小节
|
|
|
+ state.isOpenPrepare = true;
|
|
|
+ // console.log("🚀 ~ state.subjectId:", state.subjectId, state.track as any , state.subjectId)
|
|
|
+ // 是否打击乐
|
|
|
+ // state.isPercussion =
|
|
|
+ // state.subjectId == 23 ||
|
|
|
+ // state.subjectId == 113 ||
|
|
|
+ // state.subjectId == 121 ||
|
|
|
+ // isRhythmicExercises();
|
|
|
+ state.isPercussion = isRhythmicExercises();
|
|
|
+ // 设置是否特殊曲谱, 是特殊曲谱取反(不理解之前的思考逻辑), 使用后台设置的速度
|
|
|
+ state.isSpecialBookCategory = !classids.includes(data.musicCategoryId);
|
|
|
+
|
|
|
+ // 设置指法
|
|
|
+ const code = state.isConcert ? mappingVoicePart(state.trackId, "ENSEMBLE") : mappingVoicePart(state.subjectId, "INSTRUMENT");
|
|
|
+ state.fingeringInfo = subjectFingering(code);
|
|
|
+ console.log("🚀 ~ state.fingeringInfo:", code, state.fingeringInfo, state.trackId, state.track);
|
|
|
+
|
|
|
+ // 检测是否原音和伴奏都有
|
|
|
+ if (!state.music || !state.accompany) {
|
|
|
+ state.playSource = state.music ? "music" : "background";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果是PC端,放大曲谱
|
|
|
+ state.platform = query.platform?.toLocaleUpperCase() || "";
|
|
|
+ if (state.platform === IPlatform.PC) {
|
|
|
+ state.zoom = query.zoom || 1.5;
|
|
|
+ }
|
|
|
+
|
|
|
+ //课堂乐器, 渲染类型: 五线谱, 简谱
|
|
|
+ state.musicRenderType = query.musicRenderType || EnumMusicRenderType.firstTone;
|
|
|
+ console.log("state对象", state);
|
|
|
+};
|
|
|
+
|
|
|
+const setCustom = () => {
|
|
|
+ if (state.extConfigJson.multitrack) {
|
|
|
+ setGlobalData("multitrack", state.extConfigJson.multitrack);
|
|
|
+ }
|
|
|
+};
|