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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:06:03