Я работаю над программой, которая генерирует и воспроизводит 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;
}
}
Мой вопрос сейчас такой: как я могу изменить инструмент без изменения процедуры обработки событий?