В настоящее время я реализовал функцию, которая позволяет пользователю воспроизводить сыгранные ноты.
Вот код:
public void playNotes() throws InvalidMidiDataException,
MidiUnavailableException {
ArrayList<KeyPress> keyPressList = keyPressListCollection.getKeyPressList();
double bpm = keyPressListCollection.getMetronome().getBpm();
double millisPerTick = (60000.0 / (bpm * 16.0));
double ticksPerMilli = 1 / millisPerTick;
if (keyPressListCollection.isPlaying()) {
sequencer.stop();
sequencer.close();
}
sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence sequence = new Sequence(Sequence.PPQ, 16);
Track track = sequence.createTrack();
for (int i = 0; i < keyPressList.size(); i++) {
KeyPress keyPress = keyPressList.get(i);
ShortMessage noteOnMsg = new ShortMessage();
noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0, keyPress.getKeyNumber(), keyPress.getVelocity());
ShortMessage noteOffMsg = new ShortMessage();
noteOffMsg.setMessage(ShortMessage.NOTE_OFF, 0, keyPress.getKeyNumber(), 0);
track.add(new MidiEvent(noteOnMsg, (long) (keyPress.getStartTime() * ticksPerMilli)));
track.add(new MidiEvent(noteOffMsg, (long) (keyPress.getEndTime() * ticksPerMilli)));
}
keyPressListCollection.setPlaying(true);
sequencer.setSequence(sequence);
sequencer.setTempoInBPM((float) bpm);
sequencer.start();
Это прекрасно работает и воспроизводит ноты на моемArrayList.Однако я хочу, чтобы я мог визуально показать пользователю, какая нота воспроизводится или в каком положении находится воспроизведение.
Вопрос в том, как сделать вызов метода для каждого MidiEvent, который обрабатывает секвенсор.