2017-08-10 3 views
1

ここでは、カスタムサウンドバンクで一定の間隔で10音符を演奏する単純なコードがありますが、結果は通常のペースで再生されていないか、かなりの遅延。私は何か間違っているのですか? 「ウォームアップ」時間はありますか?Java MIDIシーケンサーが通常のペースで再生していません

私はOpenJDKの8とUbuntuの上

感謝:)です。その後、

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

あなたのサウンドフォンに問題があるかもしれません。別のサウンドフォントを試しましたか? – mmehl

関連する問題