2017-08-10 52 views
1

這裏我有一段簡單的代碼,它以固定的時間間隔與自定義的Soundbank一起播放10個音符,但結果不是以正常速度播放,或者是引入了一個顯着的延遲。難道我做錯了什麼 ?有沒有「熱身」時間?Java MIDI音序器沒有按照正常速度播放

我在Ubuntu上使用OpenJDK 8.

謝謝:)。

import java.io.File; 
import java.io.IOException; 
import javax.sound.midi.*; 

public class MidiTest 
{ 
    static public void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, IOException 
    { 
     Sequence sequence = new Sequence(Sequence.PPQ, 1000); 
     Track track = sequence.createTrack(); 

     for (int i = 0; i < 10; i++) 
     { 
     ShortMessage noteOn = new ShortMessage(ShortMessage.NOTE_ON , 0, 50, 100); 
     ShortMessage noteOff = new ShortMessage(ShortMessage.NOTE_OFF, 0, 50, 100); 

     int noteOnTime = 1000 * i; 
     int noteOffTime = 1000 * (i + 1); 

     track.add(new MidiEvent(noteOn , noteOnTime)); 
     track.add(new MidiEvent(noteOff, noteOffTime)); 
     } 

     Soundbank soundbank = MidiSystem.getSoundbank(new File("titanic.sf2")); 

     Synthesizer synth = MidiSystem.getSynthesizer(); 
     synth.open(); 
     synth.loadAllInstruments(soundbank); 
     synth.getChannels()[0].programChange(1); 

     Sequencer sequencer = MidiSystem.getSequencer(false); 
     sequencer.open(); 

     sequencer.setSequence(sequence); 
     sequencer.setTempoInBPM(120); 

     sequencer.addMetaEventListener(new MetaEventListener() { 
      public void meta(MetaMessage msg) 
      { 
       if (msg.getType() == 47) { 
        // end of sequence 
        System.exit(0); 
       } 
      } 
     }); 

     sequencer.getTransmitter().setReceiver(synth.getReceiver()); 

     sequencer.start(); 
    } 
} 
+0

相關:https://stackoverflow.com/questions/18736681/how-accurate-is-thread-sleep –

回答

0

首先loadAllInstruments然後打開合成器:

synth.loadAllInstruments(soundbank); 
    synth.open(); 
+0

我剛試過,但那麼合成器使用默認音色庫而不是我的。 –

+0

也許這是你的soundfont問題。你有沒有嘗試過另一個soundfont? – mmehl