РЕДАКТИРОВАТЬ # 2 : Ради полноты, автор книги «Первые шаблоны проектирования» Элизабет Фриман сама заметила тот факт, что код в ее книге был протестирован только с Java 1.4. Она пообещала принять во внимание наши отзывы.
РЕДАКТИРОВАТЬ: Кажется, есть ошибка с Sequencer.setTempoInBPM
во время игры. Ваш подход с установкой позиции микросекунды в 0
является правильным подходом - он в основном перематывает секвенсор, как только он заканчивается (то есть тип сообщения = 47).
К сожалению, пример кода кажется неверным. Есть несколько проблем:
-
sequencer
не инициализируется для воспроизведения в цикле
- Метод
meta()
сбрасывает BPM и обновляет все прослушиватели, но не сбрасывает секвенсор в исходное положение, которое вы сделали, чтобы заставить его работать. Однако этому методу не нужно ничего делать, если секвенсор настроен на воспроизведение в цикле.
- Метод
off()
устанавливает BPM на 0
, что приведет к быстрой перемотке секвенсора до конца всех циклов - это означает, что при следующем запуске проигрывателя он начнется с конца и ничего не будет воспроизводиться.
Эти изменения должны помочь:
# 1 В методе BeatModel.buildTrackAndStart
добавить sequencer.setLoopCount
следующим образом:
public void buildTrackAndStart() {
// ...
try {
sequencer.setSequence(sequence);
sequencer.setLoopCount(Integer.MAX_VALUE); // play forever
} catch(Exception e) {
// ...
}
# 2 Удалить все операторы из метода BeatModel.meta(MetaMessage)
:
public void meta(MetaMessage message) {
}
# 3 Удалить setBPM(0)
из метода BeatModel.off()
:
public void off() {
// -- remove this -- setBPM(0);
sequencer.stop();
}