uses.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { onMounted, Ref, ref } from 'vue'
  2. import { OpenSheetMusicDisplay, EngravingRules, OSMDOptions } from '/osmd-extended/src'
  3. import { formatZoom } from '/src/helpers/utils'
  4. import { setEngravingRules } from './helpers'
  5. import { Toast } from 'vant'
  6. import qs from 'query-string'
  7. const search = qs.parse(location.search);
  8. /**
  9. * 合并规则
  10. * @param osmd OpenSheetMusicDisplay 实例
  11. * @param EngravingRules 规则
  12. */
  13. export const useEngravingRules = (
  14. osmd: OpenSheetMusicDisplay,
  15. EngravingRules: { [P in keyof EngravingRules]?: EngravingRules[P] | undefined }
  16. ) => {
  17. onMounted(() => {
  18. setEngravingRules(osmd)
  19. for (const key in EngravingRules) {
  20. if (Object.prototype.hasOwnProperty.call(EngravingRules, key)) {
  21. let k: keyof EngravingRules = key as keyof EngravingRules
  22. const item = EngravingRules[k] as never
  23. osmd.EngravingRules[k] = item
  24. }
  25. }
  26. })
  27. }
  28. export const useOsmd = (
  29. container: Ref<HTMLDivElement | undefined>,
  30. opotions: OSMDOptions,
  31. setEngravingRules: { [P in keyof EngravingRules]?: EngravingRules[P] | undefined } = {}
  32. ) => {
  33. const osmd: Ref<OpenSheetMusicDisplay | undefined> = ref()
  34. if (container.value) {
  35. const rules = new EngravingRules()
  36. for (const [key, value] of Object.entries(setEngravingRules)) {
  37. /** EngravingRules 是class 索引好像有问题 */
  38. // @ts-ignore
  39. rules[key] = value as EngravingRules[keyof EngravingRules]
  40. }
  41. osmd.value = new OpenSheetMusicDisplay(
  42. container.value,
  43. {
  44. followCursor: false,
  45. autoResize: true,
  46. drawSubtitle: false,
  47. drawTitle: false,
  48. autoBeam: true,
  49. drawMetronomeMarks: false,
  50. drawMeasureNumbers: false,
  51. drawComposer: false,
  52. drawLyricist: false,
  53. ...opotions,
  54. },
  55. rules
  56. )
  57. }
  58. return osmd
  59. }
  60. export const useOsmdLoader = async (osmd: OpenSheetMusicDisplay, score: string) => {
  61. if (!score) throw 'score is required'
  62. try {
  63. if (score && osmd) {
  64. await osmd.load(score)
  65. // 自定义缩放比例
  66. let customZoom = formatZoom()
  67. if (search?.zoom) {
  68. let userZoom = Number(search?.zoom)
  69. userZoom = userZoom < 50 ? 50 : userZoom > 160 ? 160 : userZoom
  70. customZoom = userZoom / 100
  71. }
  72. osmd.zoom = customZoom
  73. await osmd.render()
  74. }
  75. } catch (error) {}
  76. }