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



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

例如:

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

自吹自擂(即,我是库的主要开发人员,当然有偏见),但使用music21(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. 您应该首先将所有可能的音调定义为一个类似的阵列

    var scale=[['B#','C'],['C#','Db'],[E'],'[F]',['F#','Gb']。。。这实际上是一个由小数组组成的数组,具有"同一"音符的所有可能名称。我知道纯粹主义者会坚持认为F#和Gb根本不同,但在钢琴键盘上,它们位于同一个键后面。刻度阵列应与自身组合,以跨越一个以上的倍频程。

  2. 弦阵列的分量然后应该在比例阵列中找到。它们在音阶阵列中的相对位置是指纹,可以识别和弦。

  3. 需要设置另一个数组弦型,以保存类似的"弦型指纹"

    ctfp={‘主要’:[4,3,5],‘次要’:[3,4,5],…

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新