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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:57:39