|
@@ -377,48 +377,15 @@ class Metronome {
|
|
|
svgs: [] as any[],
|
|
|
isRestFlag: note.isRestFlag,
|
|
|
};
|
|
|
- // 2.统计小节的拍数
|
|
|
- // 3.统计小节的时长, 开始时间,结束时间
|
|
|
- // console.log(measureNumberXML,note.measures, times.filter((n: any) => n?.noteElement?.sourceMeasure?.measureListIndex == measureListIndex))
|
|
|
- if ([121].includes(state.subjectId)) {
|
|
|
- const _measures = times.filter((n: any) => n?.noteElement?.sourceMeasure?.measureListIndex == measureListIndex);
|
|
|
- note.measures = _measures;
|
|
|
- m.start = note.measures[0].time;
|
|
|
- m.end = note.measures[note.measures.length - 1].endtime;
|
|
|
- m.time = note.measures[note.measures.length - 1].endtime - note.measures[0].time;
|
|
|
- try {
|
|
|
- const tickables = note.noteElement.sourceMeasure.verticalMeasureList.reduce((arr: any[], value: any) => {
|
|
|
- arr.push(...value.vfVoices["1"].tickables);
|
|
|
- return arr;
|
|
|
- }, []);
|
|
|
- const xList: any[] = [];
|
|
|
- m.svgs = tickables
|
|
|
- .map((n: any) => {
|
|
|
- const x = n.getBoundingBox().x;
|
|
|
- if (!xList.includes(x) && n.duration !== "w") {
|
|
|
- xList.push(x);
|
|
|
- n._start_x = x;
|
|
|
- return n;
|
|
|
- }
|
|
|
- })
|
|
|
- .filter(Boolean)
|
|
|
- .sort((a: any, b: any) => a._start_x - b._start_x);
|
|
|
- // console.log(measureNumberXML, m.svgs)
|
|
|
- } catch (error) {
|
|
|
- console.log(error);
|
|
|
- }
|
|
|
- m.stepList = calculateMutilpleMetroStep(note.measures, m);
|
|
|
- } else {
|
|
|
- /**
|
|
|
- * bug:#9877
|
|
|
- * 多分轨合并显示,不同分轨的音符数量可能不同
|
|
|
- */
|
|
|
- let measureArr = note.measures;
|
|
|
- if (state.isCombineRender) {
|
|
|
- measureArr = measureArr.filter((item: any) => item.MeasureNumberXML === m.measureNumberXML)
|
|
|
- }
|
|
|
- m.stepList = calculateMetroStep(measureArr, m);
|
|
|
+ /**
|
|
|
+ * bug:#9877
|
|
|
+ * 多分轨合并显示,不同分轨的音符数量可能不同
|
|
|
+ */
|
|
|
+ let measureArr = note.measures;
|
|
|
+ if (state.isCombineRender) {
|
|
|
+ measureArr = measureArr.filter((item: any) => item.MeasureNumberXML === m.measureNumberXML)
|
|
|
}
|
|
|
+ m.stepList = calculateMetroStep(measureArr, m);
|
|
|
measures.push(m);
|
|
|
xmlNumber = measureNumberXML;
|
|
|
}
|
|
@@ -441,7 +408,7 @@ class Metronome {
|
|
|
const measure = measures[i];
|
|
|
const noteStep = measure.time / measure.numerator;
|
|
|
// console.log("🚀 ~ measure.measureNumberXML",measure.measureNumberXML, noteStep)
|
|
|
- const WIDTH = [121].includes(state.subjectId) ? 95 : 100;
|
|
|
+ const WIDTH = 100;
|
|
|
const widthStep = WIDTH / (measure.numerator + 1);
|
|
|
metroMeasure[i] = [] as number[];
|
|
|
// console.log('stepList', [...measure.stepList], measure.measureNumberXML)
|
|
@@ -604,72 +571,6 @@ function calculateMetroStep(arr: any[], m: any): number[] {
|
|
|
// console.log("stepList", [...stepList], m.measureNumberXML);
|
|
|
return stepList;
|
|
|
}
|
|
|
-// 计算单声部多声轨的拍子的时值
|
|
|
-function calculateMutilpleMetroStep(arr: any[], m: any): number[] {
|
|
|
- // console.log("🚀 ~ m:", [...m.svgs])
|
|
|
- const step = m.time / m.numerator;
|
|
|
- const measure_bbox = arr[0]?.svgElement?.attrs?.el?.parentElement?.parentElement?.getBoundingClientRect?.() || { x: 0 };
|
|
|
- if (arr.length === 1) {
|
|
|
- const staveNote = m.svgs[0];
|
|
|
- // 大于一拍
|
|
|
- let bbox = staveNote?.attrs?.el?.getBoundingClientRect?.() || { x: 0 };
|
|
|
- if (staveNote && !staveNote.isRest()) {
|
|
|
- return [bbox.x - measure_bbox.x];
|
|
|
- }
|
|
|
- return [];
|
|
|
- }
|
|
|
- // console.log("🚀 ~ arr", arr, step, m.measureNumberXML);
|
|
|
- let total = 0;
|
|
|
- let notes: any[] = [];
|
|
|
- let stepList: number[] = [];
|
|
|
- for (let i = 0; i < arr.length; i++) {
|
|
|
- const item = arr[i];
|
|
|
- item._index = i;
|
|
|
- const noteTime = item.endtime - item.time;
|
|
|
- total += noteTime;
|
|
|
- let svgEle = m.svgs[i]?.attrs?.el;
|
|
|
- // 大于一拍
|
|
|
- let bbox = svgEle?.getBoundingClientRect?.() || { x: 0 };
|
|
|
- // console.log(m.measureNumberXML, svgEle, i)
|
|
|
- if (noteTime > step) {
|
|
|
- total -= step;
|
|
|
- // console.log('超过一拍了', notes, m.measureNumberXML)
|
|
|
- let x = bbox.x - measure_bbox.x;
|
|
|
- if (notes.length > 0) {
|
|
|
- svgEle = m.svgs[notes[0]._index]?.attrs?.el;
|
|
|
- bbox = svgEle?.getBoundingClientRect?.() || { x: 0 };
|
|
|
- x = bbox.x - measure_bbox.x;
|
|
|
- }
|
|
|
- stepList.push(x);
|
|
|
- notes = [];
|
|
|
- } else {
|
|
|
- notes.push(item);
|
|
|
- }
|
|
|
- // console.log(notes)
|
|
|
- if (Math.abs(total - step) < 0.001) {
|
|
|
- let x = bbox.x - measure_bbox.x;
|
|
|
- if (notes.length > 0) {
|
|
|
- svgEle = m.svgs[notes[0]._index]?.attrs?.el;
|
|
|
- bbox = svgEle?.getBoundingClientRect?.() || { x: 0 };
|
|
|
- x = bbox.x - measure_bbox.x;
|
|
|
- }
|
|
|
- // console.log("一拍",svgEle,notes,m.svgs, m.measureNumberXML);
|
|
|
- stepList.push(x);
|
|
|
- total = 0;
|
|
|
- notes = [];
|
|
|
- }
|
|
|
- }
|
|
|
- stepList = stepList.reduce((list: any[], n: number) => {
|
|
|
- if (list.includes(n)) {
|
|
|
- list.push(undefined as any);
|
|
|
- } else {
|
|
|
- list.push(n);
|
|
|
- }
|
|
|
- return list;
|
|
|
- }, []); //Array.from(new Set(stepList))
|
|
|
- // console.log('stepList', stepList, m.measureNumberXML)
|
|
|
- return stepList;
|
|
|
-}
|
|
|
|
|
|
// 延迟兼容处理
|
|
|
function setCurrentTime(time: number) {
|