使用music21正确获取MIDI文件time signature(拍号)的方法咨询
问题原因
你调用score.parts[0].timeSignature返回None,是因为这个属性只会读取第一声部(轨道)开头定义的拍号。很多自制MIDI、游戏MIDI不会严格遵循标准规范,可能把拍号事件存在其他轨道、或者轨道的非开头位置,甚至全曲没有写拍号事件。
通用获取拍号的方法
全局遍历整个乐谱的所有元素,提取所有拍号事件即可:
import music21 path = '目标MIDI文件路径' score = music21.converter.parse(path) # 递归提取所有拍号元素 time_sig_list = list(score.recurse().getElementsByClass(music21.meter.TimeSignature)) if time_sig_list: # 取首个出现的拍号,如有变拍需求可按索引取对应位置的拍号 time_signature = time_sig_list[0].ratioString else: # 没有写入拍号的MIDI默认遵循4/4拍规范 time_signature = "4/4"
如果需要获取全曲所有节点的拍号(比如处理中途变拍的情况),可以遍历拍号列表输出对应的位置和值:
for ts in time_sig_list: print(f"时间偏移{ts.offset}处的拍号:{ts.ratioString}")
内容的提问来源于stack exchange,提问作者duhaime
相关产品推荐
相关产品推荐

