| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /**
- * 休止符提示器
- * auth: lsq
- * time: 2022.11.14
- */
- import { reactive } from "vue";
- export const restPromptData = reactive({
- list: [] as any[],
- });
- export const restPromptMain = (times: any[]) => {
- calculateMergeRest(times);
- };
- // 计算合并的休止符小节
- function calculateMergeRest(times: any[]) {
- // console.log(times);
- // 1. 统计所有休止的小节, 并记录五线谱休止符的小节位置和大小
- const measures: any[] = [];
- const osmdSvg: SVGAElement = document.querySelector('#osmdSvgPage1')!
- const viewBox = osmdSvg.getAttribute('viewBox')?.split(' ') || []
- let zoom: number = Number(osmdSvg.getAttribute('width')) / Number(viewBox[2])
- zoom = isNaN(zoom) ? 1 : zoom
- // console.log("🚀 ~ zoom", zoom)
- for (let i = 0; i < times.length; i++) {
- const note = times[i];
- const measureNumberXML = note?.noteElement?.sourceMeasure?.MeasureNumberXML || -1;
- const multipleRestMeasures = note?.noteElement?.sourceMeasure?.multipleRestMeasures || 0;
- const allRests = note?.noteElement?.sourceMeasure?.allRests || false;
- const hasMeasure = measures.find((n) => n.measureNumberXML === measureNumberXML);
- if (!hasMeasure && allRests && multipleRestMeasures > 1) {
- const staveBox = getStaveBox(note?.stave?.attrs?.id, zoom);
- // console.log("🚀 ~ note", note, stave);
- measures.push({
- measureNumberXML,
- allRests,
- multipleRestMeasures,
- staveBox,
- });
- }
- }
- // console.log(measures);
- restPromptData.list = measures;
- }
- // 获取休止符的位置
- function getStaveBox(id: string, zoom: number){
- if (!id) return {}
- const stave = document.querySelector('#' + id)
- if (stave){
- const bbox = (stave?.nextElementSibling as SVGAElement)?.getBBox()
- return {
- left: bbox.x * zoom + 'px',
- top: bbox.y * zoom + 'px',
- width: bbox.width * zoom + 'px',
- height: bbox.height * zoom + 'px'
- }
- }
- return {}
- }
|