|
@@ -28,8 +28,11 @@ export default defineComponent({
|
|
|
notes: [] as any[],
|
|
|
staves: [] as any[],
|
|
|
measureHeight: 0 as number, // 小节高度
|
|
|
+ // beatWidth: '100%' as string, // 节拍指针占用的宽度,带有拍号的小节,节拍指针占用的宽度需要减去拍号左侧的宽度
|
|
|
+ // beatLeft: 0 as number, // 小节有拍号时,拍号左侧宽度
|
|
|
});
|
|
|
-
|
|
|
+ const beatMeasureWidths: any = {}; // 节拍指针需要占用的宽度
|
|
|
+
|
|
|
/** 计算点击层数据 */
|
|
|
const calcNoteData = () => {
|
|
|
const musicContainer = document.getElementById("musicAndSelection")?.getBoundingClientRect() || {
|
|
@@ -112,7 +115,9 @@ export default defineComponent({
|
|
|
notesList.push(item.noteId);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ // 如果小节里面有拍号,需要减去拍号左侧的宽度
|
|
|
+ let beatWidth = '100%';
|
|
|
+ let beatLeft = 0;
|
|
|
if (!MeasureNumberXMLList.includes(item.MeasureNumberXML)) {
|
|
|
if (item.stave) {
|
|
|
if (item.stave?.attrs?.id) {
|
|
@@ -132,6 +137,14 @@ export default defineComponent({
|
|
|
} catch (error) {}
|
|
|
|
|
|
const staveBbox = staveEle?.getBoundingClientRect?.() || { x: 0, width: 0, y: 0, height: 0 };
|
|
|
+ const timesignatureDom = staveEle?.querySelector('.vf-timesignature') || staveEle?.querySelector('.vf-keysignature')
|
|
|
+ // 休止符才是根据小节宽度等分
|
|
|
+ if (timesignatureDom && item.measures.length == 1) {
|
|
|
+ const timesignatureBbox = timesignatureDom.getBoundingClientRect()
|
|
|
+ const leftWidth = timesignatureBbox.x + timesignatureBbox.width - staveBbox.x
|
|
|
+ beatLeft = leftWidth
|
|
|
+ beatWidth = `calc(100% - ${leftWidth+'px'})`
|
|
|
+ }
|
|
|
if (i === 0) {
|
|
|
minMeasureHeigt = staveBbox.height
|
|
|
}
|
|
@@ -159,6 +172,10 @@ export default defineComponent({
|
|
|
selectData.staves.push(noteItem);
|
|
|
}
|
|
|
MeasureNumberXMLList.push(item.MeasureNumberXML);
|
|
|
+ beatMeasureWidths[item.MeasureNumberXML] = {
|
|
|
+ beatLeft,
|
|
|
+ beatWidth
|
|
|
+ }
|
|
|
} else {
|
|
|
if (item.multipleRestMeasures) {
|
|
|
if (state.isCombineRender) {
|
|
@@ -184,6 +201,10 @@ export default defineComponent({
|
|
|
};
|
|
|
selectData.staves.push(noteItem);
|
|
|
MeasureNumberXMLList.push(item.MeasureNumberXML);
|
|
|
+ beatMeasureWidths[item.MeasureNumberXML] = {
|
|
|
+ beatLeft,
|
|
|
+ beatWidth
|
|
|
+ }
|
|
|
}
|
|
|
} else {
|
|
|
const preItem = selectData.staves.find(
|
|
@@ -198,6 +219,15 @@ export default defineComponent({
|
|
|
};
|
|
|
selectData.staves.push(noteItem);
|
|
|
MeasureNumberXMLList.push(item.MeasureNumberXML);
|
|
|
+ const preBeatMeasure = beatMeasureWidths[item.MeasureNumberXML-1]
|
|
|
+ beatMeasureWidths[item.MeasureNumberXML] = preBeatMeasure ?
|
|
|
+ {
|
|
|
+ beatLeft: preBeatMeasure.beatLeft,
|
|
|
+ beatWidth: preBeatMeasure.beatWidth
|
|
|
+ } : {
|
|
|
+ beatLeft,
|
|
|
+ beatWidth
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -209,7 +239,7 @@ export default defineComponent({
|
|
|
if (selectData.staves[0]?.staveBox?.top !== selectData.staves[1]?.staveBox?.top) {
|
|
|
selectData.staves[0].staveBox.top = selectData.staves[1]?.staveBox?.top || selectData.staves[0]?.staveBox?.top
|
|
|
}
|
|
|
- console.log("🚀 ~ selectData.notes:", selectData.notes, selectData.staves);
|
|
|
+ console.log("🚀 ~ selectData.notes:", selectData.notes, selectData.staves,beatMeasureWidths,MeasureNumberXMLList);
|
|
|
};
|
|
|
/** 是否可以点击音符 */
|
|
|
const disableClickNote = computed(() => {
|
|
@@ -301,7 +331,7 @@ export default defineComponent({
|
|
|
metronomeData.cursorMode === 2 &&
|
|
|
item.MeasureNumberXML === metronomeData.activeMetro?.measureNumberXML &&
|
|
|
state.times[state.activeNoteIndex].MeasureNumberXML === item.MeasureNumberXML;
|
|
|
- //console.log('显示节拍指针',lineShow,state.times[state.activeNoteIndex].MeasureNumberXML,item.MeasureNumberXML,metronomeData.activeMetro?.measureNumberXML)
|
|
|
+ // console.log('显示节拍指针',lineShow,state.times[state.activeNoteIndex].MeasureNumberXML,item.MeasureNumberXML,metronomeData.activeMetro?.measureNumberXML)
|
|
|
return (
|
|
|
<>
|
|
|
{item.staveBox && (
|
|
@@ -324,7 +354,7 @@ export default defineComponent({
|
|
|
}}
|
|
|
>
|
|
|
{lineShow && (
|
|
|
- <div style={{height: selectData.measureHeight + 'px', position: 'relative'}}>
|
|
|
+ <div style={{height: selectData.measureHeight + 'px', position: 'relative', width: metronomeData.activeMetro.isPercent ? beatMeasureWidths[item.MeasureNumberXML].beatWidth : '100%', left: metronomeData.activeMetro.isPercent ? beatMeasureWidths[item.MeasureNumberXML].beatLeft + 'px' : 0}}>
|
|
|
<div
|
|
|
class={[
|
|
|
styles.line,
|