转换MIDI音符号命名和八度

问题描述 投票:11回答:3

是否有人知道的东西存在于Java世界中,以MIDI音符号映射到特定的音符名称和倍频数。例如,参照参考表:

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

我要地图MIDI音符编号60到它在倍频4对应的音符名(MiddleC)我可以写这样的实用工具类/枚举,但它会相当繁琐。有谁知道的东西吗?

我专门用这个用Java编写一个TENORI开/ 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];
java audio midi javasound
3个回答
14
投票

我不相信你的建议是乏味的。这真的只是一个分而取模操作,得到一个八度,其他的获得说明。

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

2
投票

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()方法。


0
投票
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;
}

说明:

  • A0在MIDI是第一个音符和它的编号是21.我们调整指数从0开始(因此noteNumber -= 21;开头)。如果你的笔记数字是基于0的,例如在钢琴从0到88,那么你可以评论这条线了。
  • 注意,在这个解决方案中,阵列中的音名开始从A到G.
  • 八度是noteNumber / 12 + 1(或数/ 12的上限)。
  • 注名指数noteNumber % 12
© www.soinside.com 2019 - 2024. All rights reserved.