Bestimmter Buchstabe = bestimmte Zahl

J@ckWhiteIII

Mitglied
Hallo,
ich befasse mich gerade ein wenig mit Musik/Frequenzen. Darum wollte ich in Java einen Converter machen, der den Notennamen in eine Zahl umwandelt (Kammerton a ist 0, darum ist g = -2 (wegen der Halbtonschritte etc)). Nur habe ich keine Ahnung, wie man überhaupt solche Zuordnungen macht.
Hat da jemand eine Idee?
Ich hatte erst an etwas ähnliches wie Konstanten gedacht, aber da wüsste ich auch nicht, wie man das machen soll.
Ein kleiner Denkanstoß reicht, glaube ich ^^
Danke für jede Antwort
 
Du könntest eine HashMap verwenden, dass ist jetzt das was mir am ehesten einleuchten würde...
Java:
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
hm.put( 'a', 0 );

System.out.println( hm.get( 'a' ) ) // Ausgabe: 0

Oder eine doppelte ArrayList:
Java:
ArrayList<Integer> alI = new ArrayList<Integer>();
ArrayList<Character> alC = new ArrayList<Character>();

alI.add( 0 );
alC.add( 'a' );

System.out.println( alI.get( alC.indexOf( 'a' ) ) ); // Ausgabe: 0
System.out.println( alC.get( alI.indexOf( 0 ) ) ); // Ausgabe: a

Das sind jetzt 2 Möglichkeiten von vielen.
Wenn die Performance von Wichtigkeit ist:
Java:
char c = 'a';
switch( c ) {
case 'a':
     return 0;
case 'h':
     return [Zahl];
[etc...]
}

Gruß
Net
 
Zuletzt bearbeitet:
Ah, also die switch Variante käme mir also am gelegensten, auch wenn es mehr Arbeit ist.
Vielen Dank für das Zeigen der anderen Varianten. Die doppelte ArrayList könnte ich später noch gut gebrauchen
Autoboxing muss ich mir dann noch einmal anschauen, kenne ich bis jetzt noch nicht
 
Ah, also die switch Variante käme mir also am gelegensten,
Ich würde [JAPI]enum[/JAPI]s empfehlen:
Java:
enum Note {
 A(0),
 C(1),
 // hier weitere Töne ergänzen...
 G(-2);
 private final int tonWert;
 Note(int tonWert) { this.tonWert=tonWert;}
 public int getTonWert() { return tonWert; }
 public int getTransposeQuinte(int quinte) { return 5*quinte + tonWert;}
 public int getTransposeOktave(int oktave) { return 8*oktave + tonWert;}
}
bye
TT
 
ich befasse mich gerade ein wenig mit Musik/Frequenzen. Darum wollte ich in Java einen Converter machen, der den Notennamen in eine Zahl umwandelt (Kammerton a ist 0, darum ist g = -2 (wegen der Halbtonschritte etc)). Nur habe ich keine Ahnung, wie man überhaupt solche Zuordnungen macht.
Hat da jemand eine Idee?

Keine Idee weil zumindest mir nicht so recht klar ist, wohin Du willst.

Dein Kammerton "a" ist ja ein ein "a'" (weil es in der eingestrichenen Oktave liegt). Also erstmal brauchst Du eine Konvention wie Du intern die Noten benennen möchtest. Wenn man sich an die Konventionen hält würde deine Tonleiter von ",,c" bis "c''" gehen. Weiterhin ist das lineare durchzählen der Noten (gerade wenn Du mit den zugehörigen Frequenzen arbeiten möchtest) eine eher schlechte Idee, denn das Fis ist ja was anderes als das Ges (ein Violinist sieht das nämlich etwas anders als ein Klavierspieler).

Ich würde daher nicht mit dem Kammerton (eingestrichenes "a") anfangen sondern mich am Schloss-C (eingestrichenes C) oder dem C selbst (eine Oktave unter dem Schloss-C) anfangen, mir eine passende Systematik für die Benennung der Noten einfallen lassen (zb F#' Gb') und das in eine Hashmap mit dem Notennamen als Schlüssel. Das Datenteil der Hashmap kannst Du dann zb. die Frequenz je nach temperierter Stimmung packen.

Bernd
 
Ich möchte nach der Formel f(i) = Kammertonfrequenz * 2^(i/12) arbeiten. g# ist dann z.B. minus 1, etc

Ok. Da würde ich mich aber trotzdem nur für die Berechnung auf dieses +/-Kammerton-Schema stützen und irgendeine intelligente Benamsung von C auf/absteigend nehmen. Eventuell Tonleitern in separaten Tabellen definieren.

Hängt natürlich davon ab, was Du konkret vor hast (Orgel auf der PC-Tastatur oder so).

Bernd
 

Neue Themen


Zurück
Oben