2009-04-03 9 views
11

Kennt irgendjemand irgendetwas in der Java-Welt, um Midi-Notennummern bestimmten Notennamen und Oktavnummern zuzuordnen. siehe zum Beispiel die Referenztabelle:Konvertieren von Midi-Notennummern in Name und Oktave

http://www.harmony-central.com/MIDI/Doc/table2.html

ich eine MIDI-Notennummer 60 bis es zuordnen möchten ist entsprechend Notennamen (middlec) in Oktave 4. ich eine Utility-Klasse/Enum für diese schreiben könnte, aber es wäre ziemlich langweilig. Weiß jemand etwas?

ich dies ausdrücklich mit bin ein Tenori-On/Monome Klon in Java zu schreiben, so weit, so gut ...

Lösung

Das war, was ich am Ende mit:

String[] noteString = new String[] { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; 

int octave = (initialNote/12) - 1; 
int noteIndex = (initialNote % 12); 
String note = noteString[noteIndex]; 
+0

Jon, ich habe ein paar echte Java zu meiner Antwort hinzugefügt. – paxdiablo

+0

genial, danke für die Hinweise ... – Jon

Antwort

11

Ich bin nicht davon überzeugt, dass Ihr Vorschlag ist, dass langweilig ist. Es ist wirklich nur eine Divide-and-Modulo-Operation, man bekommt die Oktave, die andere bekommt die Note.

octave = int (notenum/12) - 1; 
note = substring("C C#D D#E F F#G G#A A#B ",(notenum % 12) * 2, 2); 

In realen Java, wie oben zu diesem Pseudo-Code im Gegensatz Sie so etwas wie verwenden:

public class Notes { 
    public static void main(String [] args) { 
    String notes = "C C#D D#E F F#G G#A A#B "; 
    int octv; 
    String nt; 
    for (int noteNum = 0; noteNum < 128; noteNum++) { 
     octv = noteNum/12 - 1; 
     nt = notes.substring((noteNum % 12) * 2, (noteNum % 12) * 2 + 2); 
     System.out.println("Note # " + noteNum + " = octave " + octv + ", note " + nt); 
    } 
    } 
} 
+0

Vielleicht dachte Jon daran, für jede einzelne Note + Oktavkombination ein Enum zu erstellen? – Smashery

+0

Das war der erste verrückte Vorschlag. Ich war auf der Suche nach dem Algorithmus ... Ich bin sicher, dass ich damit etwas anfangen kann, ich glaube nicht, dass es in Java gültig ist ... sollte nicht lange dauern zu übersetzen ... – Jon

+0

Auch vielleicht könnte man hoffen für einen intrinsischen com. .Midi, das mit Java "versendet", das eine solche Methode enthält. Es würde jedoch immer noch ungelöst bleiben, ob eine Note (61?) C# oder Db aufgerufen werden soll. Wenn man eine Schlüsselsignatur hätte, könnte man das (in vielen Fällen) entsprechend der Schlüsselsignatur lösen. Das heißt, für den Schlüssel von B würde es C# sein. Für den Schlüssel von Gb wäre es Db. –

2

In JFugue, die Note Klasse hat eine Hilfsmethode, die tut genau dies - siehe public static String getStringForNote(byte noteValue) .

EDIT: Ab JFugue 5.0 und höher, die Note Klasse für verschiedene nützliche Methoden eine String-Darstellung von einem MIDI-Notenwert bekommen:

  • getToneString(byte noteValue) wandelt einen Wert von 60 auf den String C5
  • getToneStringWithoutOctave(byte noteValue) wandelt einen Wert von 60 auf den String C
  • getPercussionString(byte noteValue) wandelt einen Wert von 60 auf den String "[AGOGO]"

die ursprüngliche getStringForNote() Methode, um diese zu ersetzen.

+0

Interessant. Es sieht so aus, als habe jFugue 5 nicht mehr 'org.jfugue.Note'. Es hat 'org.jfugue.theory.Note', aber es scheint, dass die Methode' getStringForNote' nicht vorhanden ist.Nicht sicher, warum Leute beschließen, nützliche Funktionalität wegzunehmen (besonders, da die Kosten davon nicht so hoch waren), obwohl es möglicherweise anderswo verschoben wurde, nicht, dass ich es finden könnte :-) – paxdiablo

+0

Eigentlich das neue Hinweis Klasse hat mehrere Dienstprogrammfunktionen als die ältere Version. Die neue getStringForNote ist getToneString (byte noteValue) - für einen Wert von 60 würde dies "C5" zurückgeben. Es gibt jetzt auch getToneStringWithoutOctave (byte noteValue), was "C" für 60 zurückgibt. Sie können auch getPercussionString (byte noteValue) finden, was für 60 "[AGOGO]" zurückgibt. Die neuen Methoden sind reicher als die Originale und erforderten neue Funktionsnamen, um ihren Zweck zu verdeutlichen. –