Skip to content

Commit 1a75e44

Browse files
committed
feat(parser): 更新音符时值计算逻辑以支持附点音符
- 增强 calculateDottedNoteValue 函数,提供详细的附点规则和计算公式,确保音符时值的准确性。 - 更新文档注释,增加示例以帮助用户理解附点音符的计算方式。 - 修改 Home.vue 中的示例,调整附点音符的表示,确保测试用例的准确性。 该变更提升了音符时值计算的灵活性和可读性,确保乐谱信息的准确展示。
1 parent 99a6db0 commit 1a75e44

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

packages/simple-notation/src/data/parser/abc/parsers/element-parser.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -356,13 +356,37 @@ function parseDurationString(
356356
/**
357357
* 计算带附点的音符时值
358358
*
359-
* @param noteValue - 基础音符时值
360-
* @param dotCount - 附点数量
361-
* @returns 带附点的音符时值
359+
* 附点规则:
360+
* - 单附点:原时值 + 原时值的一半 = 原时值 * 1.5
361+
* - 双附点:原时值 + 原时值的一半 + 原时值的四分之一 = 原时值 * 1.75
362+
* - 三附点:原时值 + 原时值的一半 + 原时值的四分之一 + 原时值的八分之一 = 原时值 * 1.875
363+
*
364+
* 通用公式:noteValue * (2 - Math.pow(0.5, dotCount))
365+
*
366+
* @param noteValue - 基础音符时值(相对于全音符的比例,如 1/4 表示四分音符)
367+
* @param dotCount - 附点数量(1表示单附点,2表示双附点等)
368+
* @returns 带附点的音符时值(相对于全音符的比例)
369+
*
370+
* @example
371+
* // 四分音符(1/4)带单附点,ticksPerWhole = 16
372+
* // noteValue = 1/4 = 0.25
373+
* // dottedValue = 0.25 * 1.5 = 0.375
374+
* // duration = 0.375 * 16 = 6 ticks(四分音符4ticks + 附点2ticks = 6ticks)
375+
*
376+
* @example
377+
* // 四分音符(1/4)带单附点,ticksPerWhole = 48
378+
* // noteValue = 1/4 = 0.25
379+
* // dottedValue = 0.25 * 1.5 = 0.375
380+
* // duration = 0.375 * 48 = 18 ticks(四分音符12ticks + 附点6ticks = 18ticks)
362381
*/
363382
function calculateDottedNoteValue(noteValue: number, dotCount: number): number {
364383
if (dotCount === 0) return noteValue;
365-
return noteValue * (1 + 0.5 * (1 - Math.pow(0.5, dotCount)));
384+
// 正确的公式:每个附点增加前一个附点值的一半
385+
// 单附点:1 + 0.5 = 1.5
386+
// 双附点:1 + 0.5 + 0.25 = 1.75
387+
// 三附点:1 + 0.5 + 0.25 + 0.125 = 1.875
388+
// 通用公式:2 - Math.pow(0.5, dotCount)
389+
return noteValue * (2 - Math.pow(0.5, dotCount));
366390
}
367391

368392
/**

packages/web/src/pages/Home.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ C4 | C2 C2 | C C C C | C/2 C/2 C/2 C/2 C/2 C/2 C/2 C/2 |
3232
w:全音符 | 二分 音符 | 四 分 音 符 | 八 分 音 符 测 试
3333
3434
% 测试3:附点音符
35-
C. D C. D | C2. D | C.. D C.. D | z4 |
35+
C. D/2 C. D/2 | C2. D | C.. C.. D/2 | z4 |
3636
w:附点 四分 音符 | 附点 二分 | 双附 点测 试 | 休
3737
3838
% 测试4:变音记号(升降号)
3939
C ^C D _D | E =E F ^F | G _G A =A | B c z2 |
4040
w:自然 音升 音降 音 | 还原 记号 测试 | 更多 变音 符号 | 结束 *
4141
% 测试4.1:重升号和重降号
42-
^^C __D E | =E ^^F __G | A B c z2 |
42+
^^C __D E E | =E ^^F __G G | A B c z |
4343
w:重升 重降 测试 | 还原 重升 重降 | 结束 *
4444
4545
% 测试5:不同拍号 - 切换到3/4拍

0 commit comments

Comments
 (0)