我正在寻找将字符串表示的音符作为输入的算法,并将和弦的名称作为输出。
例如:
chordName("C", "E", "G")
>>> "C major"
chordName("C", "E", "G", "B")
>>> "C major 7"
chordName("A", "C", "E")
>>> "A minor"
答案 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)
不是一个完整的解决方案,但也许可以让你开始:
您应该首先将所有可能的音调定义为数组,如
var scale = [['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'] ,. .. 这实际上是一个小数组的数组,其中包含“相同”注释的所有可能名称。我知道纯粹主义者会坚持认为F#和Gb根本不同,但在钢琴键盘上它们位于相同的键后面。比例数组应与自身组合以跨越多个八度音程。
然后应在比例数组中找到和弦数组的组成部分。它们在比例数组中的相对位置是指纹,它允许识别和弦。
需要设置另一个数组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()函数,我引用:“命名一个和弦。几乎可以确定每个和弦,从简单的三重奏到十四音符多弦乐。”