我有一系列MIDI音符以MIDI音符编号的形式存储在数组中。有没有一种算法可以让我获得这些音符所代表的歌曲的关键和音阶?
答案 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"作为比例名称。