import { computed, defineComponent, onMounted, reactive, ref } from "vue"; import { formatXML, onlyVisible } from "../../helpers/formateMusic"; // // @ts-ignore import { OpenSheetMusicDisplay } from "/osmd-extended/src"; import state, { EnumMusicRenderType } from "/src/state"; import Selection from "../selection"; import styles from "./index.module.less"; import queryString from "query-string"; import { getGradualLengthByXml } from "/src/helpers/calcSpeed"; import { resetFormate, resetGivenFormate, setGlobalMusicSheet } from "/src/helpers/customMusicScore" import { setGlobalData } from "/src/utils"; export const musicRenderTypeKey = "musicRenderType"; let osmd: any = null; const musicData = reactive({ showSelection: false, // 可以加载点击浮层 score: "", containerWidth: 0, }); /** 重新渲染曲谱 */ export const resetRenderMusicScore = (type?: string) => { const search = queryString.parse(location.search); const newSearch = queryString.stringify({ ...search, _t: Date.now(), musicRenderType: type }); location.search = "?" + newSearch; }; let wordList: never[] = [], deleteWordList: never[] = []; export default defineComponent({ name: "music-score", emits: ["rendered"], props: { /** 是否渲染选择框 */ showSelection: { type: Boolean, default: true, }, renderTypeKey: { type: String, default: "", }, musicColor: { type: String, default: "", }, /** 是否渲染声轨名称 */ showPartNames: { type: Boolean, default: false, }, }, setup(props, { emit }) { // 解析报错的xml const errorList: any = []; const checkRender = async (list?: any) => { let errorNum = 0; for (let i = 0; i < list.length; i++) { const item = list[i]; try { await getXML(item.evxml_file_url); // await init(i); } catch (error) { errorNum += 1; errorList.push(item.evxml_file_url); console.log('🚀 ~ evxml解析报错:',`第${i}个xml`,error,'总错误数:',errorNum) } } // console.log('🚀 ~ evxml循环完成','没有times和timegap的:',state.noTimes,'解析报错的xml:',errorList) console.log('关键词',wordList, deleteWordList) } /** 设置 曲谱模式,五线谱还是简谱 */ const setRenderType = () => { const musicRenderType: any = sessionStorage.getItem(props.renderTypeKey || musicRenderTypeKey); if (musicRenderType in EnumMusicRenderType) { state.musicRenderType = musicRenderType; } }; const getXML = async (evxml: any) => { const res = await fetch(evxml).then((response) => response?.text()); if (res) { const xml = formatXML(res, evxml, wordList, deleteWordList); musicData.score = state.isCombineRender ? xml : onlyVisible(xml, state.partIndex); if (state.gradualTimes) { state.gradual = getGradualLengthByXml(xml); } } }; const init = async (idx: any) => { const container = document.getElementById("testCheck"); if (!container || !musicData.score) return; setGlobalMusicSheet(); osmd = new OpenSheetMusicDisplay(container, { drawTitle: false, drawSubtitle: false, // drawMeasureNumbers: false, autoResize: false, followCursor: false, drawPartNames: props.showPartNames, // 是否渲染声轨名称 drawComposer: false, // 渲染作者 defaultColorMusic: props.musicColor, // 颜色 renderSingleHorizontalStaffline: state.isSingleLine ? true : false, autoGenerateMultipleRestMeasuresFromRestMeasures: state.isSingleLine ? false : true, // 连续休止小节是否合并显示 // darkMode: true, // 暗黑模式 // pageFormat: 'A4_P', // autoBeam: true, // drawMetronomeMarks: false, // drawLyricist: false, // ...this.opotions, }); // osmd.EngravingRules.CompactMode = true // 紧凑模式 osmd.EngravingRules.PageRightMargin = state.isSingleLine ? (window.innerWidth+200)/10 : 2; osmd.EngravingRules.FixedMeasureWidth = state.isSingleLine ? true : false; // 是否固定小节的宽度(小节同一宽度渲染) osmd.EngravingRules.PageTopMargin = 10; osmd.EngravingRules.PageTopMarginNarrow = 3; osmd.EngravingRules.PageLeftMargin = 2; osmd.EngravingRules.PageBottomMargin = 2; osmd.EngravingRules.DYMusicScoreType = "staff"; osmd.EngravingRules.DYMusicScoreId = state.examSongId || '' await osmd.load(musicData.score); osmd.zoom = state.zoom; osmd.render(); console.log("🚀 ~ evxml渲染完:", `第${idx}个xml`) container.innerHTML = ""; }; onMounted(async () => { state.isEvxml = true // checkRender(xmlList2); }); return () => (