我正在寻找以字符串表示的笔记作为输入并生成和弦的名称作为输出的算法。文本,基于字符串的和弦识别算法?
例如:
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"
我自己的号角(即,我是图书馆的首席开发人员,当然有偏见),但音乐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'
和弦(http://web.mit.edu/music21/doc/moduleReference/moduleChord.html完整文档)将帮助你找出如何让文本输出完全相同的格式,你想要。
你实现了什么算法?你知道我可以在哪里找到有关和弦识别算法的文献,方法论或研究吗? – Rob
我不记得确切的名字清单(我认为它是在带有确认的代码的文档中),但是我们将所有的和弦减少到它们的正常形式(chord.Chord()。normalForm),然后与存储的列表进行比较。然后我们根据那里的函数找到Chord的根 - 对于标准和弦来说,找到根并不难。对于非常复杂的和弦,我们使用我们自己的算法,可能不正确,但它似乎工作得很好。 –
哦,看看这里http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords了解更多信息。 –
不是一个完整的解决方案,但或许真的让你开始:
你应该确定所有可能的音调到一个数组一样
VAR启动scale = [['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'],... This实际上是一个包含'相同'音符的所有可能名称的小阵列数组。我知道纯粹主义者会坚持认为F#和Gb有着根本的不同,但是在钢琴键盘上他们居住在同一把钥匙后面。音阶数组应该与自身结合以跨越一个八度音阶。
然后可以在比例数组中找到和弦数组的组成部分。它们在音阶数组中的相对位置是允许识别和弦的指纹。
另一个阵列chordtypes需要设置保持 “和弦类型指纹” 等
CTFP = { '主要':[4,3,5], '次要':[3,4,5 ] ...
看看在明格斯Python库的和弦模块的源代码基于字符串输入和弦识别算法的一个例子:
https://code.google.com/p/mingus/
https://code.google.com/p/mingus/source/browse/mingus/core/chords.py
在和弦模块中的判断()函数,我引用:“命名和弦。可以确定几乎每一个和弦,从一个简单的三元组到十四个音符的多弦。“
[这里有些东西可以帮助你。](https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh
@Josh “#TODO:Chord identification”:( – Rob