java - Head First Design Patterns - Combined Pattern -
i'm reading chapter 12 on combined pattern in head first design patterns. on page 541,the sample djview,it cant't run correctly in computer.when press 'start', program sounds once rather circularly . i'm not sure whether because of environment of system. if add 1 line code in method meta of class beatmodel,it works.like:
public void meta(metamessage message) { if (message.gettype() == 47) { beatevent(); sequencer.setmicrosecondposition(0); //add line sequencer.start(); setbpm(getbpm()); } }
can tell me why? i'm confused,is wrong code given book or other reason? me . in advance!!
so sorry,the code long not put here,you download offical website,here link http://www.headfirstlabs.com/books/hfdp/headfirstdesignpatterns_code102507.zip
can find sample in folder '\headfirstdesignpatterns_code102507\hf_dp\src\headfirst\combined\djview'.
run class djtestdrive.java
forward help.
edit #2: completeness' sake, author of head first design patterns elisabeth freeman herself has made note of fact code in book has been tested java 1.4. has promised take our feedback account.
edit: there seems bug sequencer.settempoinbpm
during play. approach setting microsecond position 0
right approach -- rewinds sequencer ends (i.e. message type = 47).
unfortunately, sample code seems incorrect. there several problems:
- the
sequencer
not initialized play in loop - the
meta()
method resets bpm , renotifies listeners, not reset sequencer original position, did work. however, method not need long sequencer set play in loop. - the
off()
method sets bpm0
, fast forwards sequencer end of loops -- means next time start player, start end , play nothing.
these change should trick:
#1 in method beatmodel.buildtrackandstart
, add sequencer.setloopcount
follows:
public void buildtrackandstart() { // ... try { sequencer.setsequence(sequence); sequencer.setloopcount(integer.max_value); // play forever } catch(exception e) { // ... }
#2 remove statements method beatmodel.meta(metamessage)
:
public void meta(metamessage message) { }
#3 remove setbpm(0)
method beatmodel.off()
:
public void off() { // -- remove -- setbpm(0); sequencer.stop(); }
Comments
Post a Comment