我有一个java程序设置,它从控制器获取MIDI输入,理想情况下做不同的事情(不一定与播放合成器输出有关),具体取决于发送的midi音符。
我的代码很大程度上基于这个SO问题中的代码:Java getting input from MIDI keyboard,特别是我正在使用整个MidiInputReceiver类。我已经修改它来做System.out.println(msg)以及打印“MIDI收到,它似乎工作在每次我从我的控制器按一个键它检测到MIDI并打印midi消息,但我不知道如何将输出解码为我能解读的东西,如果可能的话。
我得到的输出是:
midi received
com.sun.media.sound.FastShortMessage@75b0e2c3
midi received
com.sun.media.sound.FastShortMessage@2ff7ac92
midi received
com.sun.media.sound.FastShortMessage@2d62bdd8
midi received
com.sun.media.sound.FastShortMessage@2d9dc72f
我一直在尝试使用这个Java类http://www.jsresources.org/examples/DumpReceiver.java.html来解码消息,但它只解码ShortMessages,而不是FastShortMessages,我在网上找不到任何关于FastShortMessage的文档,更不用说如何从FSM转换为SM。有人有什么想法吗?有没有比我正在做的更容易的方式?
编辑:这可能不是最好的方式,但我想出了一种有效的方法,我不能回答我自己的帖子8小时但我会在这里发布,以防其他人需要它。< / p>
我只是通过下面的代码设法解决了我自己的问题。
public void send(MidiMessage msg, long timeStamp) {
// Print to confirm signal arrival
System.out.println("midi received");
byte[] aMsg = msg.getMessage();
// take the MidiMessage msg and store it in a byte array
// msg.getLength() returns the length of the message in bytes
for(int i=0;i<msg.getLength();i++){
System.out.println(aMsg[i]);
// aMsg[0] is something, velocity maybe? Not 100% sure.
// aMsg[1] is the note value as an int. This is the important one.
// aMsg[2] is pressed or not (0/100), it sends 100 when they key goes down,
// and 0 when the key is back up again. With a better keyboard it could maybe
// send continuous values between then for how quickly it's pressed?
// I'm only using VMPK for testing on the go, so it's either
// clicked or not.
}
System.out.println();
}
按下两个键的示例输出:
midi received
-103
71
100
midi received
-119
71
0
midi received
-103
52
100
midi received
-119
52
0
所以aMsg [1]持有每个音符的Midi号码,可以在任何地方在线参考,由于代表我无法发布链接。
getMessage()和getLength()方法来自http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiMessage.html,我仍然没有弄清楚FastShortMessage是什么,但它可能只是剩下的遗留代码或什么?这是com.sun的东西,所以它必须很老。
从这里我可以在aMsg [1]上使用不同的情况做一个switch()语句,具体取决于按下哪个键,这正是我的目标,它将向后兼容1.6,因为它是一个整数。
答案 0 :(得分:2)
FastShortMessage
(间接)来自MidiMessage
;就像一个人一样处理它。
如果您有ShortMessage
,则应使用getCommand
/ getChannel
/ getData1
/ 2
函数,这些函数比临时函数更易于使用字节数组。