如何在music21中删除左反复小节线或添加右反复小节线闭合循环?
问题描述
乐谱第二小节存在<music21.bar.Repeat direction=start>左反复记号,通过以下代码截取1-3小节:
score = converter.parse("midi_files\moonlight_sonata_3rd_movement.mxl") score = score.measures(1,3)
使用score.write("midi", "sample.mid")导出MIDI时,需删除左反复或添加右反复闭合循环,但尝试以下两种方法均无效:
- 方法一:直接将第二小节左小节线设为
None
score.measure(2).leftBarline = None
- 方法二:给第三小节添加右反复
score.measure(3).rightBarline = bar.Repeat(direction='end', times=1)
解决方案
方案1:删除左反复记号
直接设leftBarline = None无法生效,是因为music21会默认保留小节线逻辑,正确做法是将左反复替换为普通小节线,同时确保遍历所有声部(适配多声部乐谱):
from music21 import converter, bar score = converter.parse("midi_files\moonlight_sonata_3rd_movement.mxl") score = score.measures(1,3) # 遍历所有声部,替换第二小节的左反复为普通小节线 for part in score.parts: target_measure = part.measure(2) target_measure.leftBarline = bar.Barline('regular') # 导出MIDI score.write("midi", "sample.mid")
方案2:添加右反复闭合循环
原方法无效可能是因为未遍历声部,或times参数无需显式设置(默认值为1),修正代码如下:
from music21 import converter, bar score = converter.parse("midi_files\moonlight_sonata_3rd_movement.mxl") score = score.measures(1,3) # 遍历所有声部,给第三小节添加右反复记号 for part in score.parts: target_measure = part.measure(3) target_measure.rightBarline = bar.Repeat(direction='end') # 导出MIDI score.write("midi", "sample.mid")
补充说明
- 若乐谱为单声部,可直接操作
score.measure()而非遍历声部,但遍历声部的写法兼容性更强 - 修改小节线后无需额外刷新结构,直接调用
write()即可导出
内容的提问来源于stack exchange,提问作者user29803150
相关产品推荐
相关产品推荐

