【问题标题】:Java send midi message to deviceJava向设备发送midi消息
【发布时间】:2018-05-19 00:50:45
【问题描述】:

我有一个连接到树莓派的 APC40 MkII。在 pi 上,我正在运行 java。使用 java.sound.midi 包,我可以建立与 APC 的连接并毫无问题地接收它的 midi 消息。但是经过大量研究后,我仍然不知道如何将 midi 消息发送到 APC。

这是我目前的代码:

package lightorgansandbox;

import javax.sound.midi.*;
import java.util.List;


public class MidiHandler {

public MidiHandler() {
    MidiDevice device;
    MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();

    for (MidiDevice.Info info : infos) {

        System.out.println("Info: '" + info.toString() + "'");

        try {
            device = MidiSystem.getMidiDevice(info);

            List<Transmitter> transmitters = device.getTransmitters();

            for(int j = 0; j<transmitters.size();j++) {
                transmitters.get(j).setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));
            }  

            Transmitter trans = device.getTransmitter();
            trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));

            device.open();

        }catch (MidiUnavailableException e) {}
    }
}

public class MidiInputReceiver implements Receiver {

    public String name;

    public MidiInputReceiver(String name) {
        this.name = name;
    }

    public void send(MidiMessage msg, long timeStamp) {

        if (msg instanceof ShortMessage) {
            ShortMessage shortMessage = (ShortMessage) msg;

            int channel = shortMessage.getChannel();
            int pitch = shortMessage.getData1();
            int vel = shortMessage.getData2();
            System.out.println("Channel: " + channel);
            System.out.println("Pitch: " + pitch);
            System.out.println("vel: " + vel);

        }

    }

    public void close() {}

}

}

这一切都按照我想要的方式进行。但是我可以在哪里向设备发回消息?

【问题讨论】:

    标签: java midi


    【解决方案1】:

    只需将消息发送到设备的接收器即可。 来自documentation

      Receiver rcvr = MidiSystem.getReceiver();  /* or device.getReceiver() */
    
      ShortMessage myMsg = new ShortMessage();
      myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
      long timeStamp = -1;
      rcvr.send(myMsg, timeStamp);
    

    【讨论】:

    • 你是明星CL。这行得通。但我还是很困惑。我在此代码中看不到与特定设备的连接。 MidiSystem.getReceiver() 如何知道是哪个设备。如果我连接了三个不同的 Midi 控制器怎么办???
    • MidiSystem.getReceiver() 命令工作得很好。虽然我仍然不明白 MidiSystem 知道将命令发送到哪里。如果我使用 device.getReceiver() 我会收到以下错误: 线程“main”中的异常 javax.sound.midi.MidiUnavailableException: MIDI IN 接收器在 com.sun.media.sound.AbstractMidiDevice.createReceiver(AbstractMidiDevice.java:第418章)在com.sun.media.sound.AbstractMidiDevice.getReceiver(AbstractMidiDevice.java:280)
    • 我无法得到确切的答案,但这可能会给出一些提示:docs.oracle.com/javase/7/docs/api/javax/sound/midi/…
    • 找到了关于如何选择设备的完整说明/您可以选择所需的设备:docs.oracle.com/javase/tutorial/sound/accessing-MIDI.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多