midi - 如何处理多个音轨中重复的note_on、note_off、速度变化以及midi文件中没有program_change的轨道?
问题描述
我正在使用Mido
python,将midi文件解析为<start_time, duration, program, pitch>
元组并遇到了一些问题。
我解析的一些文件有多个note_on
,导致同一音高的音符和同一程序被多次打开。
某些文件包含多个note_off
导致尝试关闭由于之前关闭而不再打开的音符(假设同一程序和相同音高只能打开一个音符)。
有些曲目在曲目的开头没有一个program_change
(或者更糟糕的是,甚至在整个曲目中都没有一个)。
某些文件有多个包含set_tempo
消息的轨道。
在每种情况下我应该怎么做才能确保我得到正确的解释?
解决方案
通常,要获得正确的 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 块中。
但“应该”不是“必须”。
推荐阅读
- javascript - 如何从 xml 模式中读取元素值?
- ios - 如何快速获取 iCloud 图片 URL
- java - java.lang.IllegalStateException:找不到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration
- asp.net-core - asp.net core social authentication - 这个代码是为后端设计的,还是只为客户端设计的?
- db2 - 如何在部署在 Watson Studio 上的 Jupyter 中运行魔术命令?
- php - 在重定向到注册或正常的 Laravel 注册之前,我需要检查我的用户是否存在于我的数据库中
- kubernetes - 有没有办法在 ibm cloud 中收集免费 Kubernetes 集群的指标数据?
- ios - 如何在 iOS 中使用本机控制播放 twitch.tv 直播视频?
- java - 在 Java 中注册时发送激活邮件
- macros - 如何解绑罗技 G910 MR 钥匙