标准MIDI文件使用什么编码?

3 投票
2 回答
4989 浏览
提问于 2025-04-18 17:23

这个问题的背景是这样的:

with open(path + "/OneChance1.mid") as f:
  for line in f.readline():
        print(line)

我想读取一个midi文件,看看里面有什么内容。结果我收到了这个错误信息:UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 153: character maps to <undefined>

如果我用open()的第二个参数这样写:with open(path + "/OneChance1.mid", encoding='utf-8) as f:,我又收到了另一个错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 13: invalid start byte

如果我把编码参数改成ascii,我又遇到了一个关于数字超出范围的错误。最后我试了utf-16,结果提示文件没有以BOM开头(这让我莫名其妙地笑了一下)。另外,如果我忽略这些错误,我得到的字符完全和我期待的数据不一样。我对数据的期待是基于这个来源:http://www.sonicspot.com/guide/midifiles.html

总之,有人知道midi文件使用什么编码吗?我在这方面的研究没有结果,所以我觉得在Stack Overflow上问问值得。或者也许有人可以指出其他可能性或错误?

2 个回答

3

这是一个二进制文件,不是你想象中的那种用文本编码的文件。

在Python中,如果你想以二进制模式打开一个文件,可以在调用 open() 函数时,把一个包含 "b" 的字符串作为第二个参数传进去。

这个页面里有关于这种格式的描述。

7

MIDI 文件是二进制内容。如果你把这个文件当作文本文件打开,Python 会用系统默认的编码方式来尝试解码成 Unicode 文本。

所以,应该以二进制模式打开这个文件:

with open(midifile, 'rb') as mfile:
    leader = mfile.read(4)
    if leader != b'MThd':
        raise ValueError('Not a MIDI file!')

如果你想更深入了解这个文件的内容,就需要研究一下MIDI 标准文件格式。还可以看看MIDI 文件的结构是什么样的?

撰写回答