Wie transponiere ich Musikakkorde mit JavaScript?

8

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

transponieren

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%     
Richard Rodriguez 29.10.2011, 03:31
quelle

6 Antworten

8

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.

    
nnnnnn 29.10.2011, 04:22
quelle
2
%Vor%

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).

    
Matthew Flaschen 29.10.2011 03:40
quelle
1

Definieren Sie Ihre Schlüssel mit einem Objekt:

%Vor%

Analysiere deinen Akkord mit einem regulären Ausdruck:

%Vor%

Machen Sie etwas Rechenaufgabe, um den neuen Schlüssel zu erhalten:

%Vor%

Setze alles wieder zusammen:

%Vor%     
gilly3 29.10.2011 03:56
quelle
0
%Vor%

Akkord = C / B, Betrag = 1: C # / C oder Akkord = Gm7, Anzahl 2: Am7

    
user2813440 25.09.2013 02:57
quelle
0

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%     
Benny G 08.02.2017 20:26
quelle
0

Nur um die Antwort von nnnnnn zu erweitern. Wir können seinen Code nehmen und ein wenig mehr Code hinzufügen, um es tatsächlich mit Flats funktionieren zu lassen.

%Vor%

%Vor% %Vor%
    
Forivin 31.08.2017 11:01
quelle

Tags und Links