java - 无效的 MidiData 异常 : command out of range

标签 java javasound

我有 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/

相关文章:

java - Mockito 方法为使用的变量抛出空指针异常

java - 十六进制字符数组转十进制

java - 将 HashMap 传递给函数 - Java

java - 硬件麦克风控制

java - Servlet 过滤器是否可以检索其 url 路径?

java - 编译器提示多个异常处理

java - 无法将 InputStream 对象传递给 Java Sound API

java - AudioClip 麻烦

java - 如何跟踪音频播放位置?