2013-07-30 35 views
6

Szukam algorytmów, które wykonują notatki reprezentowane przez łańcuchy jako dane wejściowe i tworzą nazwę akordu jako wynik.Tekst, algorytmy rozpoznawania cięciwy oparte na stringach?

Na przykład:

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

[Tutaj jest coś, co może ci pomóc.] (Https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh

+2

@Josh "# TODO: Identyfikacja akordów" :( – Rob

Odpowiedz

2

Trawienie własnego rogu (tj. Jestem głównym twórcą biblioteki, tak stronniczy, oczywiście), ale z muzyką21 (http://web.mit.edu/music21/) można zrobić:

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

lub bardziej niejasnych rzeczy ...

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

pełne Dokumenty na akord (http://web.mit.edu/music21/doc/moduleReference/moduleChord.html) pomogą Ci dowiedzieć się, jak uzyskać wyjście tekst dokładnie w formacie Chcę.

+0

Jaki algorytm wdrożyłeś? Czy wiesz, gdzie mogę znaleźć literaturę, metodologię lub studia dotyczące algorytmów rozpoznawania akordów? – Rob

+1

Nie pamiętam dokładnie, skąd mamy listę nazwisk (myślę, że jest w dokumentach dla kodu z potwierdzeniem), ale redukujemy wszystkie akordy do ich postaci normalnej (chord.Chord(). NormalForm), a następnie dokonać porównania z zapisaną listą. Następnie odnajdujemy pierwiastek akordu w oparciu o jego funkcję - w przypadku standardowych akordów znalezienie źródła nie jest trudne. W przypadku bardzo złożonych akordów używamy własnego algorytmu, który może nie być właściwy, ale wydaje się, że działa całkiem dobrze. –

+1

Och, zajrzyj tutaj http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords, aby uzyskać więcej informacji. –

1

nie jest kompletnym rozwiązaniem, ale może coś na początek:

  1. Należy zacząć od zdefiniowania wszystkich możliwych odcieni do tablicy jak

    var skala = [['B #', 'C'], ['C#', 'Db'], ['E'], '[F]', ['F #', 'Gb'], ... To jest właściwie tablicą małych tablic z wszystkimi możliwymi nazwami dla "tej samej" nuty. Wiem, że puryści nalegają, że F # i Gb są fundamentalnie różne, ale na klawiaturze fortepianowej znajdują się za tym samym kluczem. Macierz skali powinna być połączona ze sobą, aby obejmowała więcej niż oktawę.

  2. Składniki tablicy akordów należy następnie znaleźć w tablicy skali. Ich względne pozycje w skali to odciski palców, które pozwalają na identyfikację akordu.

  3. Innym chordtypes tablica musi być skonfigurowany do przechowywania typu „palców”, jak cięciwa

    ctfp = { „głównym” [4,3,5], „małe” [3,4,5 ] ...

+0

Już eksperymentowałem z różnymi podejściami, które działają dla prostych triad i dwóch nałożonych triad (siódmy akord). Teraz szukam innych implementacji, które poradzą sobie z inwersjami i innymi rodzajami akordów, które nie są oparte na triadzie. Nie mogę znaleźć żadnej literatury na ten temat, jestem zagubiony. Jako wyjaśnienie: Pracuję nad biblioteką open source dla Pythona i Javy w celu programowania muzyki i nauki. I to najskuteczniejszy algorytm do rozpoznawania akordów, ale nie mogę go znaleźć. Wiele programów już to robi, ale nie może znaleźć rzeczywistych algorytmów/kodu. – Rob

+0

Z pewnością jest bardziej zaangażowany, gdy naprawdę chcesz zidentyfikować wszystkie możliwe inwersje i akordy z brakującymi pojedynczymi tonami. Zasadniczo jednak, poszukując minimalnych interwałów w odciskach palców typu akordowego (jego podbarwienia również muszą zostać przedłużone, aby pomieścić wszystkie możliwe inwersje), powinniśmy pójść dalej. – cars10m