Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Quintenzirkel (Simulationen)

In der Grafik rechts ist der Quintenzirkel der Musiklehre abgebildet. Im äußeren Kreis sind die Dur-Tonarten, im inneren Kreis die Moll-Tonarten dargestellt. Diejenigen Akkorde, die miteinander nahe verwandt sind, sind durch Kanten miteinander verbunden: Zum Beispiel ist C-Dur (Tonika) mit G-Dur (Dominante), F-Dur (Subdominante), a-Moll (Tonikaparallele), e-Moll (Dominantenparallele) und mit d-Moll (Subdominantenparallele) verbunden. Simulieren Sie Musikstücke, die bei der Tonika C-Dur starten und sechs Mal die Tonart längs einer vorgegebenen Kante ändern. Messen Sie, bei welcher Tonart Sie am Schluss am häufigsten landen.

Moulieren nach Donald E. Knuth

Tipp: Da jede Tonart genau fünf Parallelen aufweist, bietet sich eine Tabelle (zweidimensionales Array) an. Die erste Spalte bezeichnet die Tonika, die zweite z. B. die Dominante usw. Vergibt man den Tonarten Nummern, so können diese direkt als Indizes verwendet werden (die erste Spalte könnte in diesem Fall weggelassen werden). Eine weitere Möglichkeit ist das Verwenden von assoziativen Arrays, die als Indizes auch Zeichenketten ("C", "cis", ...) zulassen. Referenzvariable in Datenstrukturen einzubinden wäre eine dritte Möglichkeit, diesen Graphen abzubilden.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 Lösung(en)

import static java.lang.Math.random;

/**
 * Simuliere fünf Modulationen im Quintenzirkel
 * @author Philipp Gressly (phi@gressly.ch)
 */
/*
 * History: first Implementation: Sep 8, 2010
 * Bugs   :
 */
public class Quintenzirkel {
  public static void main(String[] args) {
    new Quintenzirkel().top(); }
  
  final int MAX_SIMULATIONEN = 100000000;
  final int ANZ_MODULATIONEN =         6;
  final int ZIEL_SPALTE      =         5;
  
  int[][] graph;
  
  void top() {
      init();
      int simulationsNummer = 0;
      while(simulationsNummer < MAX_SIMULATIONEN) {
          einzelsimulation();
          simulationsNummer = simulationsNummer + 1;
      }
      ausgabe();
  }
  
  void ausgabe() {
    int tonart = 0; /* C - Dur */
    while(tonart < graph.length) {
        System.out.println("Lande " + graph[tonart][ZIEL_SPALTE] + "-mal bei Tonart " + tonart + "." );
        tonart = tonart + 1;
    }
  }

void einzelsimulation() {
    int startpos = 0;
    int aktpos   = startpos;
    int schritt  = 0;
    while(schritt < ANZ_MODULATIONEN) {
        aktpos = moduliere(aktpos);
        schritt = schritt + 1;
    }
    graph[aktpos][ZIEL_SPALTE] = graph[aktpos][ZIEL_SPALTE] + 1;
   }

   /**
    * Liefert eine zufällige neue position
    * @return
    */
  int moduliere(int aktpos) {
    int newPos = graph[aktpos][(int)(random()*5)];
    return newPos;
  }

void init() {
      graph = new int[][] {
        /* Reihenfolge:
         *  Kommentar = Tonika (0 = c)
         *  [0]: Dominante
         *  [1]: Subdominante
         *  [2]: Dominantenparallele
         *  [3]: Tonikaparallele
         *  [4]: Subdominantenparallele  
         */
        /*  0 */  {11,  1, 23, 12, 13, 0},
        /*  1 */  { 0,  2, 12, 13, 14, 0},
        /*  2 */  { 1,  3, 13, 14, 15, 0},
        /*  3 */  { 2,  4, 14, 15, 16, 0},
        /*  4 */  { 3,  5, 15, 16, 17, 0},
        /*  5 */  { 4,  6, 16, 17, 18, 0},
        /*  6 */  { 5,  7, 17, 18, 19, 0},
        /*  7 */  { 6,  8, 18, 19, 20, 0},
        /*  8 */  { 7,  9, 19, 20, 21, 0},
        /*  9 */  { 8, 10, 20, 21, 22, 0},
        /* 10 */  { 9, 11, 21, 22, 23, 0},
        /* 11 */  {10,  0, 22, 23, 12, 0},
        
        /* 12 */  {23, 13, 11,  0,  1, 0},
        /* 13 */  {12, 14,  0,  1,  2, 0},
        /* 14 */  {13, 15,  1,  2,  3, 0}, 
        /* 15 */  {14, 16,  2,  3,  4, 0},
        /* 16 */  {15, 17,  3,  4,  5, 0},
        /* 17 */  {16, 18,  4 , 5,  6, 0},
        /* 18 */  {17, 19,  5,  6,  7, 0},
        /* 19 */  {18, 20,  6,  7,  8, 0},
        /* 20 */  {19, 21,  7,  8,  9, 0},
        /* 21 */  {20, 22,  8,  9, 10, 0},
        /* 22 */  {21, 23,  9, 10, 11, 0},
        /* 23 */  {22, 12, 10, 11,  0, 0}
      };
  }

}  // end of class Quintenzirkel
                
let scale = 'C D? D E? E F F? G A? A B? H'.split(' '),
    majRelated = [2, 4, 5, 7, 9],    // ii, iii, IV, V, vi
    minRelated = [3, 5, 7, 8, 10],   // III, iv, v, VI, VII
    major = true,                    // tongeschlecht
    cur = 0;                         // aktuelle stufe

// tongeschlecht wechseln
function toggleMode() {
  major = !major;
}

// nächste stufe per zufall ermitteln (bedingt durch tongeschlecht)
// ändert tongeschlecht bei bedarf
// gibt die nächste stufe zurück
function getNextStep() {
  let x = Math.floor(Math.random() * 5);
  if (major) {
    if (x == 0 || x == 1 || x == 4) toggleMode();
    return majRelated[x];
  } else {
    if (x == 0 || x == 3 || x == 4) toggleMode();
    return minRelated[x];
  }
}

// eine stufe weiterwandern
function progress() {
  cur += getNextStep();
  // grenzüberschreitung
  if (cur >= 11) cur -= 11;
}

// neuen durchlauf erstellen
function giro(num) {
  num = num || 6;                   // standard 6 stufenwechsel
  cur = 0; major = true;            // auf C-Dur starten
  let record = ['C'];               // zeichnet mittschnitt auf
  for (let i = 1; i <= num; i++) {
    progress();
    let out = scale[cur];
    if (!major) out += 'm';
    record.push(out);
  }
  return record;
}

// nun zur aufgabe:
let i, j;
let results =
  'C D? D E? E F F? G A? A B? H Cm D?m Dm E?m Em Fm F?m Gm A?m Am B?m Hm'.split(' ');
for (i = 0; i < results.length; i++) {
  results[i] += ' 0';
  results[i] = results[i].split(' ');
  results[i][1] = parseInt(results[i][1]);
}

for (i = 1; i < 10000; i++) {
  let g = giro();
  j = 0;
  while (results[j][0] != g[6]) j++;
  results[j][1]++;
}

console.table(results);                                  // lissalanda@gmx.at

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

Verifikation/Checksumme:

Am häufigsten sollte Ihr Programm wieder bei der Tonika (C-Dur) oder der Tonikaparallelen (a-Moll) landen.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: k.A.
Webcode: v8mr-dw3x
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen