2017-08-10 4 views
1

Ici, j'ai un simple morceau de code qui joue 10 notes à intervalles réguliers avec un Soundbank personnalisé, mais le résultat ne joue pas à un rythme régulier, ou quelque chose introduit un retard important. Est-ce que je fais quelque chose de mal ? Y a-t-il un temps de "réchauffement"?Java MIDI séquenceur ne joue pas à un rythme régulier

Je suis sur Ubuntu avec OpenJDK 8.

Merci :).

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

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

Répondre

0

Première loadAllInstruments puis ouvrez le synthé:

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

Je viens d'essayer, mais alors le synthé utilise la banque de sons par défaut et pas la mienne. –

+0

Peut-être que c'est un problème dans votre soundfont. Avez-vous essayé une autre soundfont? – mmehl