如何拦截 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);
}
}
我正在编写一个应用程序来控制 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);
}
}