3

我正在构建一个 Java 应用程序,它以编程方式生成一个 MIDI 序列,然后通过它发送,LoopBe Internal Midi Port以便我可以使用Ableton Live乐器来获得更好的声音播放质量。

如果我错了,请纠正我。我需要的是生成一个Sequence,将包含Tracks将包含MidiEvents,将包含MIDI messages时间信息。我想我下来了。

真正的问题是如何通过 LoopBe MIDI 端口发送它。为此,我应该需要一个Sequencer,但我不知道如何获得一个而不是默认的,而且我不想要那个。

我想一种解决方法是将序列写入 .mid 文件,然后以编程方式在 LoopBe 端口上播放它。

所以我的问题是:我怎样才能获得一个非默认的 Sequencer?

4

2 回答 2

2

你需要方法MidiSystem.getSequencer(boolean)。当您使用false参数调用它时,它会为您提供未连接的音序器。

从您的目标 MIDI 设备获取Receiver实例并将其设置为带有seq.getTransmitter().setReceiver(rec)调用的音序器。

示例片段:

MIDIDevice device = ... // obtain the MIDIDevice instance
Sequencer seq = MidiSystem.getSequencer(false);
Receiver rec = device.getReceiver();
seq.getTransmitter().setReceiver(rec)

有关 Sequencer 使用的示例,请参阅http://docs.oracle.com/javase/tutorial/sound/MIDI-seq-methods.html上的教程

于 2012-10-02T05:59:27.200 回答
1

对于我自己的项目,我使用 LoopBe1 将 MIDI 信号发送到 REAPER。当然,LoopBe1 应该已经安装好了。

在这个例子中,我为 LoopBe 的外部 MIDI 端口遍历系统的 MIDI 设备,然后发送音符 C 10 次。

import javax.sound.midi.*;

public class Main {
    public static void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, InterruptedException {
        MidiDevice external;

        MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();

        //Iterate through the devices to get the External LoopBe MIDI port

        for (MidiDevice.Info deviceInfo : devices) {

            if(deviceInfo.getName().equals("LoopBe Internal MIDI")){
                if(deviceInfo.getDescription().equals("External MIDI Port")){
                    external = MidiSystem.getMidiDevice(deviceInfo);
                    System.out.println("Device Name : " + deviceInfo.getName());
                    System.out.println("Device Description : " + deviceInfo.getDescription() + "\n");

                    external.open();
                    Receiver receiver = external.getReceiver();
                    ShortMessage message = new ShortMessage();


                    for (int i = 0; i < 10; i++) {
                        // Start playing the note Middle C (60),
                        // moderately loud (velocity = 93).
                        message.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
                        long timeStamp = -1;
                        receiver.send(message, timeStamp);
                        Thread.sleep(1000);
                    }

                    external.close();
                }
            }
        }
    }
}

有关发送 MIDI 信号的更多信息,请参阅此链接:

https://docs.oracle.com/javase/tutorial/sound/MIDI-messages.html

我希望这有帮助!

于 2016-04-04T13:22:31.587 回答