硬件MIDI输出用于Java中的播放?

时间:2012-12-28 16:35:10

标签: java midi midi-interface javax.sound.midi

我正在制作一个简单的应用程序来播放Java中的MIDI文件 我正在使用javax.sound.midi库。

我可以正确检索我的MIDI输出设备(USB转MIDI连接线)。

但是当我播放序列时,它总是在默认声音合成器中播放,这是主机操作系统的General Midi(Soundfont)播放。

我遇到的问题是更改默认的MIDI输出。

执行时

Receiver MidiOutReceiver; //instantiated earlier
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
MidiOutSequencer.open();
MidiOutSequencer.start();

我听到扬声器的MIDI序列再现。

参考documentation

3.10.
The "Java Sound Sequencer" is implicitly connected to the default Synthesizer, 
3.5.
In your program you can obtain a Synthesizer instance yourself and connect 
it to a sequencer explicitly using a Transmitter / Receiver pair. 
So you know which Synthesizer is used. 
In case you obtained a Sequencer that is pre-connected to a Synthesizer,
you can find out the Synthesizer by using the method getTransmitters().
但是没有提到如何明确使用这个Transmitter / Receiver对并用新的默认合成器实例化Sequencer对象。

我有正确的发射器和接收器。 但是他们没有弹出MIDI。

当我尝试

MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);

似乎没有任何改变。

如何将此接收器/发送器对与合成器明确配合使用,以便默认音序器将使用我的MIDI输出端口?

1 个答案:

答案 0 :(得分:1)

我忽略了一些简单的事情。 Sequencer返回的默认MidiSystem.getSequencer();有一个Transmitter,后者又有一个setReceiver()方法来添加MIDI Out设备。但是你必须拥有正确的MIDI输出设备。我偶然选择了一个错误的设备。

首先,通过查看DeviceInfos数组,选择正确的设备,然后使用正确的Sequencer设置Receiver来选择正确的输出设备。

MidiDevice.Info[] MidiDeviceInfos = MidiSystem.getMidiDeviceInfo();
//find the suitable device number here, based on some criteria
MidiDevice MidiOutDevice = MidiSystem.getMidiDevice(MidiDeviceInfos[DEVICE_NUMBER]);
Receiver MidiOutReceiver = MidiOutDevice.getReceiver();
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
//Add the new MIDI out device here.
MidiOutSequencer.getTransmitter().setReceiver(MidiOutReceiver);
MidiOutSequencer.open();

现在您可以open()一个文件和play()它,但由于还使用了默认的MIDI输出设备,您也可以听到通用MIDI / Soundfont MIDI声音。这首先让我失望,但现在MIDI设备也将从你添加的Receiver发送打开的序列。