Невозможно изменить инструмент в Java MIDI-программе, InvalidMidiDataException: канал вне диапазона - PullRequest
2 голосов
/ 05 марта 2020

Я не могу изменить инструмент с помощью метода javax.sound.midi.ShortMessage.setMessage (). Канал 0-15 - пианино, за исключением 9, который предназначен для барабана. Но 8-15 должно быть Chromati c Percussion. Когда я устанавливаю канал на 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 Ответ

1 голос
/ 13 марта 2020

Номера каналов go от 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);
}
...