Ich habe mich gefragt, wie man eine JavaScript-Funktion für das Transponieren von Musikakkorden erstellen könnte.
Da ich nicht erwarte, dass hier jeder Musiker ist, werde ich versuchen zu erklären, wie es in der Musiktheorie funktioniert. Ich hoffe, ich vergesse nichts. Wenn ja, bitte korrigiere mich, Musiker.
1) Die einfachen Akkorde
Die einfachen Akkorde sind fast so einfach wie ein Alphabet und es geht so:
C, C #, D, D #, E, F, F #, G, G #, A, A # B
Von B springt es wieder zu C. Wenn also der ursprüngliche Akkord E
ist und wir +1 transponieren wollen, ist der resultierende Akkord F
. Wenn wir +4 transponieren, ist der resultierende Akkord G#
.
2) Erweiterte Akkorde
Sie funktionieren fast wie die einfachen Akkorde, enthalten aber ein paar mehr Zeichen, die beim Transponieren sicher ignoriert werden können. Zum Beispiel:
Cmi, C # 7, Dsus7, Emis, Fsus4, F # mi, G ...
Also, wieder wie bei den einfachen Akkorden, wenn wir Dsus7
+ 3 = Fsus7
3) Nicht-root Basston
Ein Problem tritt auf, wenn der Bass einen anderen Ton als der Grundton spielt. Dies ist durch einen Schrägstrich nach dem Akkord gekennzeichnet und muss ebenfalls transponiert werden. Beispiele:
C / G, Dmi / A, F # sus7 / A #
Wie bei den Beispielen 1 und 2 ist alles gleich, aber der Teil nach dem Schrägstrich muss ebenfalls transponiert werden:
C/G
+ 5 = F/C
F#sus7/A#
+ 1 = Gsus7/B
Ich denke, das sollte alles sein, es sei denn, ich habe etwas vergessen.
Stellen Sie sich im Prinzip eine JavaScript-Variable namens chord
und den Transpose-Wert transpose
vor. Welcher Code würde den Akkord transponieren?
Beispiel:
%Vor%Wie wäre es mit ein bisschen so:
%Vor%Beachten Sie, dass ich das Beispiel "F # maj9 # 11" eingefügt habe, um Ihnen mehr darüber zu vermitteln, was einen gültigen Akkordnamen ausmacht: Sie können ein "#" scharfes Symbol finden, das nicht folgt ein Buchstabe (in diesem Fall gehört er zu der "11").
Und natürlich versteht meine Funktion nur Sharps, nicht Flats, und nicht Keys, also zB transposeChord("C/E", 1)
wird "C # / F" geben, wenn es wirklich "C # / E #" sein sollte.
Ich werde Ihnen den Basspart erklären lassen, da es die Funktion nur zweimal aufruft.
Sie können auch den Code hier vor der Funktion für alte Browser hinzufügen, die Unterstütze indexOf
nicht.
Ich habe eine Demo auf jsFiddle gestellt.
EDIT: Das Problem war mit negativem Modul. Das obige funktioniert so lange, wie das Negativ nicht länger ist als die Länge (z. B. können Sie 100 Schritte nicht nach unten transponieren).
Akkord = C / B, Betrag = 1: C # / C oder Akkord = Gm7, Anzahl 2: Am7
Ok, also habe ich jetzt schon ein bisschen darüber nachgedacht und ich habe eine funktionale Antwort. Es ist in Standard Western Scale Tönen (sorry Nordeuropäer).
Um einen Akkord wirklich zu transponieren, benötigen Sie 3 Informationen: 1) den CHORD-Namen, 2) den OLDKEY und 3) den NEWKEY. Es reicht nicht immer aus, um einen AMOUNT zu modulieren (ist UP-2 von der Taste von E ein F # oder ein Gb?).
Grundsätzlich müssen Sie zwei Abstände beibehalten - die Entfernung in der Tonhöhe zwischen dem CHORD und dem OLDKEY und die Entfernung in "Buchstaben" zwischen dem CHORD und dem OLDKEY - wenn Sie das CHORD dem NEWKEY zuordnen.
%Vor%Um (?) dies zu vereinfachen, habe ich jede Skala und jede mögliche Note (und einige unmögliche) in Bezug auf diese Skalenwurzel vordefiniert.
%Vor%Dann weisen Sie Ihre Maßstäbe basierend auf OLDKEY und NEWKEY zu:
%Vor%Schließlich, ein Regex, um alle diese Akkordwurzeln / Flats / sharps / doubleflats / etc mit ihrer entsprechenden Position in der NEWKEY-Skala zu finden und zu ersetzen.
%Vor%Es gibt definitiv eine bessere, "think-like-a-computer" Möglichkeit, dies zu tun, aber dies wird
dauern %Vor%und zurück
%Vor%Tags und Links javascript music