You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.9+music21 v7调用write()出现'Rest'对象无'pitches'属性错误

问题根因

该报错不是write()函数直接变更导致,属于music21 7版本的已知兼容性bug:MIDI导出流程中内部自动调用的stripTies()方法缺失休止符(Rest对象)判断逻辑,旧版本执行该方法时会自动跳过休止符,7版本会直接尝试访问Rest对象不存在的pitches属性,进而触发属性错误。

解决方案

方案1:临时规避(无需修改库源码)

调用写入方法时新增stripTies=False参数,关闭导出时的自动延音线处理逻辑即可避开报错,修改代码如下:

# 将原28行的newscore.write('midi',newFileName)修改为
newscore.write('midi', fp=newFileName, stripTies=False)

如果你需要保留延音线处理能力,可以在写入前手动遍历乐谱所有元素,仅对Note、Chord类型的对象处理延音线,跳过所有Rest对象后再执行写入。

方案2:修复库源码(一劳永逸)

找到本地music21安装路径下的stream/base.py文件,定位到报错的第7166行,在原有判断逻辑前新增休止符判断:

# 原有判断逻辑
# and nLast is not None and len(nLast.pitches) == len(nInner.pitches)):
# 修改为
and nLast is not None 
and not isinstance(nLast, note.Rest) 
and not isinstance(nInner, note.Rest)
and len(nLast.pitches) == len(nInner.pitches)):

方案3:版本升级

直接升级music21到8.0及以上版本,该bug在后续版本中已被官方修复。

内容的提问来源于stack exchange,提问作者labarbacoa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:09:04