从 MIDI 中提取音符开始

Posted

技术标签:

【中文标题】从 MIDI 中提取音符开始【英文标题】:Extracting note onset from MIDI 【发布时间】:2010-05-28 11:17:25 【问题描述】:

我需要从复音(高音和低音有 2 个乐谱 - 低音也可能有和弦)MIDI 文件中提取音乐特征(音符详细信息 -> 音高、持续时间、节奏、响度、音符开始时间)。我正在使用 jMusic API 从 MIDI 文件中提取这些详细信息。我的方法是遍历每个乐谱,分成部分,然后是短语,最后是音符,然后提取细节。

使用我的方法,它首先读取所有高音音符,然后读取低音音符 - 但没有捕捉和弦(即只记录和弦的一个音符),我无法确定从哪一点开始是低音音符. 所以我尝试的是获取音符开始(即播放音符的开始时间) - 因为在乐曲开头的高音和低音音符的开始时间应该相同 - 但我无法使用提取音符开始jMusic API。对于每个音符,它显示 0.0。

有什么方法可以识别音符的声音(高音或低音)?还有和弦的所有音符?每个音符的声音或音符开始是如何存储在 MIDI 中的?每个 MIDI 文件都不同吗?

非常感谢任何见解。提前致谢

【问题讨论】:

您的条款有问题。 #1:“高音 2 分……MIDI 文件”。什么是“分数”?你的意思是 2 个“五线谱”,高音和低音,就像钢琴乐谱?但是 MIDI 没有“乐谱”或“五线谱”,它有“通道”(每个通道是不同的乐器),每个通道可能是复音的(同时播放多个音符)。解释一下? 是的,我指的是高音和低音。我不知道 MIDI 没有乐谱。感谢您消除我的误解。但是,你怎么知道一个特定的音符属于高音还是低音呢?这些通道是预定义的还是取决于注释?一个通道可以代表几个音符吗?如果可以,它们可以用来表示和弦吗?我真正需要的是从 MIDI 中提取这些音乐特征,这样我就可以对另一组音乐特征进行比较——作为钢琴演奏评估者的目的。感谢您关心康拉德。 你还没有解释什么是“分数”;因为你使用这个词的方式似乎与我所知道的“乐谱”术语不同。 “你怎么知道一个特定的音符属于高音还是低音”:你的意思是,一个音符属于高音还是低音五线谱?在一般情况下,您无法“知道”,因为 MIDI 不携带此信息。如果您想将 MIDI 音符放在高音和低音五线谱上,您必须自己决定使用哪些五线谱;这可能是一个非常高级的问题。 频道不是“预定义的”,也不是“依赖于注释”。通道可让您在单个 MIDI 流中为几种不同的乐器指定音符。例如,您可以指定 MIDI 通道 1 为“钢琴”,MIDI 通道 2 为“长笛”,MIDI 通道 3 为“贝司”,MIDI 通道 10 为“鼓”,然后放置钢琴、长笛、贝司和鼓同一 MIDI 流中的音符。 【参考方案1】:

你可能想看看这个问题:Actual note duration from MIDI duration

讨论了从 MIDI 文件中提取音符的可能方法。

考虑一个 MIDI 文件可以在多个轨道上分割(“类型 1”midifile)。

识别音符后,识别和弦仍然很棘手。假设您有 3 个音符:C、E、G “同时”发生(即在小节中被确定为在同一点发声)。它们什么时候被认为是 C 大调和弦?

在同一频道播放 由同一种乐器演奏(即使在不同的频道上) 即使它们出现在不同的轨道上,也会在同一个频道上播放

Midifile 格式非常简单(甚至可能太简单了!!)我建议你在这里看看它的描述:http://duskblue.org/proj/toymidi/midiformat.pdf

【讨论】:

感谢 Remo 的洞察力。我正在浏览你的链接——需要一点时间才能搞定。我只为钢琴这样的单一乐器相同的频道这样做。那么如果两个音符一起演奏(高音和低音),这两个音符是否在同一个通道中?那么对于一个和弦来说——一个和弦中的所有音符——它们是否在同一个通道/音轨中?这对于所有 MIDI 文件都是一样的,还是对于每个 MIDI 文件都不同——取决于它是如何写入 MIDI 的?轨道和频道之间有什么区别?同时,我会阅读 MIDI 规范。提前谢谢 Midifile 没有“高音”或“低音”五线谱的概念。音符 60 是中间 C(乐谱中位于低音和高音五线谱之间的一个),您可以相应地放置其他音符。音符不需要在同一个通道上,也不需要在同一个轨道上,这取决于midifile是如何创建的。这听起来比实际上更复杂。如果您不想直接处理位和字节,您可以使用 midi-to-text 实用程序并对 midifile 的文本表示进行分析。您可以在此处找到此类工具之一:midiox.com(在页面中查找“text to midi”) 嗨 Remo - 你能建议一个从 midi 中提取音符开始的起点吗?您的建议 - 这可以通过 Java Sound API 实现吗?还是我必须从头开始编码?我需要先找到一个开始的方法。对延迟发表评论和打扰表示歉意。提前致谢。

以上是关于从 MIDI 中提取音符开始的主要内容,如果未能解决你的问题,请参考以下文章

BLE MIDIMIDI 时间标志分析 ( 音符速度设置事件 | 拍号设置事件 | 基本时间 - 每个四分音符有多少 tick 或 pulse | 节拍时值计算 | 小节时值计算 )

iOS AUSampler 连续播放 MIDI 音符

用于 MIDI 到乐谱(注释)和/或音频翻译的纯 python 库

如何将从音轨 1 提取的速度应用到 MIDI 文件的其他音轨?

使用 AudioKit 从 MIDI 文件中读取音符

使用 Music21(或替代方法)从 MIDI 中提取休止符并写入单独的 MIDI 轨道