2011-05-18 62 views
1

我重塑在Java中的遊戲的一部分,我需要知道如何播放MIDI聲音文件。最好不涉及導入任何外部庫。它也必須在新線程中運行,以便我可以將單個聲音疊加在背景歌曲上。如何在Java中的新線程中播放.MIDI文件?

感謝您的想法和時間。

回答

2

此代碼在播放同時對兩個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; 
    } 

} 
+0

感謝您的答覆。該代碼似乎運行良好,但是,由於某種原因沒有聲音產生。我在Eclipse中運行它,並且我的聲音正在工作並出現。有任何想法嗎? – Feste 2011-05-18 03:20:08

+0

您是否擁有能夠成功播放這些MIDI文件的*任何*軟件(例如WinAmp或Windows Media Player)? – 2011-05-18 04:21:28

+0

是的。 Winamp,Quicktime和Windows Media Player都可以播放該文件。 – Feste 2011-05-18 04:28:42