从Java中的MIDI Controller接收com.sun.media.sound.FastShortMessage,如何解码?

时间:2014-04-22 14:57:01

标签: java midi javax.sound.midi

我有一个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,因为它是一个整数。

1 个答案:

答案 0 :(得分:2)

FastShortMessage(间接)来自MidiMessage;就像一个人一样处理它。

如果您有ShortMessage,则应使用getCommand / getChannel / getData1 / 2函数,这些函数比临时函数更易于使用字节数组。