2013-07-30 33 views
6

我正在寻找以字符串表示的笔记作为输入并生成和弦的名称作为输出的算法。文本,基于字符串的和弦识别算法?

例如:

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

[这里有些东西可以帮助你。](https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh

+2

@Josh “#TODO:Chord identification”:( – Rob

回答

2

我自己的号角(即,我是图书馆的首席开发人员,当然有偏见),但音乐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完整文档)将帮助你找出如何让文本输出完全相同的格式,你想要。

+0

你实现了什么算法?你知道我可以在哪里找到有关和弦识别算法的文献,方法论或研究吗? – Rob

+1

我不记得确切的名字清单(我认为它是在带有确认的代码的文档中),但是我们将所有的和弦减少到它们的正常形式(chord.Chord()。normalForm),然后与存储的列表进行比较。然后我们根据那里的函数找到Chord的根 - 对于标准和弦来说,找到根并不难。对于非常复杂的和弦,我们使用我们自己的算法,可能不正确,但它似乎工作得很好。 –

+1

哦,看看这里http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords了解更多信息。 –

1

不是一个完整的解决方案,但或许真的让你开始:

  1. 你应该确定所有可能的音调到一个数组一样

    VAR启动scale = [['B#','C'],['C#','Db'],['E'],'[F]',['F#','Gb'],... This实际上是一个包含'相同'音符的所有可能名称的小阵列数组。我知道纯粹主义者会坚持认为F#和Gb有着根本的不同,但是在钢琴键盘上他们居住在同一把钥匙后面。音阶数组应该与自身结合以跨越一个八度音阶。

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

  3. 另一个阵列chordtypes需要设置保持 “和弦类型指纹” 等

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

+0

我已经尝试了适用于简单黑社会和两个叠加黑社会(第七和弦)的不同方法。现在我正在寻找其他可以处理反转和其他基于三元组的和弦的实现。我找不到关于这个主题的任何文献,但我迷失了。澄清:我正在开发一个用于Python和Java的开源库,用于编程音乐开发和研究。我是处理和弦识别的最有效的算法,但找不到任何。许多程序已经这样做了,但是找不到实际的算法/代码。 – Rob

+0

当你真的想识别所有可能的反转和和弦并且缺少单个音调时,它肯定会变得更加复杂。但基本上,通过在和弦类型指纹中寻找最小间隔(它的子数组需要扩展以适应所有可能的反转),应该可以让你进一步。 – cars10m