如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?

Posted

技术标签:

【中文标题】如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?【英文标题】:How to handle duplicate note_on, note_off, tempo change in more than one tracks, and tracks without program_change in a midi file? 【发布时间】:2019-05-16 16:51:46 【问题描述】:

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

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

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

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

有些文件有不止一个轨道包含set_tempo 消息。

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

【问题讨论】:

对于 MIDI 设备,音轨无关紧要。这些命令是否在同一个频道上? @CL。是的,同一个频道。 【参考方案1】:

一般来说,要获得正确的 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。因此,您可以假设这是具有音符但没有音符的通道的初始值之前的计划变更。


标准 MIDI 文件规范表明

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

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

【讨论】:

是不是,解析结果由我做最终决定?另外,您对没有默认程序的频道有任何想法吗?

以上是关于如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?的主要内容,如果未能解决你的问题,请参考以下文章

在android中播放音轨中的音频

如何在音轨中找到静音部分

Javascript 从音轨中选择片段

如何在音轨中的特定点触发事件或回调?

如何处理重复hosts?

如何处理谷歌表格脚本中的重复项?