标准MIDI文件使用什么编码?
这个问题的背景是这样的:
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 个回答
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 文件的结构是什么样的?