Java 中用于播放的硬件 MIDI 输出?
Posted
技术标签:
【中文标题】Java 中用于播放的硬件 MIDI 输出?【英文标题】:Hardware MIDI Out for Playback in Java? 【发布时间】:2012-12-28 16:35:10 【问题描述】:我正在制作一个简单的应用程序来播放 Java 中的 MIDI 文件。
我正在使用javax.sound.midi
库。
我可以正确检索我的 MIDI 输出设备(USB 到 MIDI 电缆)。
但是当我播放序列时,它总是在默认的声音合成器中播放,这是主机操作系统的通用 Midi (Soundfont) 播放。
我遇到的问题是更改默认的 MIDI 输出。
当我执行时
Receiver MidiOutReceiver; //instantiated earlier
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
MidiOutSequencer.open();
MidiOutSequencer.start();
我从扬声器中听到 MIDI 序列再现。
参考后documentation
3.10。 “Java Sound Sequencer”隐式连接到默认合成器, 3.5. 在您的程序中,您可以自己获取 Synthesizer 实例并连接 它使用发射器/接收器对显式发送到定序器。 所以你知道使用的是哪个合成器。 如果您获得了预连接到合成器的音序器, 您可以使用 getTransmitters() 方法找出合成器。 但是没有提到如何显式使用这个 Transmitter / Receiver 对并使用新的 Default Synthesizer 实例化 Sequencer 对象。我有正确的发射器和接收器。 但是他们并不是把MIDI弹出来的。
当我尝试时
MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);
它似乎没有改变任何东西。
我如何明确地将此接收器/发射器对与合成器一起使用,以便默认音序器使用我的 MIDI 输出端口?
【问题讨论】:
【参考方案1】:我忽略了一些简单的事情。 MidiSystem.getSequencer();
返回的默认 Sequencer
有一个 Transmitter,而后者又具有一个 setReceiver()
方法来添加 MIDI 输出设备。但您必须拥有正确的 MIDI 输出设备。我不小心选错了设备。
首先通过查看DeviceInfos
数组来选择正确的输出设备,选择正确的设备,然后用正确的Receiver
实例化Sequencer
。
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
中发送打开的序列。
【讨论】:
MidiDevice.getReceivers()
的文档说“可以通过关闭接收器从设备中移除它。”所以大概你可以用for (Receiver receiver : MidiSystem.getSequencer().getReceivers()) receiver.close();
删除默认的MIDI输出设备以上是关于Java 中用于播放的硬件 MIDI 输出?的主要内容,如果未能解决你的问题,请参考以下文章