Tuplet and Parenthesis Handling Issues in ABC converter (abcFormat)

未关闭
#1,798 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
1-2 天
新手友好度
30/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
data

调研方向

Start in music21/abcFormat, where lastTupletToken is set and "Tuplet" is pushed onto self.activeParens, and trace how ABCParenStop pops that stack. Run the reproduction snippet from the issue and check that the slur closes after F and that G is not included. Done means the (C(3DEF)G example yields a slur over C, D, E, F only, with the tuplet timing unchanged.

由索引模型根据 Issue 内容生成。

描述

music21 version

9.7.1

Operating System(s) checked
MacOS 15.5

Problem summary

Hi music21 developers! Thank you for maintaining such a great project!

While working with the ABC converter in music21/abcFormat, I noticed some issues related to how tuplets and parentheses (used for slurs and cresc./dim.) are handled. Here’s what I’ve found:

  • ABC tuplet symbols like (3 are tokenized and applied to following notes via the lastTupletToken variable. However, at the same time, the string "Tuplet" is pushed onto the self.activeParens stack and only removed upon encountering an ABCParenStop token. This is problematic because in ABC notation, tuplets are not structured like slurs—they don’t require a closing parenthesis.
  • Slur stops and crescendo/diminuendo stops are all tokenized as ABCParenStop, without distinguishing their types. This could cause issues when these constructs appear in alternating patterns. One possible fix is to use separate token types and maintain separate stacks for each construct.

I’m happy to help address these issues! I actually have already done some work to support ABC v2.1 (like multi-voice and inline clef/key/meter change)—but I’m still refining it.

Additionally, the current ABC parsing logic is quite complex. Have we considered building on top of existing tools like abc2xml.py, which already provides a fairly complete ABC parser?

Steps to reproduce

Here is an example:

from music21 import converter
abc_str="""X:1
M:4/4
K:C
L:1/4
(C(3DEF)G|"""
score = converter.parse(abc_str)
score.show('text')

Expected vs. actual behavior

Actual behavior:

{0.0} <music21.metadata.Metadata object at 0x14a13ffee480>
{0.0} <music21.stream.Part 0x14a13fe47b30>
    {0.0} <music21.clef.TrebleClef>
    {0.0} <music21.key.Key of C major>
    {0.0} <music21.meter.TimeSignature 4/4>
    {0.0} <music21.spanner.Slur <music21.note.Note C><music21.note.Note D><music21.note.Note E><music21.note.Note F><music21.note.Note G>>
    {0.0} <music21.note.Note C>
    {1.0} <music21.note.Note D>
    {1.6667} <music21.note.Note E>
    {2.3333} <music21.note.Note F>
    {3.0} <music21.note.Note G>

Expected behavior:

{0.0} <music21.metadata.Metadata object at 0x14a13ffee480>
{0.0} <music21.stream.Part 0x14a13fe47b30>
    {0.0} <music21.clef.TrebleClef>
    {0.0} <music21.key.Key of C major>
    {0.0} <music21.meter.TimeSignature 4/4>
    {0.0} <music21.spanner.Slur <music21.note.Note C><music21.note.Note D><music21.note.Note E><music21.note.Note F>>
    {0.0} <music21.note.Note C>
    {1.0} <music21.note.Note D>
    {1.6667} <music21.note.Note E>
    {2.3333} <music21.note.Note F>
    {3.0} <music21.note.Note G>

The closing parenthesis) should end the slur that starts before C. However, due to interaction with the tuplet parsing, it incorrectly includes the note G in the slur.

More information

I’d be happy to help with:

  • Introducing distinct close tokens and separate stacks for each construct (tuplets, slurs, etc.)
  • Add new features to support ABC v2.1
  • Refactoring or rewriting parts of the ABC parser to improve clarity and modularity if needed
主要语言
Python
星标
2.6k
派生
459
PR 合并指标
30 天内没有已合并 PR

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

cuthbertLab/music21 的其他 Issue

查看 cuthbertLab/music21 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。