'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 |
