2012-12-01 163 views
3

我正在嘗試在我正在製作的java遊戲中循環播放MIDI序列,並且出現了一些問題。在Java中循環播放MIDI序列

我現在的代碼確實重複了序列,但序列結束和重新啓動之間有很大的延遲。我怎樣才能消除這一點?

這裏是我的代碼:

try 
    { 
    // From file 
     final Sequence sequence = MidiSystem.getSequence(new File("main menu.mid")); 
     sequencer = MidiSystem.getSequencer(); 
     sequencer.open(); 
     sequencer.addMetaEventListener(new MetaEventListener() { 
      public void meta(MetaMessage msg) { 
       if (msg.getType() == 47) { // End of track 
        sequencer.setTickPosition(0); 
        try 
        { 
         sequencer.setSequence(sequence); 
        } catch(InvalidMidiDataException e) {e.printStackTrace();} 
        sequencer.start(); 
       } 
      } 
     }); 
     sequencer.setSequence(sequence); 

    // Start playing 
     sequencer.start(); 
    } catch (IOException e) {e.printStackTrace();} 
     catch (MidiUnavailableException e) {e.printStackTrace();} 
     catch (InvalidMidiDataException e) {e.printStackTrace();} 

回答

1

這個源改編自Java Sound tag Wiki播放MIDI無環之間的「長期拖延」,這表明對我說,你所聽到的延遲是無聲的前奏的一部分/介紹現有的軌道。

import javax.sound.midi.*; 
import javax.swing.JOptionPane; 
import java.net.URL; 

class LoopMidi { 

    public static void main(String[] args) throws Exception { 
     URL url = new URL("http://pscode.org/media/EverLove.mid"); 

     Sequence sequence = MidiSystem.getSequence(url); 
     Sequencer sequencer = MidiSystem.getSequencer(); 

     sequencer.open(); 
     sequencer.setSequence(sequence); 
     //sequencer.setLoopStartPoint(2000); 
     //sequencer.setLoopEndPoint(4000); 
     sequencer.setLoopCount(5); 

     sequencer.start(); 
     JOptionPane.showMessageDialog(null, "Everlasting Love"); 
    } 
} 

然後將溶液在於兩種:

  1. 修剪MIDI軌,以消除那些延遲。
  2. 設置現有MIDI的循環點(如上所示,但註釋掉了)。
+0

我檢查了MIDI文件的尾隨沉默。空無一人。文件在聲音結束時結束。 – MichaelPlante