Создание заметок на лету с помощью Java Sound API.Как обрабатывать несколько заметок? - PullRequest
0 голосов
/ 17 февраля 2019

Я использую 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();
    }
...