testCheck.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { computed, defineComponent, onMounted, reactive, ref } from "vue";
  2. import { formatXML, onlyVisible } from "../../helpers/formateMusic";
  3. // // @ts-ignore
  4. import { OpenSheetMusicDisplay } from "/osmd-extended/src";
  5. import state, { EnumMusicRenderType } from "/src/state";
  6. import Selection from "../selection";
  7. import styles from "./index.module.less";
  8. import queryString from "query-string";
  9. import { getGradualLengthByXml } from "/src/helpers/calcSpeed";
  10. import { resetFormate, resetGivenFormate, setGlobalMusicSheet } from "/src/helpers/customMusicScore"
  11. import { setGlobalData } from "/src/utils";
  12. export const musicRenderTypeKey = "musicRenderType";
  13. let osmd: any = null;
  14. const musicData = reactive({
  15. showSelection: false, // 可以加载点击浮层
  16. score: "",
  17. containerWidth: 0,
  18. });
  19. /** 重新渲染曲谱 */
  20. export const resetRenderMusicScore = (type?: string) => {
  21. const search = queryString.parse(location.search);
  22. const newSearch = queryString.stringify({
  23. ...search,
  24. _t: Date.now(),
  25. musicRenderType: type
  26. });
  27. location.search = "?" + newSearch;
  28. };
  29. let wordList: never[] = [], deleteWordList: never[] = [];
  30. export default defineComponent({
  31. name: "music-score",
  32. emits: ["rendered"],
  33. props: {
  34. /** 是否渲染选择框 */
  35. showSelection: {
  36. type: Boolean,
  37. default: true,
  38. },
  39. renderTypeKey: {
  40. type: String,
  41. default: "",
  42. },
  43. musicColor: {
  44. type: String,
  45. default: "",
  46. },
  47. /** 是否渲染声轨名称 */
  48. showPartNames: {
  49. type: Boolean,
  50. default: false,
  51. },
  52. },
  53. setup(props, { emit }) {
  54. // 解析报错的xml
  55. const errorList: any = [];
  56. const checkRender = async (list?: any) => {
  57. let errorNum = 0;
  58. for (let i = 0; i < list.length; i++) {
  59. const item = list[i];
  60. try {
  61. await getXML(item.evxml_file_url);
  62. // await init(i);
  63. } catch (error) {
  64. errorNum += 1;
  65. errorList.push(item.evxml_file_url);
  66. console.log('🚀 ~ evxml解析报错:',`第${i}个xml`,error,'总错误数:',errorNum)
  67. }
  68. }
  69. // console.log('🚀 ~ evxml循环完成','没有times和timegap的:',state.noTimes,'解析报错的xml:',errorList)
  70. console.log('关键词',wordList, deleteWordList)
  71. }
  72. /** 设置 曲谱模式,五线谱还是简谱 */
  73. const setRenderType = () => {
  74. const musicRenderType: any = sessionStorage.getItem(props.renderTypeKey || musicRenderTypeKey);
  75. if (musicRenderType in EnumMusicRenderType) {
  76. state.musicRenderType = musicRenderType;
  77. }
  78. };
  79. const getXML = async (evxml: any) => {
  80. const res = await fetch(evxml).then((response) => response?.text());
  81. if (res) {
  82. const xml = formatXML(res, evxml, wordList, deleteWordList);
  83. musicData.score = state.isCombineRender ? xml : onlyVisible(xml, state.partIndex);
  84. if (state.gradualTimes) {
  85. state.gradual = getGradualLengthByXml(xml);
  86. }
  87. }
  88. };
  89. const init = async (idx: any) => {
  90. const container = document.getElementById("testCheck");
  91. if (!container || !musicData.score) return;
  92. setGlobalMusicSheet();
  93. osmd = new OpenSheetMusicDisplay(container, {
  94. drawTitle: false,
  95. drawSubtitle: false,
  96. // drawMeasureNumbers: false,
  97. autoResize: false,
  98. followCursor: false,
  99. drawPartNames: props.showPartNames, // 是否渲染声轨名称
  100. drawComposer: false, // 渲染作者
  101. defaultColorMusic: props.musicColor, // 颜色
  102. renderSingleHorizontalStaffline: state.isSingleLine ? true : false,
  103. autoGenerateMultipleRestMeasuresFromRestMeasures: state.isSingleLine ? false : true, // 连续休止小节是否合并显示
  104. // darkMode: true, // 暗黑模式
  105. // pageFormat: 'A4_P',
  106. // autoBeam: true,
  107. // drawMetronomeMarks: false,
  108. // drawLyricist: false,
  109. // ...this.opotions,
  110. });
  111. // osmd.EngravingRules.CompactMode = true // 紧凑模式
  112. osmd.EngravingRules.PageRightMargin = state.isSingleLine ? (window.innerWidth+200)/10 : 2;
  113. osmd.EngravingRules.FixedMeasureWidth = state.isSingleLine ? true : false; // 是否固定小节的宽度(小节同一宽度渲染)
  114. osmd.EngravingRules.PageTopMargin = 10;
  115. osmd.EngravingRules.PageTopMarginNarrow = 3;
  116. osmd.EngravingRules.PageLeftMargin = 2;
  117. osmd.EngravingRules.PageBottomMargin = 2;
  118. osmd.EngravingRules.DYMusicScoreType = "staff";
  119. osmd.EngravingRules.DYMusicScoreId = state.examSongId || ''
  120. await osmd.load(musicData.score);
  121. osmd.zoom = state.zoom;
  122. osmd.render();
  123. console.log("🚀 ~ evxml渲染完:", `第${idx}个xml`)
  124. container.innerHTML = "";
  125. };
  126. onMounted(async () => {
  127. state.isEvxml = true
  128. // checkRender(xmlList2);
  129. });
  130. return () => (
  131. <div
  132. id="testCheck"
  133. >
  134. </div>
  135. );
  136. },
  137. });