文本,基于字符串的和弦识别算法?

时间:2013-07-30 19:14:36

标签: algorithm music-notation

我正在寻找将字符串表示的音符作为输入的算法,并将和弦的名称作为输出。

例如:

chordName("C", "E", "G")
>>> "C major"
chordName("C", "E", "G", "B")
>>> "C major 7"
chordName("A", "C", "E")
>>> "A minor"

3 个答案:

答案 0 :(得分:2)

Tutting我自己的号角(也就是说,我是图书馆的首席开发人员,当然有偏见),但是你可以做音乐21(http://web.mit.edu/music21/):

>>> from music21 import chord
>>> chord.Chord(['C','E','G']).pitchedCommonName
'C-major triad'    
>>> chord.Chord(['C','E','G','B']).pitchedCommonName
'C-major seventh chord'

或更隐蔽的事情......

>>> chord.Chord(['C','C#','D','E','F#']).pitchedCommonName
'D-tritone-expanding pentachord'

Chord(http://web.mit.edu/music21/doc/moduleReference/moduleChord.html)的完整文档将帮助您弄清楚如何以您想要的格式获取文本输出。

答案 1 :(得分:1)

不是一个完整的解决方案,但也许可以让你开始:

  1. 您应该首先将所有可能的音调定义为数组,如

    var scale = [['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'] ,. .. 这实际上是一个小数组的数组,其中包含“相同”注释的所有可能名称。我知道纯粹主义者会坚持认为F#和Gb根本不同,但在钢琴键盘上它们位于相同的键后面。比例数组应与自身组合以跨越多个八度音程。

  2. 然后应在比例数组中找到和弦数组的组成部分。它们在比例数组中的相对位置是指纹,它允许识别和弦。

  3. 需要设置另一个数组chordtypes来保存“和弦类型指纹”,如

    CTFP = { '主要':[4,3,5], '次要':[3,4,5],...

答案 2 :(得分:1)

查看Mingus Python库的和弦模块源代码,了解基于字符串输入的和弦识别算法示例:

https://code.google.com/p/mingus/

https://code.google.com/p/mingus/source/browse/mingus/core/chords.py

和弦模块中的determine()函数,我引用:“命名一个和弦。几乎可以确定每个和弦,从简单的三重奏到十四音符多弦乐。”