//Autor: WAGNER PATRICK //Matrikelnummer: 0125872 //e-mail: patricasso@gmx.net //BspNr: 3146 (Akkord.java) //Runde: 3 //Beschreibung: Drei Musiknoten werden eingelesen; das kleinste Intervall und die Frequenzen des Dur/Dreiklanges auf dem ersten eingegebenen Ton werden berechnet! //verwendete Lösung: Nr. 882 *====AUFGABENSTELLUNG====* Mein Programm soll 3 Noten als Strings einlesen. Diese Noten (oder Töne) sind in bestimmte Oktaven eingeteilt. Insgesamt gibt es 5 verschiedene Oktaven mit jeweils 12 Noten. Eine genaue Auflistung findest du in der Spezifikation. Zwischen den einzelnen Noten gibt es jeweils einen bestimmten Halbtonschrittabstand. Diese sind in einer Tabelle in der Spezifikation dargestellt. Die Aufgabe bestand nun darin: ... 1. ...den kleinsten Intervall (Abstand) zwischen den 3 eingelesenen Noten zu finden, und diesen Abstand danach auszugeben. 2. ...die Frequenzen des Dur/Dreiklanges auszugeben. Dazu muss man zu der 1. eingegebenen Note eine grosse Terz (4 Halbtonschritte) und eine Quint (7 Halbtonschritte) addieren. 3. ... die 1. Note darf zudem nicht über den dreigestrichenen dis (dis''') liegen. Die 2 weiteren Noten dürfen im gesamten Bereich (zw. C und h''') liegen. 4. ...Man soll darauf achten, dass keine falschen Werte eingegeben werden. So können nach einem C oder einer anderen Note in der großen Oktave keine Hochkommas ( ' ) folgen *====FEHLERBEHANDLUNG====* Wenn eine falscher Wert (z.B: x) eingegeben wurde, soll die Fehlermeldung "FALSCHE EINGABE" ausgegeben werden. *====EINGEFÜGTES BEISPIEL====* Die Berechnung der Frequenz stammt von einem Programm der 1. Runde. Im Quelltext wurde vermerkt, wo das Programm aufgerufen wird. **========LÖSUNG========** Als erstes müssen zunächst einmal alle Noten irgendwie gespeichert werden. Dazu eignet sich am Besten ein Array. Die Anzahl berechnet sich ganz einfach. Es gibt 5 verschiedene Oktaven mit jeweils 12 Noten, daraus ergibt sich demnach eine insgesamte Anzahl von 60 Noten. Danach müssen die 3 Strings mittels readWord() eingelesen werden. Nun muss überprüft werden, ob die eingegebenen Noten auch im Array liegen. Ist das nicht der Fall (ist also der Wert -1), wird die Fehlermeldung "FALSCHE EINGABE" aufgerufen. Durch den Vergleich in der if Schleife note1index > sucheNote ("dis'''") wird festgelegt, dass das 1. Ergebnis (sprich die 1. eingelesene Note) der sucheNote Funktion nicht über dem Wert dis''' liegen darf, da ansonsten eine Fehlermeldung aufgerufen wird. Die Math.min berechnet automatisch das Minumum verschiedener Werte. Mit Hilfe dieser Funktion kann man nun den kleinsten Abstand zwischen den 3 Noten berechnen, indem man zuerst die 1. mit der 2. Note subtrahiert und mit der Differenz zwischen der 2. und der 3. Note vergleicht. Dieses Ergebnis vergleicht man dann noch mit der Differenz zwischen der 1 und 3 Note. Da die jeweiligen Ergebnisse nicht negativ sein sollen, wendet man zusätzlich die Funktion Math.abs an, die die Ergebnisse quasi positiv macht. Achte dabei auf die Klammersetzung im Quellcode (Zeile 49 und 50)! Dieser Ausdruck wurde in der Variable int min gespeichert, welcher nun in einer Switch Anweisung dazu dient, dem Ergebnis des kleinsten Abstandes auch den richtigen Namen zuzuordnen (die man in der Tabelle der Spezifikation ablesen kann). case 0: bedeutet in diesem Falle der Abstand betrug 0 deshalb wird auch "Prim" ausgegeben. Die weiteren Fälle laufen ebenfalls so ab. Nach dieser Anweisung werden der Abstand und die weiteren erforderlichen Frequenzen des Dur/Dreiklanges ausgegeben. print (notenfrq(Noten[note1index+4])); bedeutet in diesem Falle, dass im dem 1. Ergebnis der sucheNote Funktion (note1index) 4 Indexnummern addiert werden. 4 deshalb, weil dies einer grossen Terz entspricht (siehe Tabelle in Spezifikation). Danach wird nur noch die sucheNote Funktion aufgerufen, die zur eingegebenen Note den passenden Index des Arrays sucht. Zur Hilfe, was mit dem Index gemeint ist: {"C","Cis","D","Dis",...} 0 1 2 3 ... Der Index legt jedem Element im Array eine eindeutige Positionsnummer zu. Ist es nicht anders definiert beginnt dieser standartmäßig mit der Zahl 0. Somit kann man nun, wie in unseren Fall nötig, einzelene Elemente des Arrays vergleichen, indem man einfach die Positionsnummer betrachtet. Damit ist auch die "-1" erklärt. Da "-1" ja nicht im Array liegt ist dass ein Fehler. Ich hoffe, dass ich mit meiner Dokumentation dir bei meinem Programm etwas helfen konnte. Für weitere Fragen kannst du mir jederzeit eine e-mail schreiben. Würd mich natürlich freuen, wenn du mein Programm wieder weiterverwenden würdest. Patrick!