19

MIDIノート番号を特定のノート名とオクターブ番号にマップするためにJavaの世界に存在するものを知っている人はいますか? たとえば、参照表を参照してください。

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

MIDI ノート番号 60 をオクターブ 4 の対応するノート名 (MiddleC) にマップしたいと考えています。これにはユーティリティ クラス/列挙型を記述できますが、かなり面倒です。誰か何か知っていますか?

私は特に Java で Tenori-On/Monome のクローンを作成するためにこれを使用しています。

解決

これは私が最終的に使用したものです:

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];
4

4 に答える 4

17

あなたの提案がそれほど退屈だとは思いません。これは実際には除算とモジュロの演算であり、1 つはオクターブを取得し、もう 1 つは音符を取得します。

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

実際の Java では、上記の疑似コードとは対照的に、次のようなものを使用できます。

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);
    }
  }
}
于 2009-04-03T05:48:04.967 に答える
4

JFugueではNoteクラスにはまさにこれを行うユーティリティ メソッドがありますpublic static String getStringForNote(byte noteValue)

編集: JFugue 5.0 以降では、このNoteクラスには、MIDI ノート値から文字列表現を取得するためのいくつかのユーティリティ メソッドがあります。

  • getToneString(byte noteValue)60の値を文字列に変換し ますC5
  • getToneStringWithoutOctave(byte noteValue)60の値を文字列に変換しますC
  • getPercussionString(byte noteValue)60の値を文字列に変換します"[AGOGO]"

getStringForNote()これらは元の方法を置き換えます。

于 2010-01-05T18:59:55.180 に答える
1

これは、名前付き定数が多すぎない最短の形式です。ループも必要ありません。

public static String getNoteFromMidiNumber(int midiNote){
    String[] note_names = {"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
    return note_names[midiNote % 12] + ((midiNote / 12) - 1);
 }
于 2020-10-18T01:17:46.187 に答える