如何避免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
相关产品推荐
相关产品推荐

