问题 将Midi Note数字转换为Name和Octave


是否有人知道Java世界中存在的任何内容,用于将midi音符编号映射到特定音符名称和八度音程。例如,请参阅参考表:

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

5927
2018-04-03 05:44


起源

Jon,我在答案中添加了一些真正的Java。 - paxdiablo
真棒,感谢指点...... - Jon


答案:


我不相信你的建议是  乏味。它实际上只是一个分而模的操作,一个得到八度音,另一个得到音符。

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

13
2018-04-03 05:48



也许Jon正在考虑为每个音符+八度组合创建一个枚举? - Smashery
这是最初的疯狂建议。我一直在寻找算法......我确信我可以解决这个问题,我不认为它在Java中是有效的...不应该花很长时间来翻译... - Jon
此外,也许有人可能希望得到一个内在的com。<whatever> .Midi,它与Java一起“运送”,包含这样的方法。但是,是否要调用音符(61?)C#或Db仍然无法解决。如果有一个密钥签名,可以根据密钥签名解决(对于许多情况)。即,对于B的键,它将是C#。对于Gb的关键,它将是Db。 - David Elson


JFugueNote class有一个实用方法就是这样 - 看 public static String getStringForNote(byte noteValue)

编辑: 截至JFugue 5.0及更高版本 Note class有几种实用方法可以从MIDI音符值中获取字符串表示:

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

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


2
2018-01-05 18:59



有趣。它看起来像jFugue 5不再具有 org.jfugue.Note。它有 org.jfugue.theory.Note 但那一个似乎没有 getStringForNote 方法。不确定为什么人们决定拿走有用的功能(特别是因为它的成本不是那么高)虽然可能是它们被移动到其他地方,但不是我能找到它:-) - paxdiablo
实际上,新的Note类比旧版本具有更多的实用程序功能。新的getStringForNote是getToneString(byte noteValue) - 对于值60,这将返回“C5”。现在还有getToneStringWithoutOctave(byte noteValue),它将为60返回“C”。您还可以找到getPercussionString(byte noteValue),其中60将返回“[AGOGO]”。新方法比原始方法更丰富,并且需要新的功能名称来阐明其目的。 - David Koelle