繁体   English   中英

确定 MIDI 文件的调号

[英]Determine the key signature of a MIDI file

我在解析 MIDI 文件的键签名时遇到问题。 拍号应采用ff 59 02 sf mi的形式。 官方 MIDI 文档说sf应该是 7 到 -7 之间的值,而mi是 0 或 1。我假设当sf为负时,它使用二进制补码存储,但我怎么知道我正在读取的值是否在二进制补码中?

在我看来,如果该字节在负数时存储在二进制补码中,那么在正数时它也存储在二进制补码中。 二进制补码的卖点之一是正值的表示与其无符号二进制对应物相同。 例如, 0001在任一表示中都是 +1。 这意味着根据值是否为正,数据格式在二进制补码和无符号二进制之间交替是没有意义的。

如果您想知道是否有一种简单的方法可以将二进制补码编码的字节转换为有符号整数值,您可以使用struct模块。

>>> import struct
>>> data = bytes([0xff, 0x59, 0x02, 0xf9, 0x01])
>>> struct.unpack("xxxbb", data)
(-7, 1)

这里的“xxxbb”值表示前三个字节应该被忽略,接下来的两个字节是有符号的数字,每个占8位。


也可以通过中间转换为字节来解压存储在字符串列表中的数据:

import struct
data = ["ff", "59", "02", "f9", "01"]
data = bytes(int(x, 16) for x in data)
print(struct.unpack("xxxbb", data))

sf 是有符号字符,读作 struct.unpack('b', byte)

mi 是无符号字节,将其读取为 struct.unpack('B', byte)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM