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];
È stato utile?

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 di 60 al C5 stringa
  • getToneStringWithoutOctave(byte noteValue) converte un valore 60 al C stringa
  • getPercussionString(byte noteValue) converte un valore 60 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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top