Java MIDI - ControllerEventListener (Как сменить инструмент) - PullRequest
0 голосов
/ 18 марта 2019

Я работаю над программой, которая генерирует и воспроизводит MIDI-события.Я реализовал интерфейс ControllerEventListener для печати сообщений каждый раз, когда воспроизводится одна из 15 нот.

Проблема в том, что я не могу сменить инструмент, на котором ноты больше играют (под этим я должен сказать, что мой компьютер не использует фортепиано по умолчанию, а барабан или что-то подобное, еслиЯ добавляю ControllerEvent в трек) Я уже искал соответствующие методы в спецификациях API Java, но я не нашел ничего, что могло бы решить мою проблему, так же мало, как я нашел на этом сайте или путем поиска в Google.Я также попытался сменить инструмент всего канала (добавив сообщение Program Change), но он был таким же, как и раньше.

Код следующий:

import javax.sound.midi.*;

public class MusikPlayer implements ControllerEventListener {
    public static void main(String[] args) {
        MusikPlayer mini = new MusikPlayer();
        mini.go();
    }

    public void go() {
        try {
            Sequencer sequencer = MidiSystem.getSequencer();
            sequencer.open();

            int[] wishedEvents = {127};
            sequencer.addControllerEventListener(this, wishedEvents);

            Sequence seq = new Sequence(Sequence.PPQ, 4);
            Track track = seq.createTrack();

            for (int i = 5; i < 61; i+=4) {
                track.add(generateEvent(144, 1, i, 100, i));
                track.add(generateEvent(128, 1, i, 100, i+2));
                track.add(generateEvent(176, 1, 127, 0, i));
            }

            sequencer.setSequence(seq);
            sequencer.setTempoInBPM(220);
            sequencer.start();
            Thread.sleep(5000);
            sequencer.close();

        } catch (Exception e) {e.printStackTrace();}
    }

    public void controlChange(ShortMessage event) {
        System.out.println("la");
    }

    public MidiEvent generateEvent(int comd, int chan, int one, int two, int tick) {
        MidiEvent event = null;

        try {
            ShortMessage a = new ShortMessage();
            a.setMessage(comd, chan, one, two);
            event = new MidiEvent(a, tick);
        } catch (Exception e) {}

        return event;
    }
}

Мой вопрос сейчас такой: как я могу изменить инструмент без изменения процедуры обработки событий?

...