确定 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))