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

Amr*_*ham 9 algorithm midi audio-processing

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

Mic*_*ert 14

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

import music21
score = music21.converter.parse('filename.mid')
key = score.analyze('key')
print(key.tonic.name, key.mode)
Run Code Online (Sandbox Code Playgroud)

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

key1 = score.analyze('Krumhansl')
key2 = score.analyze('AardenEssen')
Run Code Online (Sandbox Code Playgroud)

这些方法中的任何一种也适用于和弦.

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


小智 6

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]
Run Code Online (Sandbox Code Playgroud)

计算未知音调矢量和每个参考音调矢量之间的相关系数,并选择最佳匹配.

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