Konvertieren Sie MIDI-Noten-Nummern Name und Octave
Frage
Weiß jemand, der alles, was in der Java-Welt existiert auf bestimmte Notennamen und Oktave Zahlen MIDI-Notennummern zuzuordnen. siehe zum Beispiel der Referenztabelle:
http://www.harmony-central.com/MIDI/Doc/ table2.html
Ich mag eine MIDI-Notennummer 60, um es kartieren ist entsprechend Tonname (middlec) in Oktave 4. ich ein Utility-Klasse / Enum für diesen schreiben könnte, aber es wäre ziemlich langweilig. Weiß jemand, der etwas?
Ich verwende diese speziell 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];
Lösung
Ich bin nicht davon überzeugt, Ihr Vorschlag ist, , die langweilig. Es ist wirklich nur ein Teil-und-Modulo-Operation, eine die Oktave bekommt, der andere die Note bekommt.
octave = int (notenum / 12) - 1;
note = substring("C C#D D#E F F#G G#A A#B ",(notenum % 12) * 2, 2);
Im wirklichen Java, im Gegensatz zu diesem Pseudocode oben, können 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);
}
}
}
Andere Tipps
JFugue , die Note
Klasse hat eine Dienstprogramm Methode, die genau dies tut - vgl. public static String getStringForNote(byte noteValue)
EDIT: Ab JFugue 5.0 und höher, die Note
Klasse mehrere Hilfsmethoden hat von einem MIDI-Notenwert eine String-Darstellung für immer:
-
getToneString(byte noteValue)
wandelt einen Wert von60
auf den StringC5
-
getToneStringWithoutOctave(byte noteValue)
wandelt einen Wert von60
auf den StringC
-
getPercussionString(byte noteValue)
wandelt ein Wert von60
auf den String"[AGOGO]"
Diese ersetzen die ursprüngliche getStringForNote()
Methode.
public static String getNoteName(int noteNumber){
noteNumber -= 21; // see the explanation below.
String[] notes = new String[] {"A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"};
int octave = noteNumber / 12 + 1;
String name = notes[noteNumber % 12];
return name + octave;
}
Erklärung:
-
A0 in midi ist die erste Note und seine Zahl ist 21. Wir haben den Index von 0 bis beginnen anzupassen (also am Anfang
noteNumber -= 21;
). Wenn Ihre Notennummer 0 basieren, zum Beispiel in den Fächern Klavier 0-88, dann können Sie diese Zeile auskommentieren. -
Beachten Sie, dass die Notennamen in der Anordnung in dieser Lösung von A bis G starten.
-
Octave ist
noteNumber / 12 + 1
(oder Decke num / 12). - Hinweis Namensindex ist
noteNumber % 12
.