Head First Design Patterns - комбинированный шаблон - PullRequest
3 голосов
/ 01 июля 2011

Я читаю главу 12, посвященную комбинированному шаблону в шаблонах Head First Design.На странице 541, пример DJView, он не может работать правильно на моем компьютере. Когда я нажимаю кнопку «Пуск», программа звучит только один раз, а не по кругу.Я не уверен, из-за окружающей среды моей системы.но если я добавлю один строчный код в метод meta класса BeatModel , это сработает. like:

  public void meta(MetaMessage message) {
        if (message.getType() == 47) {
            beatEvent();
            sequencer.setMicrosecondPosition(0);  //add this line
            sequencer.start();
            setBPM(getBPM());
        }
    }

Может кто-нибудь сказать мне, почему?я так запутался, что-то не так с кодом, приведенным в книге, или по какой-то другой причине?Помоги мне .Заранее спасибо!! Извините, код длинный, поэтому я не могу все здесь разместить , вы можете скачать с официального сайта, вот ссылка http://www.headfirstlabs.com/books/hfdp/HeadFirstDesignPatterns_code102507.zip
, вы можете найти образец в этой папке '\ HeadFirstDesignPatterns_code102507\ HF_DP \ src \ headfirst \ комбинированный \ djview '.
запустить класс DJTestDrive.java
С нетерпением ждем вашей помощи.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

РЕДАКТИРОВАТЬ # 2 : Ради полноты, автор книги «Первые шаблоны проектирования» Элизабет Фриман сама заметила тот факт, что код в ее книге был протестирован только с Java 1.4. Она пообещала принять во внимание наши отзывы.


РЕДАКТИРОВАТЬ: Кажется, есть ошибка с Sequencer.setTempoInBPM во время игры. Ваш подход с установкой позиции микросекунды в 0 является правильным подходом - он в основном перематывает секвенсор, как только он заканчивается (то есть тип сообщения = 47).


К сожалению, пример кода кажется неверным. Есть несколько проблем:

  1. sequencer не инициализируется для воспроизведения в цикле
  2. Метод meta() сбрасывает BPM и обновляет все прослушиватели, но не сбрасывает секвенсор в исходное положение, которое вы сделали, чтобы заставить его работать. Однако этому методу не нужно ничего делать, если секвенсор настроен на воспроизведение в цикле.
  3. Метод 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();
}
1 голос
/ 29 апреля 2014

В Java 8 просто добавьте

sequencer.setMicrosecondPosition (0);

в BeatModel.meta () заставляет его работать нормально!

Приветствую всех, hebgeenbrug

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...