Задержка секвенсера Java MIDI - PullRequest
1 голос
/ 30 марта 2012

Я работал над редактированием некоторого кода в книге Head First Java, чтобы позволить MIDI-секвенсору динамически обновлять заметки.

Это работает, имея сетку 16 x 16 JCheckboxes, которая содержит actionListeners, ищущие пользовательский ввод. Каждый раз, когда обнаруживается изменение, секвенсор останавливает воспроизведение, удаляет текущую дорожку, восстанавливает дорожку (обнаруживая, какие флажки отмечены), а затем возобновляет воспроизведение с текущей позиции воспроизведения.

Это работает, но вызывает небольшую задержку с каждым изменением. У кого-нибудь есть идеи, как к этому можно подойти?

public void buildTrackAndStart() {
    int[] trackList = null;

    sequence.deleteTrack(track);
    track = sequence.createTrack();

    for (int i = 0; i < 16; i++) {
        trackList = new int[16];

        int key = instruments[i];

        for (int j = 0; j < 16; j++ ) {
            JCheckBox jc = (JCheckBox) checkboxList.get(j + (16*i));
            if ( jc.isSelected()) {
                trackList[j] = key;
            } else {
                trackList[j] = 0;
            }
        } // close inner loop

        makeTracks(trackList);
        track.add(makeEvent(176,1,127,0,16));
    } // close outer

    track.add(makeEvent(192,9,1,0,15));
    try {
        sequencer.setSequence(sequence);
        sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
        sequencer.start();
        sequencer.setTempoInBPM(120);
    } catch(Exception e) {e.printStackTrace();}
} // close buildTrackAndStart method

1 Ответ

0 голосов
/ 02 января 2019

Вам нужно добавлять события на лету во время воспроизведения секвенсора Java.Это трудно сделать с помощью секвенсора Java по умолчанию, поскольку его поведение в этом случае не определено, см. FAQ по JavaSound 1

...