我正在尋找以字符串表示的筆記作爲輸入並生成和絃的名稱作爲輸出的算法。文本,基於字符串的和絃識別算法?
例如:
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