2013-07-30 18 views
6

Sto cercando algoritmi che prendano appunti rappresentati da stringhe come input e producano il nome dell'accordo come output.Testo, algoritmi di riconoscimento degli accordi basati su stringhe?

Ad esempio:

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

[Ecco qualcosa che potrebbe aiutarti.] (Https://code.google.com/p/python-musical/source/browse/trunk/musical/theory/chord.py?r=2) – Josh

+2

@Josh "# TODO: Chord identification" :( – Rob

risposta

2

Tutting my horn personale (ovvero, sono lo sviluppatore principale della libreria, ovviamente di parte), ma con music21 (http://web.mit.edu/music21/) si può fare:

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

o le cose più oscure ...

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

la documentazione completa per Chord (http://web.mit.edu/music21/doc/moduleReference/moduleChord.html) vi aiuterà a capire come ottenere l'output di testo esattamente nel formato voglio.

+0

Quale algoritmo hai implementato? Sai dove posso trovare letteratura, metodologia o studi sugli algoritmi di riconoscimento degli accordi? – Rob

+1

Non riesco a ricordare esattamente dove abbiamo ottenuto la lista dei nomi (penso che sia nei documenti per il codice con un riconoscimento) ma riduciamo tutti gli accordi alla loro forma Normale (chord.Chord(). NormalForm) e poi fare un confronto con l'elenco memorizzato. Quindi troviamo la radice della corda basata su una funzione lì - per gli accordi standard, non è difficile trovare la radice. Per accordi molto complessi, utilizziamo il nostro algoritmo che potrebbe non essere corretto, ma sembra funzionare piuttosto bene. –

+1

Oh, guarda qui http://music.stackexchange.com/questions/12425/looking-for-a-list-of-common-4-note-chords per maggiori informazioni. –

1

non è una soluzione completa, ma forse qualcosa per iniziare:

  1. Si dovrebbe iniziare con la definizione di tutte le tonalità possibili in un array come

    var scale = [['B #', 'C'], ['C#', 'Db'], ['E'], '[F]', ['F #', 'Gb'], ... Questo è in realtà una matrice di piccoli array con tutti i possibili nomi per la "stessa" nota. So che i puristi insisteranno sul fatto che F # e Gb sono fondamentalmente diversi, ma sulla tastiera del pianoforte risiedono dietro la stessa chiave. L'array della scala deve essere combinato con se stesso per estendersi su un'ottava superiore.

  2. I componenti dell'array di accordi dovrebbero quindi essere trovati nell'array di scala. Le loro posizioni relative nell'array di scala sono le impronte digitali che consentono di identificare l'accordo.

  3. Altri chordtypes matrice deve essere impostato per tenere i "tipo corda impronte" come

    CTFP = { 'importante': [4,3,5], 'minore': [3,4,5 ], ...

+0

Ho già sperimentato approcci diversi che funzionano per triadi semplici e due triadi sovrapposte (7 ° accordo). Ora sto cercando altre implementazioni in grado di gestire le inversioni e altri tipi di accordi che non sono basati sulla triade. Non riesco a trovare nessun tipo di letteratura sull'argomento, però, sono perso. Come chiarimento: sto lavorando su una libreria open source per Python e Java per lo sviluppo e lo studio della musica programmatica. Sono l'algoritmo più efficiente per gestire il riconoscimento degli accordi, ma non ne trovo nessuno. Molti programmi lo fanno già, ma non riescono a trovare gli algoritmi/codice attuali. – Rob

+0

È sicuramente più coinvolgente, quando si desidera veramente identificare tutte le possibili inversioni e accordi con i singoli toni mancanti. Ma in sostanza, cercando un minimo di intervalli nell'impronta digitale del tipo di accordo (è necessario estendere i sottosistemi anche per tener conto di tutte le possibili inversioni), dovresti farti andare oltre. – cars10m

Problemi correlati