代码之家  ›  专栏  ›  技术社区  ›  Jonathan Holloway

将MIDI音符转换为名称和八度

  •  11
  • Jonathan Holloway  · 技术社区  · 16 年前

    有人知道Java世界中存在的任何东西,可以将MIDI注释号映射到特定的音符名称和倍频数。例如,请参见参考表:

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

    我想把一个60号的MIDI音符映射到它在八度音阶4中对应的音符名(middec)。我可以为此编写一个实用程序类/枚举,但这会非常繁琐。有人知道什么吗?

    我特别用这个来在爪哇写一个Tuni on /MunMe克隆,到目前为止还不错。

    解决方案

    这就是我最终使用的:

    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];
    
    3 回复  |  直到 6 年前
        1
  •  13
  •   paxdiablo    8 年前

    我不相信你的建议是 那个 乏味的它实际上只是一个除法和模运算,一个得到八度,另一个得到音符。

    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
  •  2
  •   David Koelle    8 年前

    JFugue , the Note 类有一个实用程序方法可以执行此操作-请参见 public static String getStringForNote(byte noteValue) .

    编辑: 从jfugue 5.0及更高版本开始, 注释 类具有从midi note值获取字符串表示形式的几种实用方法:

    • getToneString(byte noteValue) 转换值 60 C5
    • getToneStringWithoutOctave(byte noteValue) 转换值 六十 C
    • getPercussionString(byte noteValue) 转换A 价值 六十 "[AGOGO]"

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

        3
  •  0
  •   A-Sharabiani    6 年前
    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;
    }
    

    说明:

    • 在MIDI中,a0是第一个音符,它的编号是21。我们调整索引从0开始(因此 noteNumber -= 21; 一开始)。如果你的音符是以0为基础的,例如钢琴从0到88,那么你可以把这一行注释掉。

    • 注意,在这个解决方案中,数组中的注释名称从a开始到g。

    • 倍频程是 noteNumber / 12 + 1 (或num/12的天花板)。

    • 注释名称索引为 noteNumber % 12 .