'I'm getting java.lang.IllegalStateException: sequencer not open. What's the solution?

This is the code I'm trying to run but I keep getting IllegalStateException. I'm relatively new to java and I need some help figuring this out. Thanks:)

This is the code:

import javax.sound.midi.*;

public class MiniMusicApp {
    public static void main(String[] args){
        MiniMusicApp mini = new MiniMusicApp();
        mini.play();
    }//Close main

    public void play(){
        try{
            Sequencer player = MidiSystem.getSequencer();
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, 44, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            player.setSequence(seq);
            player.start();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }//close play
}//close class

And I'm getting this:

java.lang.IllegalStateException: sequencer not open
    at java.desktop/com.sun.media.sound.RealTimeSequencer.start(RealTimeSequencer.java:232)
    at MiniMusicApp.play(MiniMusicApp.java:21)
    at MiniMusicApp.main(MiniMusicApp.java:6)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)       
    at java.base/java.lang.reflect.Method.invoke(Method.java:577)
    at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:421)
    at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
    at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)


Solution 1:[1]

You forgot to open the Sequencer, which is why you got an exception. To open the player

Sequencer player = MidiSystem.getSequencer();
player.open();

Solution 2:[2]

For demonstration only, don't do this

As @Abra said, you need to call the open method:

import javax.sound.midi.*;

public class MiniMusicApp {
    public static void main(String[] args){
        MiniMusicApp mini = new MiniMusicApp();
        mini.play();
    }//Close main

    public void play(){
        try{
            Sequencer player = MidiSystem.getSequencer();
            player.open();
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, 44, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            player.setSequence(seq);
            player.start();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }//close play
}//close class

However you should also close it at the end:

import javax.sound.midi.*;

public class MiniMusicApp {
    public static void main(String[] args){
        MiniMusicApp mini = new MiniMusicApp();
        mini.play();
    }//Close main

    public void play(){
        Sequencer player = null;
        try{
            player = MidiSystem.getSequencer();    
            player.open();
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, 44, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            player.setSequence(seq);
            player.start();
        }catch(Exception ex){
            ex.printStackTrace();
        }
        finally {if(player!=null) player.close();}
    }//close play
}//close class

The correct way

But this way is error prone, so in modern Java you should use try-with-resource to close it automatically:

import javax.sound.midi.*;

public class MiniMusicApp {
    public static void main(String[] args){
        MiniMusicApp mini = new MiniMusicApp();
        mini.play();
    }//Close main

    public void play(){
        Sequencer debug = null; // just for demonstrating that it is really closed at the end
        try(Sequencer player = MidiSystem.getSequencer())   
        {
            debug = player;
            player.open();
            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, 44, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            player.setSequence(seq);
            player.start();
        }catch(Exception ex){
            ex.printStackTrace();
        }
        System.out.println(debug.isOpen());
    }//close play
}//close class

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Abdul Wasey
Solution 2