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
相关产品推荐
相关产品推荐

