我该如何拦截MIDI信息?

时间:2016-05-22 18:14:24

标签: java midi

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

这个想法是,一旦从启动板收到消息,我想发送一系列其他消息。最好的方法是什么?

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

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

2 个答案:

答案 0 :(得分:0)

javax.sound.midi包具有一个接口,该接口由想要接收事件的代码实现。它被称为https://github.com/freebsd/freebsd/blob/master/usr.bin/procstat/procstat_rusage.c

注意Receiver

答案 1 :(得分:0)

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

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

现在忍受我,因为我不知道这是正确的方式,但我的代码是这样的:

// main
// get launchpad devices, open them

MyMidiDevice myDevice = new MyMidiDevice();

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

MyMidiDevice类的代码:

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);
    }
}