如何拦截 MIDI 信息?

How can I intercept MIDI messages?

我正在编写一个应用程序来控制 Novation 的启动板设备(对于那些熟悉的人)。 launchpad 安装了两个 MIDI 设备:一个用于输入(按下按钮),一个用于输出(控制 LED)。

我的想法是,在收到来自启动板的消息后,我想发送一系列其他消息。最好的方法是什么?

现在,我将输入设备的发送器链接到输出设备的接收器,这样收到的每条消息都会直接发送回启动板:

Transmitter lpTransmitter = inputDevice.getTransmitter();
lpTransmitter.setReceiver(outputDevice.getReceiver());

javax.sound.midi 包有一个由想要接收事件的代码实现的接口。它被称为Receiver

注意open the device before getting the transmitter

我设法自己找到了解决方案。我所做的是使用我自己的发射器和接收器实现链接设备。据我了解,midi 消息是这样的:

launchpad 输入 -> inputDevice 的接收器 -> inputDevice 的发射器 -> 我自己的接收器 -> (我的计算) -> 我自己的发射器 -> outputDevice 的接收器 -> outputDevice 的发射器 -> launchpad 输出。

请耐心等待,因为我不知道这是否正确的方法,但我的代码是这样的:

// main
// get launchpad devices, open them

MyMidiDevice myDevice = new MyMidiDevice();

inputDevice.getTransmitter().setReceiver(myDevice);
myDevice.setReceiver(outputDevice.getReceiver());

MyMidiDevice 的代码 class :

public class MyMidiDevice implements Transmitter, Receiver
{

    private Receiver receiver;

    @Override
    public Receiver getReceiver()
    {
        return this.receiver;
    }

    @Override
    public void setReceiver(Receiver receiver)
    {
        this.receiver = receiver;
    }

    @Override
    public void close()
    {
    }

    @Override
    public void send(MidiMessage message, long timeStamp)
    {
        System.out.println(message); // computations
        this.getReceiver().send(message, timeStamp);
    }
}