Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定MIDI文件的时分(以每秒帧数为单位)_Python_Midi - Fatal编程技术网

Python 确定MIDI文件的时分(以每秒帧数为单位)

Python 确定MIDI文件的时分(以每秒帧数为单位),python,midi,Python,Midi,昨天我问了一个关于的问题,但现在我遇到的问题是以每秒帧数显示的时间签名。例如,我有一个MIDI文件,其标题为4d54 6864 0000 0006 0001 0008 0180,其时间签名以每秒帧数为单位。按照上面链接的答案中的说明,我试图分离字节以找到SMPTE格式和每秒帧数,但到目前为止我没有运气。如果这个MIDI文件确实是韵律计时的(例如,每四分之一音符的节拍),那么请举一个如何以每秒帧数解析时间代码的例子。您的例子中的0x0180就是每四分之一音符的节拍。(高位未设置表示此格式,与SMP

昨天我问了一个关于的问题,但现在我遇到的问题是以每秒帧数显示的时间签名。例如,我有一个MIDI文件,其标题为
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(对不起,我搞糊涂了)