Frage

Weiß jemand, der alles, was in der Java-Welt existiert auf bestimmte Notennamen und Oktave Zahlen MIDI-Notennummern zuzuordnen. siehe zum Beispiel der Referenztabelle:

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

Ich mag eine MIDI-Notennummer 60, um es kartieren ist entsprechend Tonname (middlec) in Oktave 4. ich ein Utility-Klasse / Enum für diesen schreiben könnte, aber es wäre ziemlich langweilig. Weiß jemand, der etwas?

Ich verwende diese speziell ein Tenori-On / Monome Klon in Java zu schreiben, so weit, so gut ...

Lösung

Das war, was ich am Ende mit:

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];
War es hilfreich?

Lösung

Ich bin nicht davon überzeugt, Ihr Vorschlag ist, , die langweilig. Es ist wirklich nur ein Teil-und-Modulo-Operation, eine die Oktave bekommt, der andere die Note bekommt.

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

Im wirklichen Java, im Gegensatz zu diesem Pseudocode oben, können Sie so etwas wie verwenden:

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

Andere Tipps

JFugue , die Note Klasse hat eine Dienstprogramm Methode, die genau dies tut - vgl. public static String getStringForNote(byte noteValue)

EDIT: Ab JFugue 5.0 und höher, die Note Klasse mehrere Hilfsmethoden hat von einem MIDI-Notenwert eine String-Darstellung für immer:

  • getToneString(byte noteValue) wandelt einen Wert von 60 auf den String C5
  • getToneStringWithoutOctave(byte noteValue) wandelt einen Wert von 60 auf den String C
  • getPercussionString(byte noteValue) wandelt ein Wert von 60 auf den String "[AGOGO]"

Diese ersetzen die ursprüngliche getStringForNote() Methode.

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

Erklärung:

  • A0 in midi ist die erste Note und seine Zahl ist 21. Wir haben den Index von 0 bis beginnen anzupassen (also am Anfang noteNumber -= 21;). Wenn Ihre Notennummer 0 basieren, zum Beispiel in den Fächern Klavier 0-88, dann können Sie diese Zeile auskommentieren.

  • Beachten Sie, dass die Notennamen in der Anordnung in dieser Lösung von A bis G starten.

  • Octave ist noteNumber / 12 + 1 (oder Decke num / 12).

  • Hinweis Namensindex ist noteNumber % 12.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top