无法更改Java MIDI程序中的乐器,InvalidMidiDataException:通道超出范围

3

我无法使用javax.sound.midi.ShortMessage.setMessage()方法更改乐器。通道0-15为钢琴,其中9为鼓。但8-15应该是定音鼓。当我将通道设置为16或更多(范围从0到127),我会收到javax.sound.midi.InvalidMidiDataException:通道超出范围:16。请问,我该如何解决这个问题?

    import javax.sound.midi.*;

public class TestMidi{

    public void play(){
        try{
            Sequencer player = MidiSystem.getSequencer();
            System.out.println("Sequencer created succesfully.");

            player.open();

            Sequence s = new Sequence(Sequence.PPQ, 4);

            Track track = s.createTrack();

            addShortMessage(track,1,192,1,102,0);
            addShortMessage(track,1,144,1,44,100);
            addShortMessage(track,16,128,1,44,100);

            player.setSequence(s);

            player.start();

        } catch(Exception e){
            System.out.println("Fail.");
            e.printStackTrace();
        }
    }

    public static void main(String[] args)  {
        TestMidi tm = new TestMidi();
        tm.play();
    }

    void addShortMessage(Track track, long tick, int command, int channel, int data1, int data2) throws Exception {
        ShortMessage msg = new ShortMessage(command, channel, data1, data2);
        MidiEvent event = new MidiEvent(msg, tick);
        track.add(event);
    }
}

1
MIDI端口有16个通道,编号为0...15。你认为还会有更多的通道吗? - CL.
我在《Head First Java》(第二版)这本书中读到了一个例子。在这个例子中,有像102、80、40这样的数字。此外,在这个网站链接上,我发现了一张名为“通用MIDI Level 1乐器家族”的表格。 - Alex Kadushkin
有16个通道。每个通道都可以拥有自己的乐器(通过发送程序变换消息)。通常,每个通道可以同时播放多个音符。 - CL.
@CL 我在代码中添加了'a.setMessage(192,1,102,0);',为什么它仍然弹奏钢琴? - Alex Kadushkin
@CL 谢谢,我已经编辑了代码。 - Alex Kadushkin
显示剩余9条评论
1个回答

1
通道编号从0到15。每个通道都可以有自己的乐器(通过发送程序更改消息)。
此代码向轨道添加了两条消息。如果要添加第三条消息,必须使用第三个对象调用track.add()
添加事件将更容易使用像这样的辅助函数:
void addShortMessage(Track track, long tick,
                     int command, int channel, int data1, int data2) {
    ShortMessage msg = new ShortMessage(command, channel, data1, data2);
    MidiEvent event = new MidiEvent(msg, tick); //edited here
    track.add(event);
}

我不知道为什么,但它开始正常工作了,可能是我的软件出了点问题或者它只是静悄悄的。不管怎样,谢谢您。 - Alex Kadushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接