Python 确定MIDI文件的时分(以每秒帧数为单位)
昨天我问了一个关于的问题,但现在我遇到的问题是以每秒帧数显示的时间签名。例如,我有一个MIDI文件,其标题为Python 确定MIDI文件的时分(以每秒帧数为单位),python,midi,Python,Midi,昨天我问了一个关于的问题,但现在我遇到的问题是以每秒帧数显示的时间签名。例如,我有一个MIDI文件,其标题为4d54 6864 0000 0006 0001 0008 0180,其时间签名以每秒帧数为单位。按照上面链接的答案中的说明,我试图分离字节以找到SMPTE格式和每秒帧数,但到目前为止我没有运气。如果这个MIDI文件确实是韵律计时的(例如,每四分之一音符的节拍),那么请举一个如何以每秒帧数解析时间代码的例子。您的例子中的0x0180就是每四分之一音符的节拍。(高位未设置表示此格式,与SMP
4d54 6864 0000 0006 0001 0008 0180
,其时间签名以每秒帧数为单位。按照上面链接的答案中的说明,我试图分离字节以找到SMPTE格式和每秒帧数,但到目前为止我没有运气。如果这个MIDI文件确实是韵律计时的(例如,每四分之一音符的节拍),那么请举一个如何以每秒帧数解析时间代码的例子。您的例子中的0x0180
就是每四分之一音符的节拍。(高位未设置表示此格式,与SMPTE相反)。
要将其转换为绝对计时,您需要查找设置节拍(0x51)元事件。
那些通常(总是?)在第一个MTrk块中,看起来像这样:
0xff 0x51 0x03 0x11 0x22 0x33
…表示每四分之一音符的节奏为0x112233
微秒
给定MThd中每季度票据的滴答声和MTrk中每季度票据的微秒数,您可以计算滴答声的绝对计时。请注意,如果出现另一个设定节拍事件,这应该会改变
规范中提到了SMPTE计时:
如果的位15为1,则文件中的增量时间对应于秒的细分,单位为
一种与SMPTE和MIDI时间码一致的方式。位14到8包含四个位中的一个
值-24、-25、-29或-30,对应于四个标准SMPTE和MIDI时间码
格式(-29对应于30个放置帧),并表示每秒的帧数。
这些负数以2的补码形式存储。第二个字节(已存储)
正)是一帧内的分辨率:典型值可能是4(MIDI时间码分辨率),
8、10、80(位分辨率)或100。该系统允许基于时间码的精确指定
轨迹,但也允许通过指定25帧/秒和
每帧40个单元。如果文件中的事件以30帧时间的位分辨率存储
代码,除法字是E250十六进制
…基本上,高字节是每秒帧数,低字节是每帧滴答声。示例中的
0x0180
是每四分之一音符滴答声。(高位未设置表示此格式,与SMPTE相反)。
要将其转换为绝对计时,您需要查找设置节拍(0x51)元事件。
那些通常(总是?)在第一个MTrk块中,看起来像这样:
0xff 0x51 0x03 0x11 0x22 0x33
…表示每四分之一音符的节奏为0x112233
微秒
给定MThd中每季度票据的滴答声和MTrk中每季度票据的微秒数,您可以计算滴答声的绝对计时。请注意,如果出现另一个设定节拍事件,这应该会改变
规范中提到了SMPTE计时:
如果的位15为1,则文件中的增量时间对应于秒的细分,单位为
一种与SMPTE和MIDI时间码一致的方式。位14到8包含四个位中的一个
值-24、-25、-29或-30,对应于四个标准SMPTE和MIDI时间码
格式(-29对应于30个放置帧),并表示每秒的帧数。
这些负数以2的补码形式存储。第二个字节(已存储)
正)是一帧内的分辨率:典型值可能是4(MIDI时间码分辨率),
8、10、80(位分辨率)或100。该系统允许基于时间码的精确指定
轨迹,但也允许通过指定25帧/秒和
每帧40个单元。如果文件中的事件以30帧时间的位分辨率存储
代码,除法字是E250十六进制
…基本上,高字节是每秒帧数,低字节是每帧滴答数。是的,但是如果MThd是在绝对计时中记录的呢?如何将其转换为每拍的滴答声?据我所知,您的解释仅适用于类型2 MIDI,因为类型0将在音轨的开头有节奏数据,类型1将有第一个MTrk作为全局节奏音轨。使用SMPTE更新了答案。在第二类中,我不确定你可能会在每一个音轨上找到一个固定的节奏。我处理过的文件在MThd中都是类型1,每个qnote都有记号。所以如果我有
03c0
,它看起来是以每秒帧数为单位的,因为十进制值是960,但第一位是零。03c0
仍然是每个qnote的记号0000
-7fff
是每个qnote的记号,8000
-ffff
是SMPTE。因此,如果03c0
是每个qnote的记号,那么每个qnote有多少个记号是bc,十进制值是960(对不起,我很困惑)是的,但是如果MThd是以绝对计时记录的呢?如何将其转换为每拍的滴答声?据我所知,您的解释仅适用于类型2 MIDI,因为类型0将在音轨的开头有节奏数据,类型1将有第一个MTrk作为全局节奏音轨。使用SMPTE更新了答案。在第二类中,我不确定你可能会在每一个音轨上找到一个固定的节奏。我处理过的文件在MThd中都是类型1,每个qnote都有记号。所以如果我有03c0
,它看起来是以每秒帧数为单位的,因为十进制值是960,但第一位是零。03c0
仍然是每个qnote的记号0000
-7fff
是每个qnote的刻度,8000
-ffff
是SMPTE。因此,如果03c0
是每个qnote的刻度,那么每个qnote的刻度是多少,十进制值是960(对不起,我搞糊涂了)