2013-07-30 34 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