Danke Mjchael für all die Ausführungen.
Was ich bisher mache:
Ich habe drei Arrays
a) die Noten der C-Dur Tonleiter
b) BLANK, #, b
c) alle möglichen Akkorde, zB BLANK, m, m7, maj7, 7-5
Alle Möglichen Kombinationen von abc (in dieser Reihenfolge) speicher ich mir als Whitelist ab.
Die Usereingaben speicher ich zeilenweise ab, und in diesen Zeilen vergleiche ich alle \"Wörter\" auf Vorhandensein in der Whitelist.
Damit kann mir Hmaj5b7 nicht begegnen, es sei denn ich speicher maj5b7 in c)
Nach einem mehr oder weniger komplizierten Verfahren analysier ich dann die Zeilen ob die mir wie Akkord oder Textzeilen vorkommen. Wenn Akkordzeilen (und nur dann! Bzw, später gehe ich nochmal drüber und interpretiere alles in eckigen Klammern als Akkord) dann markiere ich mir alle Whitelisttreffer in dieser Zeile.
Damit habe ich (auch ohne Quintenzirkel) alle vorkommenden Akkorde und kann diese +/- n Tonarten transponieren.
Soweit klappt das alles, und ist Deinem Ansatz auch recht ähnlich (halt ohne Quintenzirkel)
Die Akkorde müsste ich jetzt gewichten und daraus eine Haupttonart basteln (ich würde enharmonische Verwechslungen und parallele Dur/Molltonarten erstmal zusammenfassen und dann hoffen, die häuftigsten 3 Akkorde genau einer Tonart als TSD zuorden zu können...
Anschliessend zählen ob mehr DUr oder Moll, daraus entscheiden ob C-Dur oder A-Moll, und damit weiss ich auch die Vorzeichen.
DANN könnte ich dem User anbieten nicht nur plus 3 Tonarten zu transponieren sondern auch \"von Am nach Cm\" zu transponieren.
Das mit dem H und B hat ganz andere Probleme. Das H selber (und auch das Bb) sind dabei egal, aber das B ist und bleibt zweideutig.
Wenn das B und weder Bb noch H vorkommen muss ich schon den ganzen Rest analysieren auf vorkommen von zB Eb und E um zu entscheiden, was daieses B ist.. Ich denke die bisherige Lösung (Checkbox \"Use H and B instead of B and Bb.\") ist ziemlich passend.
Probleme machen mir jetzt noch Kleinbuchstaben (heisst g nun G-Moll oder schreibt hier jemand alle Akkorde einfach aus Faulheit klein?) und die Gewichtung ob eine Zeile eine Akkordzeile ist oder nicht.
PAradebeispiel ist die Zeile
A B C D E F G H I J K...
Sind das nun Akkorde oder nicht?
Egal, ich denke bis jetzt klappt das ganz gut.
Jetzt muss ich noch sehen wie ich die Akkorde Griffbildren zuweise (einfach) und diese dann auch anzeige (nicht mehr so einfach, obwohl ich da durchaus Erfahrung habe, siehe
http://chordfind.com oder
http://ws64.com/guitarPHP )
--
http://Chordfind.com -
http://EarlyWolf.com -
http://youtube.com/ws64