2013-07-30 17 views
6

Ich suche nach Algorithmen, die Noten, die durch Strings als Eingabe dargestellt werden, aufnehmen und den Namen des Akkords als Ausgabe erzeugen.Text, string-basierte Akkorderkennung Algorithmen?

Zum Beispiel:

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

[Hier könnte Ihnen etwas helfen.] (Https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh

+2

@Josh "# TODO: Akkordidentifikation" :( – Rob

Antwort

2

Tut mir mein eigenes Horn (dh ich bin der Hauptentwickler der Bibliothek, so voreingenommen, natürlich), aber mit music21 (http://web.mit.edu/music21/) können Sie tun:

>>> from music21 import chord 
>>> chord.Chord(['C','E','G']).pitchedCommonName 
'C-major triad'  
>>> chord.Chord(['C','E','G','B']).pitchedCommonName 
'C-major seventh chord' 

oder Unbekannte Dinge ...

>>> chord.Chord(['C','C#','D','E','F#']).pitchedCommonName 
'D-tritone-expanding pentachord' 

die vollständige Dokumentation für Chord (http://web.mit.edu/music21/doc/moduleReference/moduleChord.html) werden Ihnen helfen, herauszufinden, wie man in genau das Format die Textausgabe erhalten Sie wollen.

+0

Welchen Algorithmus haben Sie implementiert? Wissen Sie, wo ich Literatur, Methodik oder Studien über Akkorderkennungsalgorithmen finden kann? – Rob

+1

Ich kann mich nicht genau erinnern, wo wir die Liste der Namen haben (ich denke, es ist in den Dokumenten für den Code mit einer Bestätigung), aber wir reduzieren alle Akkorde auf ihre Normalform (chord.Chord(). NormalForm) und dann Machen Sie einen Vergleich mit der gespeicherten Liste. Dann finden wir die Wurzel des Chords basierend auf einer Funktion - für Standardakkorde ist es nicht schwer, die Wurzel zu finden. Für sehr komplexe Akkorde verwenden wir unseren eigenen Algorithmus, der vielleicht nicht richtig ist, aber er scheint ziemlich gut zu funktionieren. –

+1

Oh, schau hier http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords für weitere Informationen. –

1

keine vollständige Lösung, aber vielleicht etwas für den Anfang:

  1. Sie sollten wie bei der Definition alle möglichen Töne in ein Array starten

    var Maßstab = [['B #', 'C'], ['C#', 'Db'], ['E'], '[F]', ['F #', 'Gb'], ... Dies ist ist eigentlich ein Array von kleinen Arrays mit allen möglichen Namen für die 'gleiche' Note. Ich weiß, Puristen werden darauf bestehen, dass F # und Gb grundsätzlich anders sind, aber auf der Klaviertastatur liegen sie hinter derselben Taste. Das Skalenfeld sollte mit sich selbst kombiniert werden, um mehr als eine Oktave zu überspannen.

  2. Die Komponenten des Akkordarrays sollten sich dann im Skalenfeld befinden. Ihre relativen Positionen in der Skalenanordnung sind der Fingerabdruck, der es ermöglicht, den Akkord zu identifizieren.

  3. ein anderes Array chordtypes muss eingerichtet werden, die "Akkordtyp Fingerabdrücke" wie

    CTFP halten = { 'major': [4,3,5], 'minor': [3,4,5 ], ...

+0

Ich habe bereits mit verschiedenen Ansätzen experimentiert, die für einfache Triaden und zwei überlagerte Triaden (7. Akkorde) funktionieren. Jetzt suche ich nach anderen Implementierungen, die mit Inversionen und anderen Akkorden umgehen können, die nicht auf Triaden basieren. Zu dem Thema finde ich keine Literatur, ich bin verloren. Zur Klarstellung: Ich arbeite an einer Open-Source-Bibliothek für Python und Java für programmatische Musikentwicklung und -studien. Ich bin der effizienteste Algorithmus für die Akkorderkennung, kann aber keine finden. Viele Programme tun dies bereits, können aber die eigentlichen Algorithmen/Codes nicht finden. – Rob

+0

Es wird sicherlich komplizierter, wenn Sie wirklich alle möglichen Inversionen und Akkorde mit fehlenden individuellen Tönen identifizieren wollen. Aber im Grunde, indem man nach einem Minimum an Intervallen in dem Akkordtyp-Fingerabdruck sucht (seine Unteranordnungen müssen ebenfalls erweitert werden, um alle möglichen Inversionen aufzunehmen), sollte Sie weiter bringen. – cars10m