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