Il primo problema sarebbe decidere quale sia la nota fondamentale, altrimenti, come dice kurto, otterrai diverse risposte per un insieme di lettere della nota.
L'ordine delle lettere sarebbe importante? Forse potresti adottare una regola secondo cui la prima lettera è sempre la radice?
Supponendo che tu lo affronti in qualche modo (o semplicemente accetti più risposte), potresti ...
Assegna un numero a ogni lettera (presumibilmente stai accettando anche diesis e bemolle?) e usalo per calcolare l'intervallo tra le note, in semitoni, ad esempio quello che chiamiamo 4a = da A a D è in realtà 5 semitoni.
È quindi possibile utilizzare gli intervalli per abbinare una serie di schemi di accordi noti alla nota fondamentale:
CEG come nel tuo esempio, in semitoni = 1-4-7 = [nota fondamentale] maggiore = il modello relativo per una triade maggiore.
Do Eb G = 1-3-7 = pattern per accordo minore.
1-4-7-10 = Cmaj 7
Ogni volta che stai solo riportando la nota fondamentale con un commento su come sono disposte le altre note. Il limite sarebbe il punto in cui viene percepito un accordo ma manca la nota fondamentale, ma potrebbe comunque essere interpretato come un altro accordo.
Più modelli di pattern identifichi, meglio diventerà ma solo tu è necessario definirli rispetto a una nota fondamentale in numeri di semitono.
Se qualcosa non si adatta a nessuno dei pattern (forse non ne hai impostato uno per l'accordo A4), scrivi semplicemente il ritorno della nota fondamentale con extra numero di nota (non numero di semitono).
Quindi è necessario
- un modo per convertire tutte le lettere (diesis e bemolle) in numeri = una tabella di ricerca / array associativo
- un modo per identificare la nota fondamentale
- un modo per identificare gli intervalli di tutte le lettere dalla nota fondamentale = trasformare in numeri e sottrarre il numero della nota fondamentale. Modulo di 13 per mantenerlo entro 1 ottava (o no se vuoi essere più avanzato e gestire intervalli negativi, per le note sotto la nota fondamentale)
- un modo per definire modelli di pattern per accordi noti, con nome testo associato
- un modo per confrontare i numeri di semitoni con i modelli (= un confronto di array)
- un modo per trasformare gli intervalli di semitono in numeri di nota (ad esempio 5 semitoni = 4a nota sulla scala) in modo da poter restituire cose come A4
Se si desidera restituire tutte le possibilità per un insieme di note, è possibile restituire il risultato per la routine, utilizzando a turno ciascuna nota dell'accordo come fondamentale.
Sto pensando qui, ma penso che sia così che lo farei.