【问题标题】:Receiving com.sun.media.sound.FastShortMessage from MIDI Controller in Java, how to decode?从Java中的MIDI控制器接收com.sun.media.sound.FastShortMessage,如何解码?
【发布时间】:2014-06-07 00:51:39
【问题描述】:

我设置了一个 java 程序,它从控制器获取 MIDI 输入,理想情况下根据发送的 MIDI 音符做不同的事情(不一定与播放合成器输出有关)。

我的代码很大程度上基于这个 SO 问题中的代码:Java getting input from MIDI keyboard,特别是我正在使用整个 MidiInputReceiver 类。我已经对其进行了修改以执行 System.out.println(msg) 以及打印“收到的 MIDI”,并且它似乎可以在每次我按下控制器上的一个键时检测到 MIDI 并打印 midi msg ,但我不知道如何将输出解码成我可以破译的东西,如果这可能的话。

我得到的输出是:

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 小时内回复我自己的帖子,但我会在这里发布以防其他人需要它。

我只是设法用下面的代码解决了我自己的问题。

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

【问题讨论】:

    标签: java midi javax.sound.midi


    【解决方案1】:

    FastShortMessage (间接)源自MidiMessage;像对待一个人一样处理它。

    当您有ShortMessage 时,您应该使用getCommand/getChannel/getData1/2 函数,它比临时字节数组更易于使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多