1

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

我可以正确检索我的 MIDI 输出设备(USB 到 MIDI 电缆)。

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

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

当我执行

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

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

参考文档后

3.10。
“Java Sound Sequencer”隐式连接到默认合成器,
3.5.
在您的程序中,您可以自己获取 Synthesizer 实例并连接
它使用发射器/接收器对显式发送到定序器。
所以你知道使用的是哪个合成器。
如果您获得了预连接到合成器的音序器,
您可以使用 getTransmitters() 方法找出合成器。
但是没有提到如何显式使用这个 Transmitter / Receiver 对并使用新的 Default Synthesizer 实例化 Sequencer 对象。

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

当我尝试

MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);

它似乎没有改变任何东西。

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

4

1 回答 1

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.

于 2013-01-13T14:55:48.010 回答