【问题标题】:How can I intercept MIDI messages?如何拦截 MIDI 信息?
【发布时间】:2016-09-19 13:25:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • “从启动板收到消息后,发送一系列其他消息。”您已经正确描述了它的工作原理。究竟是什么问题?
  • 好吧,我怎么知道我收到了一条消息?是否有某种事件监听器?

标签: java midi


【解决方案1】:

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

请注意open the device before getting the transmitter

【讨论】:

  • 我知道Receiver,但是如何使用它来接收消息呢?我是否创建自己的类来实现它? javadoc 告诉我我必须定义send(),但是如果我链接一个发射器,该方法会被自动调用吗?请原谅我的无知,我是Java的初学者
【解决方案2】:

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

launchpad 输入 -> 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多