Convertire Numeri note MIDI Per Nome e Octave
Domanda
Qualcuno sa di tutto ciò che esiste nel mondo Java per mappare i numeri di nota MIDI per i nomi delle note specifiche e numeri di ottava. Ad esempio, vedere la tabella di riferimento:
http://www.harmony-central.com/MIDI/Doc/ table2.html
Voglio mappare un numero di nota MIDI 60 al suo corrispondente nome della nota (middlec) in ottava 4. Potrei scrivere una classe di utilità / enum per questo, ma sarebbe piuttosto noioso. Qualcuno sa di qualcosa?
Sono in particolare usando questo per scrivere un clone di Tenori-On / Monome in Java, finora tutto bene ...
Soluzione
Questo è stato quello che ho finito per usare:
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];
Soluzione
Non sono convinto che il suo suggerimento è che noioso. E 'davvero solo un'operazione di divide et modulo, si ha l'ottava, l'altro ottiene la nota.
octave = int (notenum / 12) - 1;
note = substring("C C#D D#E F F#G G#A A#B ",(notenum % 12) * 2, 2);
Nel settore Java, al contrario di quella pseudo-codice di cui sopra, si può usare qualcosa come:
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);
}
}
}
Altri suggerimenti
JFugue , la classe Note
ha un metodo di utilità che fa esattamente questo -. Vedi public static String getStringForNote(byte noteValue)
Modifica A partire dal JFugue 5.0 e versioni successive, la classe Note
ha diversi metodi di utilità per ottenere una rappresentazione di stringa di un valore di nota MIDI:
-
getToneString(byte noteValue)
converte un valore di60
alC5
stringa -
getToneStringWithoutOctave(byte noteValue)
converte un valore60
alC
stringa -
getPercussionString(byte noteValue)
converte un valore60
al"[AGOGO]"
stringa
Questi sostituiscono il metodo getStringForNote()
originale.
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;
}
Spiegazione:
-
A0 in midi è la prima nota e il suo numero è 21. Noi regolare l'indice di partire da 0 (da qui
noteNumber -= 21;
all'inizio). Se i numeri di nota si basano 0, ad esempio in pianoforte 0-88, allora si può commentare questa linea. -
Si noti che in questa soluzione, i nomi delle note nella matrice partono da A a G.
-
Octave è
noteNumber / 12 + 1
(o sul soffitto del num / 12). - i cognomi Note è
noteNumber % 12
.