Question

Quelqu'un sait-il de tout ce qui existe dans le monde Java pour la carte des numéros de note midi aux noms de notes spécifiques et les numéros d'octave. Par exemple, voir le tableau de référence:

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

Je veux mapper un numéro de note midi 60 à son nom de note correspondante (middlec) en octave 4. Je pourrais écrire une classe utilitaire / ENUM pour cela, mais ce serait plutôt fastidieux. Quelqu'un sait-il quelque chose?

Je suis spécifiquement en utilisant cela pour écrire un clone Tenori-On / Monome en Java, so far so good ...

Solution

Ce fut ce que je fini par utiliser:

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];
Était-ce utile?

La solution

Je ne suis pas convaincu que votre suggestion est que fastidieux. Il est vraiment juste une opération de division et modulo, on obtient l'octave, l'autre obtient la note.

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

Dans la vraie Java, par opposition à ce pseudo-code ci-dessus, vous pouvez utiliser quelque chose comme:

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);
    }
  }
}

Autres conseils

JFugue , la classe Note a une méthode utilitaire qui fait exactement cela -. Voir public static String getStringForNote(byte noteValue)

EDIT: Au 5.0 JFugue et plus tard, la classe Note a plusieurs méthodes utiles pour obtenir une représentation de chaîne d'une valeur de note MIDI:

  • getToneString(byte noteValue) convertit une valeur de 60 à la C5 chaîne
  • getToneStringWithoutOctave(byte noteValue) convertit une valeur de 60 à la C chaîne
  • getPercussionString(byte noteValue) convertit un valeur de 60 à la "[AGOGO]" chaîne

Ceux-ci remplacent la méthode 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;
}

Explication:

  • A0 en midi est la première note et son numéro est 21. Nous ajustons l'index pour commencer à 0 (noteNumber -= 21; donc au début). Si vos numéros de note sont 0 sur la base, par exemple en piano 0-88, vous pouvez commenter cette sortie ligne.

  • Notez que dans cette solution, les noms de notes dans le tableau de départ de A à G.

  • Octave est noteNumber / 12 + 1 (ou le plafond de num / 12).

  • Index nom de la note est noteNumber % 12.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top