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:

  1. the sequencer not initialized play in loop
  2. the meta() method resets bpm , renotifies listeners, not reset sequencer original position, did work. however, method not need long sequencer set play in loop.
  3. the off() method sets bpm 0, 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

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -