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];
¿Fue útil?

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 de 60 a la C5 cadena
  • getToneStringWithoutOctave(byte noteValue) convierte un valor de 60 a la C cadena
  • getPercussionString(byte noteValue) convierte una valor de 60 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top