我正在将Mido
用于python,致力于将midi文件解析为<start_time, duration, program, pitch>
元组,并遇到了一些问题。
我解析的某些文件具有多个note_on
,从而导致音高相同且同一程序被多次打开。
某些文件包含多个note_off
,导致尝试关闭由于之前已关闭而不再打开的音符(假定可以在同一程序和相同音高下打开一个音符)。
某些曲目在曲目的开头没有program_change
(甚至更糟的是,甚至在整个曲目中都没有)。
某些文件具有多个轨道,其中包含set_tempo
条消息。
在每种情况下我该怎么做以确保得到正确的解释?
答案 0 :(得分:1)
通常,要获取正确的MIDI消息流,必须将所有音轨合并为1型文件。对于合成器而言,重要的不是音轨,而是频道。
MIDI规范说:
分配音符开/关命令
如果乐器收到两个或更多具有相同键号和MIDI通道的Note On消息,则必须确定如何处理其他Note On。由接收方决定是否发出相同的语音或其他语音,或者是否忽略消息。但是,发送器必须为发送的每个“音符开启”发送相应的“音符关闭”消息。如果发送方仅发送一条“音符关闭”消息,并且实际上接收方将两条“音符打开”消息分配给了不同的语音,则一个音符会持续存在。由于发送多余的Note Off消息没有任何危害或负面影响,因此建议您这样做。
通用MIDI系统第1级开发人员指南说,响应“ GM System On”消息,设备应将Program Change设置为0。因此,您可以将其设为具有音符但不带有音符的通道的初始值。之前的程序更改。
标准MIDI文件规范说
速度信息应始终存储在第一个MTrk块中。
但是“应该”不是“必须”。