我正在寻找将字符串表示的音符作为输入并产生和弦名称作为输出的算法。
例如:
chordName("C", "E", "G")
>>> "C major"
chordName("C", "E", "G", "B")
>>> "C major 7"
chordName("A", "C", "E")
>>> "A minor"
我正在寻找将字符串表示的音符作为输入并产生和弦名称作为输出的算法。
例如:
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 ) 将帮助您弄清楚如何以您想要的格式获得文本输出。
不是一个完整的解决方案,但也许可以帮助您入门:
您应该首先将所有可能的音调定义为一个数组,例如
var scale=[['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'], ... 这个实际上是一个小数组的数组,其中包含“相同”音符的所有可能名称。我知道纯粹主义者会坚持认为 F# 和 Gb 根本不同,但在钢琴键盘上,它们位于同一个键后面。音阶数组应与自身组合以跨越一个八度音程。
然后应该在音阶数组中找到和弦数组的组件。它们在音阶阵列中的相对位置是允许识别和弦的指纹。
需要设置另一个数组 chordtypes 来保存“和弦类型指纹”,例如
ctfp={'主要':[4,3,5],'次要':[3,4,5],...
看一下 Mingus Python 库的 chords 模块源码,一个基于字符串输入的和弦识别算法示例:
https://code.google.com/p/mingus/
https://code.google.com/p/mingus/source/browse/mingus/core/chords.py
和弦模块中的确定()函数,我引用:“命名一个和弦。几乎可以确定每个和弦,从简单的三和弦到十四个音符的多和弦。”