Rolf B: Javascript Arrays Novizen Frage

Beitrag lesen

Hallo Eska,

Denke für die enharmonik muss ich die Werte vergeleichen also wenn z.B. die erste Note ein C ist kann die zweite Note nicht C# sein sondern muss Db sein.

Bei einer Zufallsskala muss das keine Voraussetzung sein. Das ist nur bei den "klassischen" Tonleitern so.

Aber grundsätzlich wirst Du wohl eine Zusatzinformation brauchen, welche Kombination von Grundton und Tonleiter mit ♯ und welche mit ♭ zu bilden ist.

Das heißt dann auch, dass Du abhängig von der ausgewählten Tonleiter die Auswahltabelle der Starttöne modifizieren musst - aus praktischen Gründen (Anzahl der ♯ vs Anzahl der ♭) hast Du in den "Außenbereichen" von Dur und Moll beispielsweise gis Moll, aber As Dur. Gis Dur müsste - als "Nachfolger" von Cis, 8 Kreuze haben. Darunter 2 unnötige (His statt C und Eis statt F) und ein doppeltes (Fisis statt G), damit Du eben NICHT C und Cis sowie G und Gis in der Tonleiter hast, und keinen "Tonsprung" von Dis nach F.

Du brauchst also:

  • eine Grundtontabelle von C bis H
  • je Grundton die Info, wie die Halbtöne dazu heißen (bei -is ist es einfach, aber im -es Bereich hast Du die Ausnahmen Es, As und B)
  • eine Tabelle von Tonart-Familien (was ein kniffliger Begriff ist, es gibt Tongeschlechter, Modi, uvm), also Dur, Moll, Dorisch, Pentatonisch
  • Klarheit über die Tatsache, dass Du damit indische oder chinesische Musik nicht erfassen kannst, denn die verwenden teils ganz andere Töne
  • Eine Tabelle, die Dir sagt, bei welcher Tonartfamilie welche Starttöne möglich sind (guckst Du hier für Dur und Moll)
  • Hinweise zur Schreibweise: Dur schreibt man mit großem ersten Buchstaben, Moll in kleinbuchstaben)

Mit Musik hast Du Dir eine vertrackte Fachlichkeit ausgesucht 😉

Die beiden ersten Tabellen könnte man als Tabelle von Objekten aufbauen:

const basisTöne = [
   { ton: C, '♯': 'Cis', '♭': 'Ces' }
   { ton: D, '♯': 'Dis', '♭': 'Des' }
   { ton: E, '♯': 'Eis', '♭': 'Es' }
   { ton: F, '♯': 'Fis', '♭': 'Fes' }
   { ton: G, '♯': 'Gis', '♭': 'Ges' }
   { ton: A, '♯': 'Ais', '♭': 'As' }
   { ton: H, '♯': 'His', '♭': 'B' }
];

const chromatik  = {
   '♯': [ 'C', 'Cis', 'D', 'Dis', 'E', 'F', 'Fis', 'G', 'Gis', 'A', 'Ais', 'H' ],
   '♭': [ 'C', 'Des', 'D', 'Es', 'E', 'F', 'Ges', 'G', 'As', 'A', 'B', 'H' ]
};

const familien = [
   { familie: 'Dur',
     großbuchstabe: true,
     tonAbstand: [2, 2, 1, 2, 2, 2, 1 ]
   },
   { familie: 'Moll',
     großbuchstabe: false,
     tonAbstand: [2, 1, 2, 2, 1, 2, 2 ]
   }
   { familie: 'Pentatonik',
     ...
   }
];

Ein Eigenschaftsnamen wie '♯' oder '♭' ist in JavaScript leider nur mit Anführungszeichen möglich, und das heißt, dass Du einen Zugriff wie ton.♭ nicht schreiben kannst. Es muss ton['♭'] sein. Wenn Dir das zu umständlich ist, nenne die Eigenschaften anders. Z.B. is und es - "is" ist in JS kein reserviertes Wort.

Die zulässigen Starttöne für Dur und Moll kannst Du als Tabelle an die Familien anhängen, aber Du kannst sie - wenn Du Lust hast - auch aus dem Quintenzirkel ableiten. Eine Quinte in den Tonarten sind immer 7 Halbtöne, d.h. du startest in der chromatischen Tabelle bei Index 0 und erhöhst immer um 7. Überschreitest Du die 11, ziehst Du 12 ab. So kommst Du auf C, G, D, A, E, H, Fis, Cis. Das gleiche abwärts: 7 abziehen, wenn kleiner 0, 12 addieren. Und Du bekommst F, B, Es, As, Des, Ges und Ces. Bei Moll funktioniert das genauso. Außerhalb von Dur und Moll ist die Sache dagegen komplizierter und Du brauchst ggf. doch eine Tabelle von zulässigen Starttönen.

Das ganze dann mit JS flexibel aufzubauen setzt Reaktion auf input-Events der jeweiligen Auswahllisten voraus. Viel Spaß 😀

Rolf

--
sumpsi - posui - obstruxi