我有 Head First Java 的这个应用程序
import javax.sound.midi.*;
public class MiniMiniMusicApp{
public static void main(String[] args){
MiniMiniMusicApp mini = new MiniMiniMusicApp();
mini.play();
}
public void play(){
try{
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ,4);
Track track = seq.createTrack();
ShortMessage a = new ShortMessage();
a.setMessage(114,1,44,100);
MidiEvent noteOn = new MidiEvent(a,1);
track.add(noteOn);
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("damn");
}
}
}
这会在运行时引发以下异常
javax.sound.midi.InvalidMidiDataException: command out of range: 0x72
at javax.sound.midi.ShortMessage.setMessage(ShortMessage.java:280)
at MiniMiniMusicApp.play(MiniMiniMusicApp.java:15)
at MiniMiniMusicApp.main(MiniMiniMusicApp.java:6)
我阅读了一些关于 setMessage 的文档,当您传递无效的 MidiMessage 时,似乎会引发异常,但我只是按照书中的示例进行操作。我在其他论坛上读过,看来这段代码对其他人也适用。
知道是什么导致了这个问题吗?你能尝试在你的一端运行这个并看看它是否有效吗?至少这会告诉我这是否与我的环境有关。
最佳答案
您可能想要发送一条 NoteOn 消息(144
,而不是 114
)。 ShortMessage
类包含防止此类错误的常量。你可以这样使用它:
import static javax.sound.midi.ShortMessage.*;
a.setMessage(NOTE_ON, 1, 44, 100);
对于大多数人来说,这样的代码可能比直接使用数字更容易阅读。
关于java - 无效的 MidiData 异常 : command out of range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27356605/