Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

MusicXML `<transpose>` with `<octave-change>` but no `<diatonic>` raises TypeError

未关闭 适合新手
#2,082 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python
领域
data

调研方向

崩溃来自 musicxml/xmlToM21.py 中的 MeasureParser.xmlTransposeToInterval,其中八度变化分支即使在 diatonicStep 为 None 时也会对它进行加法运算。先运行 issue 中的复现代码片段,确认 TypeError,然后阅读该分支之后的代码,看看缺失的 diatonic step 已经是如何处理的。完成标准是:代码片段能够成功解析,声部听起来比记谱低一个八度,并且有现成或新增的测试覆盖仅八度的移调。

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

描述

music21 version

10.5.0

Problem summary

<diatonic> is optional in <transpose>, and the importer handles it being missing, except when there's also an <octave-change>. Then it adds the octave to a None diatonic step and raises. An octave-only <transpose> is how guitar and bass parts are written, and some exporters leave out <diatonic> when it's 0.

Steps to reproduce

from music21 import converter

xml = '''<score-partwise version="4.0">
  <part-list><score-part id="P1"><part-name>Music</part-name></score-part></part-list>
  <part id="P1"><measure number="1">
    <attributes>
      <divisions>1</divisions>
      <transpose><chromatic>0</chromatic><octave-change>-1</octave-change></transpose>
    </attributes>
    <note><pitch><step>C</step><octave>5</octave></pitch><duration>4</duration><type>whole</type></note>
  </measure></part>
</score-partwise>'''

converter.parse(xml, format='musicxml')

Expected vs. actual behavior

Expected a part that sounds an octave lower than written. Actual:

TypeError: unsupported operand type(s) for +=: 'NoneType' and 'int'

More information

In MeasureParser.xmlTransposeToInterval (musicxml/xmlToM21.py):

if mxOctaveChange is not None:
    octaveChange = int(mxOctaveChange.text) * 12
    diatonicStep += 7 * int(mxOctaveChange.text)

Only adding to diatonicStep when it isn't None should be enough, since the code after this already handles a missing diatonic step.

主要语言
Python
星标
2.6k
派生
459
平均合并
1 天 7 小时
30 天内合并 PR
40

环境准备

在 Codespaces 中打开

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

从这里开始

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

cuthbertLab/music21 的其他 Issue

查看 cuthbertLab/music21 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

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