是否有算法从一系列音符中获取歌曲的音阶和键?

时间:2013-02-06 17:01:27

标签: algorithm midi audio-processing

我有一系列MIDI音符以MIDI音符编号的形式存储在数组中。有没有一种算法可以让我获得这些音符所代表的歌曲的关键和音阶?

4 个答案:

答案 0 :(得分:11)

如果您使用的是Python,则可以使用music21工具包执行此操作:

import music21
score = music21.converter.parse('filename.mid')
key = score.analyze('key')
print(key.tonic.name, key.mode)

如果你关心密钥查找的特定算法,你可以使用它们而不是通用的“密钥”:

key1 = score.analyze('Krumhansl')
key2 = score.analyze('AardenEssen')

等。任何这些方法也适用于和弦。

(免责声明:music21是我的项目,所以我当然有兴趣推广它;但是你可以看看music21.analysis.discrete模块,从那里获取其他项目/语言的想法。如果你有MIDI解析器,Krumhansl算法并不难实现。)

答案 1 :(得分:5)

Carol Krumhansl的算法是最着名的。基本思路非常简单。从已知键中的音乐中抽取音高的参考样本,并将其转置到其他11个键。主键和次键必须单独处理。然后从未知键中的音乐中抽取音高样本。这为24个参考样本和一个未知样本中的每一个产生12分量间距向量,如:

[ I,        I#,      II,       II#     III,       IV,      IV#,   V,     V#,    VI,     VI#,   VII    ]
[ 0.30,  0.02,  0.10,  0.05, 0.25,  0.20,  0.03, 0.30,  0.05,  0.13, 0.10  0.15]

计算未知音高向量与每个参考音高向量之间的相关系数,并选择最佳匹配。

Craig Sapp撰写(版权)代码,可在http://sig.sapp.org/doc/examples/humextra/keycor/

获取

David Temperley和Daniel Sleator开发了一种不同的,更难的算法作为他们(受版权保护的)Melisma包的一部分,可在 http://www.link.cs.cmu.edu/music-analysis/ftp-contents.html

Kumhansl算法的(免费)Matlab版本可从T. Eerola和P. Toiviainen的Midi工具箱中获得: https://www.jyu.fi/hum/laitokset/musiikki/en/research/coe/materials/miditoolbox

答案 2 :(得分:3)

有一个number of关键发现算法,特别是Carol Krumhansl的算法(我见过的大多数论文总是引用Krumhansl的方法)

答案 3 :(得分:1)

假设没有按键更改,一个简单的算法可以基于音高类直方图(每个音高等级有一个12个条目的数组(每个音符在一个八度音程中)),当你得到一个音符你在正确的条目中添加一个,那么在最后你很可能会有两个最常见的音符,它们将是7个半音(或条目),代表音调和主导,音调是你正在寻找的音符和主导音符以上7个半音或5个半音。

这种方法的好处在于它与尺度无关,它依赖于补品,而主导是两个最重要的音符并且更频繁地发生。通过为一块大块的第一个和最后一个音符赋予额外的权重,可以使算法更加稳健。

至于检测刻度,那么一旦你有了键,你就可以在直方图中生成一个超过某个阈值的音符列表,作为该根音的偏移量,所以让我们说你检测到一个键。 A(从A和E经常出现)并且您拥有的音符是ACDEG然后您将获得偏移0 3 5 7 10,在a database like this one中搜索会给你" Minor Pentatonic"作为比例名称。