Skip to content

Commit d4d65cb

Browse files
committed
feat(note): 添加休止符绘制功能
- 在 SNNote 类中新增 drawGuitarRestNote 方法,用于绘制不同类型的休止符符号。 - 更新 draw 方法,调用 drawGuitarRestNote 以支持休止符的绘制。 - 移除 beam.ts 中重复的休止符绘制逻辑,提升代码整洁性和可维护性。 - 增强代码注释,符合jsdoc规范,提升可读性和维护性。
1 parent e3a4070 commit d4d65cb

File tree

2 files changed

+49
-87
lines changed

2 files changed

+49
-87
lines changed

lib/src/components/note.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,9 @@ export class SNNote extends SNBox {
505505
});
506506
this.el.appendChild(line);
507507
}
508+
509+
this.drawGuitarRestNote(lineTop, lineHeight);
510+
508511
const { x, string, fret } = this.getGuitarNotePosition();
509512

510513
// 只有找到品位信息时才绘制品位数字和竖线
@@ -563,6 +566,52 @@ export class SNNote extends SNBox {
563566
}
564567
}
565568

569+
drawGuitarRestNote(lineTop: number, lineHeight: number) {
570+
// 如果是休止符,绘制对应的休止符符号并跳过后续绘制(不依赖string)
571+
if (this.note === '0') {
572+
let restSymbolKey: keyof typeof BravuraMusicSymbols.SYMBOLS | undefined;
573+
// 根据nodeTime选择休止符符号
574+
switch (this.nodeTime) {
575+
case 4: // 全休止符
576+
restSymbolKey = 'REST_WHOLE';
577+
break;
578+
case 2: // 二分休止符
579+
restSymbolKey = 'REST_HALF';
580+
break;
581+
case 1: // 四分休止符
582+
restSymbolKey = 'REST_QUARTER';
583+
break;
584+
case 0.5: // 八分休止符
585+
restSymbolKey = 'REST_EIGHTH';
586+
break;
587+
case 0.25: // 十六分休止符
588+
restSymbolKey = 'REST_SIXTEENTH';
589+
break;
590+
case 0.125: // 三十二分休止符
591+
restSymbolKey = 'REST_32ND';
592+
break;
593+
default:
594+
// 默认四分休止符
595+
restSymbolKey = 'REST_QUARTER';
596+
break;
597+
}
598+
if (restSymbolKey) {
599+
const x = this.innerX + this.innerWidth / 2; // 获取音符的中心x坐标
600+
// 绘制休止符符号,位置需要微调
601+
this.el.appendChild(
602+
BravuraMusicSymbols.createSymbol(restSymbolKey, {
603+
x: x, // 水平居中
604+
y: lineTop + lineHeight * 3, // 垂直位置,大约在六线谱中间位置
605+
fontSize: 24, // 适当放大
606+
fontFamily: 'Bravura', // 使用Bravura字体
607+
textAnchor: 'middle', // 水平居中对齐
608+
}),
609+
);
610+
}
611+
return; // 跳过当前休止符的后续绘制(竖线和符尾)
612+
}
613+
}
614+
566615
draw() {
567616
if (this.chord?.length) {
568617
SNChordLayer.addChord(this);

lib/src/layers/beam.ts

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -178,96 +178,9 @@ export class SNBeamLayer {
178178
// 所有音符都画竖线,只有落单的八分/十六分音符竖线底部加标准小尾巴(斜线+左弧线)
179179
group.forEach((note) => {
180180
const { string } = note.getGuitarNotePosition();
181-
// 如果是休止符,绘制对应的休止符符号并跳过后续绘制(不依赖string)
182-
if (String(note.note) === '0') {
183-
let restSymbolKey: keyof typeof BravuraMusicSymbols.SYMBOLS | undefined;
184-
// 根据nodeTime选择休止符符号
185-
switch (note.nodeTime) {
186-
case 4: // 全休止符
187-
restSymbolKey = 'REST_WHOLE';
188-
break;
189-
case 2: // 二分休止符
190-
restSymbolKey = 'REST_HALF';
191-
break;
192-
case 1: // 四分休止符
193-
restSymbolKey = 'REST_QUARTER';
194-
break;
195-
case 0.5: // 八分休止符
196-
restSymbolKey = 'REST_EIGHTH';
197-
break;
198-
case 0.25: // 十六分休止符
199-
restSymbolKey = 'REST_SIXTEENTH';
200-
break;
201-
case 0.125: // 三十二分休止符
202-
restSymbolKey = 'REST_32ND';
203-
break;
204-
default:
205-
// 默认四分休止符
206-
restSymbolKey = 'REST_QUARTER';
207-
break;
208-
}
209-
if (restSymbolKey) {
210-
const x = note.innerX + note.innerWidth / 2; // 获取音符的中心x坐标
211-
// 绘制休止符符号,位置需要微调
212-
SNBeamLayer.el.appendChild(
213-
BravuraMusicSymbols.createSymbol(restSymbolKey, {
214-
x: x, // 水平居中
215-
y: lineTop + lineHeight * 3 + 5, // 垂直位置,大约在六线谱中间位置
216-
fontSize: 20, // 适当放大
217-
fontFamily: 'Bravura', // 使用Bravura字体
218-
textAnchor: 'middle', // 水平居中对齐
219-
}),
220-
);
221-
}
222-
return; // 跳过当前休止符的后续绘制(竖线和符尾)
223-
}
224181
if (string) {
225182
const x = note.innerX + note.innerWidth / 2;
226183
const y = lineTop + lineHeight * (string - 1) + lineHeight / 2;
227-
// 如果是休止符,绘制对应的休止符符号并跳过后续绘制
228-
if (String(note.note) === '0') {
229-
let restSymbolKey:
230-
| keyof typeof BravuraMusicSymbols.SYMBOLS
231-
| undefined;
232-
// 根据nodeTime选择休止符符号
233-
switch (note.nodeTime) {
234-
case 4: // 全休止符
235-
restSymbolKey = 'REST_WHOLE';
236-
break;
237-
case 2: // 二分休止符
238-
restSymbolKey = 'REST_HALF';
239-
break;
240-
case 1: // 四分休止符
241-
restSymbolKey = 'REST_QUARTER';
242-
break;
243-
case 0.5: // 八分休止符
244-
restSymbolKey = 'REST_EIGHTH';
245-
break;
246-
case 0.25: // 十六分休止符
247-
restSymbolKey = 'REST_SIXTEENTH';
248-
break;
249-
case 0.125: // 三十二分休止符
250-
restSymbolKey = 'REST_32ND';
251-
break;
252-
default:
253-
// 默认四分休止符
254-
restSymbolKey = 'REST_QUARTER';
255-
break;
256-
}
257-
if (restSymbolKey) {
258-
// 绘制休止符符号,位置需要微调
259-
SNBeamLayer.el.appendChild(
260-
BravuraMusicSymbols.createSymbol(restSymbolKey, {
261-
x: x, // 水平居中
262-
y: lineTop + lineHeight * 3 + 5, // 垂直位置,大约在六线谱中间位置
263-
fontSize: 20, // 适当放大
264-
fontFamily: 'Bravura', // 使用Bravura字体
265-
textAnchor: 'middle', // 水平居中对齐
266-
}),
267-
);
268-
}
269-
return; // 跳过当前休止符的后续绘制
270-
}
271184
// 竖线
272185
SNBeamLayer.el.appendChild(
273186
SvgUtils.createLine({

0 commit comments

Comments
 (0)