如何处理多个音轨中重复的note_on,note_off,速度改变以及在midi文件中没有program_change的音轨?

时间:2019-05-16 16:51:46

标签: midi mido

我正在将Mido用于python,致力于将midi文件解析为<start_time, duration, program, pitch>元组,并遇到了一些问题。

我解析的某些文件具有多个note_on,从而导致音高相同且同一程序被多次打开。

某些文件包含多个note_off,导致尝试关闭由于之前已关闭而不再打开的音符(假定可以在同一程序和相同音高下打开一个音符)。

某些曲目在曲目的开头没有program_change(甚至更糟的是,甚至在整个曲目中都没有)。

某些文件具有多个轨道,其中包含set_tempo条消息。

在每种情况下我该怎么做以确保得到正确的解释?

1 个答案:

答案 0 :(得分:1)

通常,要获取正确的MIDI消息流,必须将所有音轨合并为1型文件。对于合成器而言,重要的不是音轨,而是频道。

MIDI规范说:

  

分配音符开/关命令

     

如果乐器收到两个或更多具有相同键号和MIDI通道的Note On消息,则必须确定如何处理其他Note On。由接收方决定是否发出相同的语音或其他语音,或者是否忽略消息。但是,发送器必须为发送的每个“音符开启”发送相应的“音符关闭”消息。如果发送方仅发送一条“音符关闭”消息,并且实际上接收方将两条“音符打开”消息分配给了不同的语音,则一个音符会持续存在。由于发送多余的Note Off消息没有任何危害或负面影响,因此建议您这样做。


通用MIDI系统第1级开发人员指南说,响应“ GM System On”消息,设备应将Program Change设置为0。因此,您可以将其设为具有音符但不带有音符的通道的初始值。之前的程序更改。


标准MIDI文件规范说

  

速度信息应始终存储在第一个MTrk块中。

但是“应该”不是“必须”。