有没有人知道的任何东西存在的Java世界地图的midi注意数字的具体注释的名称和八度的数字。例如,请参阅附表:

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

我想地图的midi注60号,它的对应注意名称(MiddleC)倍频4.我可以写一本实用新类/枚举,但这将是相当繁琐。有没有人知道为什么吗?

我具体使用这一编写一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];
有帮助吗?

解决方案

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

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

其他提示

JFugue, , Note 类有一个实用的方法,正是这种-看看 public static String getStringForNote(byte noteValue).

编辑: 为JFugue5.0和后来的, Note 类有几个实用的方法得到一串表示从一个MIDI注意价值:

  • getToneString(byte noteValue) 将一个价值 60 字符串 C5
  • getToneStringWithoutOctave(byte noteValue) 将一个价值 60 字符串 C
  • getPercussionString(byte noteValue) 换一个 值 60 字符串 "[AGOGO]"

这些替代原来的 getStringForNote() 法。

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在南是第一个注意其数为21。我们调整指数从0(因此 noteNumber -= 21; 在开始).如果你注意的数字是0的基础,例如在钢琴从0到88,然后你可以发表评论,这条线。

  • 请注意,在这个解决方案,注的名字在列开始从A到G。

  • 八度 noteNumber / 12 + 1 (其他资源最高限额为num/12).

  • 注意名称索引 noteNumber % 12.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top