我正在制作一个简单的应用程序来播放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序列再现。
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输出端口?
答案 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
发送打开的序列。