Convertir números de nota MIDI Para Nombre y Octave
Pregunta
¿Alguien sabe de todo lo que existe en el mundo Java para asignar números de nota MIDI a nombre de las notas y los números de octava. Por ejemplo, véase la tabla de referencia:
http://www.harmony-central.com/MIDI/Doc/ table2.html
Quiero asignar un número de nota MIDI 60 a su correspondiente nombre de la nota (middlec) en la octava 4. Podría escribir una clase de utilidad / enum para esto, pero sería bastante tedioso. ¿Alguien sabe algo?
Estoy usando específicamente esto para escribir un clon Tenori-On / Monome en Java, hasta ahora tan bueno ...
Solución
Esto fue lo que terminó usando:
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];
Solución
No estoy convencido de que su sugerencia es que tedioso. No deja de ser una operación de dividir y de módulo, uno tiene la octava, el otro recibe 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);
En Java real, en contraposición a la pseudo-código anterior, se puede usar algo como:
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);
}
}
}
Otros consejos
JFugue , la clase Note
tiene un método de utilidad que hace exactamente esto -. Ver public static String getStringForNote(byte noteValue)
EDIT: A partir de JFugue 5.0 y posterior, la clase Note
tiene varios métodos de utilidad para obtener una representación de cadena de un valor de nota MIDI:
-
getToneString(byte noteValue)
convierte un valor de60
a laC5
cadena -
getToneStringWithoutOctave(byte noteValue)
convierte un valor de60
a laC
cadena -
getPercussionString(byte noteValue)
convierte una valor de60
a la"[AGOGO]"
cadena
Estos reemplazan el método getStringForNote()
originales.
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;
}
Explicación:
-
A0 en formato midi es la primera nota y su número es 21. Ajustamos el índice que empezar desde 0 (de ahí
noteNumber -= 21;
al principio). Si sus números de notas se basan 0, por ejemplo, en un piano de un 0 a 88, entonces se puede comentar esta línea de salida. -
Tenga en cuenta que en esta solución, los nombres de las notas de la matriz empiezan desde la A a la G.
-
Octave es
noteNumber / 12 + 1
(o en el techo de num / 12). - Indice Nombre de la nota es
noteNumber % 12
.