1

Here I have a simple piece of code that plays 10 notes at a constant interval with a custom Soundbank, but the result is not playing at a regular pace, or something is introducing a significant delay. Am I doing something wrong ? Is there a "warm-up" time ?

I'm on Ubuntu with OpenJDK 8.

Thanks :).

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();
   }
}
mmehl
  • 234
  • 1
  • 6

1 Answers1

0

First loadAllInstruments and then open the synth:

  synth.loadAllInstruments(soundbank);
  synth.open();
mmehl
  • 234
  • 1
  • 6