首页 > 解决方案 > 如何处理多个音轨中重复的note_on、note_off、速度变化以及midi文件中没有program_change的轨道?

问题描述

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

我解析的一些文件有多个note_on,导致同一音高的音符和同一程序被多次打开。

某些文件包含多个note_off导致尝试关闭由于之前关闭而不再打开的音符(假设同一程序和相同音高只能打开一个音符)。

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

某些文件有多个包含set_tempo消息的轨道。

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

标签: midimido

解决方案


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

MIDI 规范说:

分配注释开/关命令

如果乐器接收到两个或多个具有相同键号和 MIDI 通道的 Note On 消息,它必须确定如何处理额外的 Note On。由接收者决定是否发出相同的声音或另一个声音,或者是否忽略消息。但是,发送器必须为每个发送的 Note On 发送相应的 Note Off 消息。如果发射器只发送一个 Note Off 消息,并且如果接收器实际上将两个 Note On 消息分配给不同的声音,那么一个音符会持续存在。由于发送多余的 Note Off 消息没有危害或负面影响,因此这是推荐的做法。


通用 MIDI 系统级别 1 开发人员指南说,为了响应“GM System On”消息,设备应将 Program Change 设置为 0。因此,您可以假设这是具有音符但没有先前 Program Change 的通道的初始值.


标准 MIDI 文件规范说

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

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


推荐阅读