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

如何避免Music21提取MIDI时切割跨小节音符?

解决Music21跨小节音符被切割的问题

Music21默认会把跨小节的音符拆分成带连线的两段,要避免这种情况,你可以使用mergeTies()方法将拆分后的连线音符合并回完整的单个音符。这样就能保留原始音符的完整时长,且只会在起始小节计数一次。

修改后的代码:

mf = converter.parse(midi_progenitor, quantizePost=False)
# 合并跨小节的连线音符
mf.parts[0].mergeTies(inPlace=True)
t = mf.parts[0].flatten() 
notas_por_compas = {}
diccionario_progenitor = {}
num_compases = len(mf.parts[0].getElementsByClass('Measure'))
tipo_compas = mf.getTimeSignatures()[0].ratioString
print("- Tipo de compás:", tipo_compas,"-")
h = 0
print("Nota compas t_inicio Alt_Num Alt_Lit Duracion")
for n in t.flatten().notes:
    altura_numerica = n.pitches[0].midi
    altura_literal = n.pitches[0].nameWithOctave
    momento_inicio = n.offset  # Posición absoluta de la nota n desde el inicio de la obra, ya es float
    duracion = n.duration.quarterLength
    compas = n.measureNumber
    print(f" {h:<5} {compas:<5} {momento_inicio:<8.4g}    {altura_numerica:<3}     {altura_literal:<3}     {duracion:<6.4g} ")

关键说明:

  • mergeTies(inPlace=True)会直接在原声部上修改,将所有连续的连线音符合并为一个完整音符,保留其总时长和起始位置。
  • 合并后,跨小节的音符只会在它的起始小节被统计,不会再在后续小节生成重复条目,解决了音符数量虚增的问题。
  • 如果你需要保留原始声部的结构,可以去掉inPlace=True,将结果赋值给新变量:merged_part = mf.parts[0].mergeTies()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 18:03:12