123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- 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 () => (
- <div
- id="testCheck"
- >
- </div>
- );
- },
- });
|