我正在构建一个Java程序,以编程方式生成一个MIDI序列,然后通过LoopBe Internal Midi Port
发送,以便我可以使用Ableton Live
仪器来获得更好的声音播放质量。
如果我错了,请纠正我。我需要的是生成Sequence
,其中包含Tracks
,其中包含MidiEvents
,其中包含MIDI messages
及时间信息。我觉得我失败了。
真正的问题是如何通过LoopBe MIDI端口发送它。为此,我认为需要Sequencer
,但我不知道如何获得一个而不是默认的一个,我不希望这样。
我想解决方法是将Sequence写入.mid文件,然后以编程方式在LoopBe端口上播放。
所以我的问题是:如何获取非默认的音序器?
答案 0 :(得分:1)
您需要方法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
上的教程答案 1 :(得分:1)
对于我自己的项目,我使用LoopBe1将MIDI信号发送到REAPER。 当然,应该已经安装了LoopBe1。
在这个例子中,我遍历系统的MIDI设备,用于LoopBe的外部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
我希望这有帮助!