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();
}
}
connexes: https://stackoverflow.com/questions/18736681/how-accurate-is-thread-sleep –