Question

I currently have a very simple class:

public class Music {
    private Sequence sequence;
    private Sequencer sequencer;

    public Music(String music) {
        try {
            this.sequence = MidiSystem.getSequence(ResourceManager.getMusic(music + ".mid"));
            this.sequencer = MidiSystem.getSequencer();
            this.sequencer.open();
            this.sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
            this.sequencer.setSequence(sequence);
        } catch (Exception e) { System.out.println("Oops - something went wrong."); }
    }

    public void play() {
        this.sequencer.start(); 
    }

    public void stop() {
        this.sequencer.stop();
    }
}

All I have to do is create an object of this class and use the play()-method to start the music. However, I don't want to play just one MIDI file anymore: once the song has ended, I want to start the next one.

So I would like to create a playlist, like:

sequence.add("midifile1.mid");
sequence.add("midifile2.mid");

However, I don't find such an option in the API documentation (there is a createTrack()-option, but I don't really understand how to use this to add more music). I could create multiple objects from this class, but then I still don't know when one file has ended and the next one should start.

Looking at online examples, it only gets more confusing. What's the best way to do this?

Thanks

Was it helpful?

Solution

I've managed to solve it using a MetaEventListener to detect when a sequence is completed:

        this.sequencer.addMetaEventListener(new MetaEventListener() {
          public void meta(MetaMessage event) {
              if (event.getType() == 47) {
                  // start new sequence
              }
          }
    });;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top