1
我重塑在Java中的遊戲的一部分,我需要知道如何播放MIDI聲音文件。最好不涉及導入任何外部庫。它也必須在新線程中運行,以便我可以將單個聲音疊加在背景歌曲上。如何在Java中的新線程中播放.MIDI文件?
感謝您的想法和時間。
我重塑在Java中的遊戲的一部分,我需要知道如何播放MIDI聲音文件。最好不涉及導入任何外部庫。它也必須在新線程中運行,以便我可以將單個聲音疊加在背景歌曲上。如何在Java中的新線程中播放.MIDI文件?
感謝您的想法和時間。
此代碼在播放同時對兩個MIDI音軌(第二順序儘快開始爲第1對話框已被解除)。沒有線程是明確創建的,但我想如果它們被封裝在一個Thread
對象中,它的工作原理將會大致相同。
import java.net.URL;
import java.util.Locale;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Transmitter;
import javax.swing.JOptionPane;
import org.apache.commons.lang.StringUtils;
class PlayMidi {
public static boolean useExternalSynth = false;
public static void main(String[] args) throws Exception {
MidiDevice receivingDevice = getReceivingDevice();
receivingDevice.open();
URL url1 = new URL("http://pscode.org/media/EverLove.mid");
Sequence sequence1 = MidiSystem.getSequence(url1);
Sequencer sequencer1 = MidiSystem.getSequencer(false);
Transmitter tx1 = sequencer1.getTransmitter();
Receiver rx1 = receivingDevice.getReceiver();
tx1.setReceiver(rx1);
sequencer1.open();
sequencer1.setSequence(sequence1);
URL url2 = new URL("http://pscode.org/media/AftrMdnt.mid");
Sequence sequence2 = MidiSystem.getSequence(url2);
Sequencer sequencer2 = MidiSystem.getSequencer(false);
Transmitter tx2 = sequencer2.getTransmitter();
Receiver rx2 = receivingDevice.getReceiver();
tx2.setReceiver(rx2);
sequencer2.open();
sequencer2.setSequence(sequence2);
sequencer1.start();
JOptionPane.showMessageDialog(null, "Everlasting Love");
sequencer2.start();
JOptionPane.showMessageDialog(null, "After Midnight");
}
private static MidiDevice getReceivingDevice()
throws MidiUnavailableException {
for (MidiDevice.Info mdi: MidiSystem.getMidiDeviceInfo()) {
MidiDevice dev = MidiSystem.getMidiDevice(mdi);
if (dev.getMaxReceivers() != 0) {
String lcName =
StringUtils.defaultString(mdi.getName())
.toLowerCase(Locale.ENGLISH);
if (lcName.contains(useExternalSynth? "usb": "java")) {
return dev;
}
}
}
return null;
}
}
感謝您的答覆。該代碼似乎運行良好,但是,由於某種原因沒有聲音產生。我在Eclipse中運行它,並且我的聲音正在工作並出現。有任何想法嗎? – Feste 2011-05-18 03:20:08
您是否擁有能夠成功播放這些MIDI文件的*任何*軟件(例如WinAmp或Windows Media Player)? – 2011-05-18 04:21:28
是的。 Winamp,Quicktime和Windows Media Player都可以播放該文件。 – Feste 2011-05-18 04:28:42