Я использую Java Sound API и знаю, как использовать Sequencer для редактирования и исполнения треков.Мой вопрос сейчас заключается в том, как правильно воспроизводить несколько нот (не обязательно одновременно) на лету?
Я использовал одну дорожку, добавил MidiEvent NoteON и NoteOFF, а затем запустил секвенсор для воспроизведения ноты.Во втором запуске я удаляю предыдущие события из дорожки и устанавливаю синтезатор в положение 0, чтобы начать заново.Это работает нормально.
Проблема в том, что предыдущие заметки будут естественным образом обрезаны, даже если их события выключения заметок не будут выполнены полностью, поэтому заметка не длится так долго, как я хотел.
Правильный ли подход к этому через отправку событий заметки на разные дорожки или есть лучшие способы?Проблема, с которой я столкнулся, заключается в том, что запуск секвенсора с позиции 0 приведет к повторному воспроизведению некоторых предыдущих нот.
public void playSingleNote(int note, int velocity) throws InvalidMidiDataException, MidiUnavailableException {
long tick = 0;
sequencer.setTickPosition(0);// Start at beginning.
// Clean track
for (int i = 0; i < track.size(); i++) {
track.remove(track.get(i));
}
ShortMessage msg = new ShortMessage(ShortMessage.NOTE_ON, 0, note, velocity);
MidiEvent evt = new MidiEvent(msg, tick);
track.add(evt);
msg = new ShortMessage(ShortMessage.NOTE_OFF, 0, note, velocity);
evt = new MidiEvent(msg, tick + 28);
track.add(evt);
sequencer.start();
}