• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Tim Cooke
  • Campbell Ritchie
  • paul wheaton
  • Ron McLeod
  • Devaka Cooray
Sheriffs:
  • Jeanne Boyarsky
  • Liutauras Vilda
  • Paul Clapham
Saloon Keepers:
  • Tim Holloway
  • Carey Brown
  • Piet Souris
Bartenders:

Head First Java - BeatBox Code

 
Greenhorn
Posts: 8
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello,

I am currently having some difficulty with the following code. The code is from Bert and Kathy's Head First Book. The Beatbox compiles fine, however, when I run the program the beatbox only plays one loop instead of a continuous loop as suggested in the book. Any help would be greatly appreciated.

Regards,

Tom



//JAM -- added code tags.
[ May 09, 2005: Message edited by: Joel McNary ]
 
Ranch Hand
Posts: 30
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hey,

Did you ever get this figured out? I'm having the identical problem...

Thanks!

Mike
 
Tom Shanks
Greenhorn
Posts: 8
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Mike,

I've never figured it out. Could be that the code does not loop. It would be nice to find a way to loop the code. Kathy or Bert please help!

Regards,

Tom
 
Ranch Hand
Posts: 32
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Have you checked the erata

HFJ Erata

There is something in there about a thread in the beat box, not sure if its what your lookin for.
 
author
Posts: 9050
21
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Guys,

I'm guessing that you've got the old version of HF Java, and you're using Tiger... For some strange reason, javax.sound.midi changed a bit with Tiger, and the old code doesn't loop anymore

The easiest thing to do is to go to wickedlysmart.com and get the new code kitchen source code. If you want to try to wade thru the API, and crack this on your own, you'll have to make changes in the buildTrackAndStart method ( add a call to sequencer.LOOP_CONTNUOUSLY), after the setSequencer call. You'll also want to use a tempo factor rather than BPM thru-out the code... arghh!

I'd recommend getting the code

HTH,

Bert
 
Tom Shanks
Greenhorn
Posts: 8
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Bert and Bob,

Thanks for your replies, this Java Greenhorn will follow your advice once I get a bit of time from my hectic work schedule. Keep up the good work guys!

Regards,

Tom Shanks :
 
Greenhorn
Posts: 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I have downloaded the code from wickedlysmart and chapter 13 still does not run right. I compiles fine but I get the HourGlass and no events are generated when mouse click is performed. I'm using java (build 1.5.0_03-b07) on win xp.
 
Greenhorn
Posts: 26
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Strange, I entered the code as presented in HFJ and had no problems getting it to run.

Maybe I did something unconsciously that corrected the problem...?

*goes to review code*

Okay, on review, I see I have the 2nd edition, and the line

does exist. This tells me I'm in a potential pitfall when it comes to reviewing someone else's code: don't presume everyone is working from the same version, be it of a text or of a JDK.

Just my two cents' worth...save up the change for a milk shake or something.
[ June 13, 2005: Message edited by: Alan Jump ]
 
Ranch Foreman
Posts: 1015
11
  • Likes 1
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I hope it is OK to open a post from 19 years ago.   The code on the o'reily site works for me.  I'll post it here so there is a record of a working version.  Maybe someone can test it to make sure it works on at least one more machine.    

This may be of value to me or someone else encountering this problem in the future.

Thanks,

Kevin

 
Marshal
Posts: 80622
469
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

kevin Abel wrote:I hope it is OK to open a post from 19 years ago. . . .

Of course it is. Challenge: copy both versions of the code onto a *nix box and use the diff utility to work out the difference.

Campbell's Computer wrote:pluma BeatBox.java BeatBoxx.java&
. . . .
diff BeatBox.java BeatBoxx.java
1,4d0
< package ch15;
<  
< import javax.sound.midi.*;
< import javax.swing.*;
6,159c2,191
< import java.util.ArrayList;
<  
< import static javax.sound.midi.ShortMessage.*;
<  
< public class BeatBox {
<   private ArrayList<JCheckBox> checkboxList;
<   private Sequencer sequencer;
<   private Sequence sequence;
<   private Track track;
<  
<   String[] instrumentNames = {"Bass Drum", "Closed Hi-Hat",
<           "Open Hi-Hat", "Acoustic Snare", "Crash Cymbal", "Hand Clap",
<           "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Conga",
<           "Cowbell", "Vibraslap", "Low-mid Tom", "High Agogo",
<           "Open Hi Conga"};
<   int[] instruments = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};
<  
<   public static void main(String[] args) {
<     new BeatBox().buildGUI();
<   }
<  
<   public void buildGUI() {
<     JFrame frame = new JFrame("Cyber BeatBox");
<     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
<     BorderLayout layout = new BorderLayout();
<     JPanel background = new JPanel(layout);
<     background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
<  
<     Box buttonBox = new Box(BoxLayout.Y_AXIS);
<  
<     JButton start = new JButton("Start");
<     start.addActionListener(e -> buildTrackAndStart());
<     buttonBox.add(start);
<  
<     JButton stop = new JButton("Stop");
<     stop.addActionListener(e -> sequencer.stop());
<     buttonBox.add(stop);
<  
<     JButton upTempo = new JButton("Tempo Up");
<     upTempo.addActionListener(e -> changeTempo(1.03f));
<     buttonBox.add(upTempo);
<  
<     JButton downTempo = new JButton("Tempo Down");
<     downTempo.addActionListener(e -> changeTempo(0.97f));
<     buttonBox.add(downTempo);
<  
<     Box nameBox = new Box(BoxLayout.Y_AXIS);
<     for (String instrumentName : instrumentNames) {
<       JLabel instrumentLabel = new JLabel(instrumentName);
<       instrumentLabel.setBorder(BorderFactory.createEmptyBorder(4, 1, 4, 1));
<       nameBox.add(instrumentLabel);
<     }
<  
<     background.add(BorderLayout.EAST, buttonBox);
<     background.add(BorderLayout.WEST, nameBox);
<  
<     frame.getContentPane().add(background);
<  
<     GridLayout grid = new GridLayout(16, 16);
<     grid.setVgap(1);
<     grid.setHgap(2);
<  
<     JPanel mainPanel = new JPanel(grid);
<     background.add(BorderLayout.CENTER, mainPanel);
<  
<     checkboxList = new ArrayList<>();
<     for (int i = 0; i < 256; i++) {
<       JCheckBox c = new JCheckBox();
<       c.setSelected(false);
<       checkboxList.add(c);
<       mainPanel.add(c);
<     }
<  
<     setUpMidi();
<  
<     frame.setBounds(50, 50, 300, 300);
<     frame.pack();
<     frame.setVisible(true);
<   }
<  
<   private void setUpMidi() {
<     try {
<       sequencer = MidiSystem.getSequencer();
<       sequencer.open();
<       sequence = new Sequence(Sequence.PPQ, 4);
<       track = sequence.createTrack();
<       sequencer.setTempoInBPM(120);
<  
<     } catch (Exception e) {
<       e.printStackTrace();
<     }
<   }
<  
<   private void buildTrackAndStart() {
<     int[] trackList;
<  
<     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 = checkboxList.get(j + 16 * i);
<         if (jc.isSelected()) {
<           trackList[j] = key;
<         } else {
<           trackList[j] = 0;
<         }
<       }
<       makeTracks(trackList);
<       track.add(makeEvent(CONTROL_CHANGE, 1, 127, 0, 16));
<     }
<  
<     track.add(makeEvent(PROGRAM_CHANGE, 9, 1, 0, 15));
<     try {
<       sequencer.setSequence(sequence);
<       sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
<       sequencer.setTempoInBPM(120);
<       sequencer.start();
<     } catch (Exception e) {
<       e.printStackTrace();
<     }
<   }
<  
<   private void changeTempo(float tempoMultiplier) {
<     float tempoFactor = sequencer.getTempoFactor();
<     sequencer.setTempoFactor(tempoFactor * tempoMultiplier);
<   }
<  
<   private void makeTracks(int[] list) {
<     for (int i = 0; i < 16; i++) {
<       int key = list[i];
<  
<       if (key != 0) {
<         track.add(makeEvent(NOTE_ON, 9, key, 100, i));
<         track.add(makeEvent(NOTE_OFF, 9, key, 100, i + 1));
<       }
<     }
<   }
<  
<   public static MidiEvent makeEvent(int cmd, int chnl, int one, int two, int tick) {
<     MidiEvent event = null;
<     try {
<       ShortMessage msg = new ShortMessage();
<       msg.setMessage(cmd, chnl, one, two);
<       event = new MidiEvent(msg, tick);
<     } catch (Exception e) {
<       e.printStackTrace();
<     }
<     return event;
<   }
<  
< }
---
> import javax.swing.*;
> import javax.sound.midi.*;
> import java.util.*;
> import java.awt.event.*;
>  
> public class BeatBox implements MetaEventListener {
>    
>     JPanel mainPanel;
>     ArrayList checkboxList;
>     int bpm=120;
>     Sequencer sequencer;
>     Sequence sequence;
>     Track track;
>     JFrame theFrame;
>      
>     String[] instrumentNames= {"Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustic Snare", "Crash Cymbal",
>             "Hand Clap", "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Congo", "Cowbell", "Vibraslap",
>             "Lowmid Tom", "High Agogo", "Open Hi Conga"};
>      
>     int[] instruments={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
>      
>    public static void main (String [] args) {
>        new BeatBox().buildGUI();
>    }
>          
>         public void buildGUI() {
>              
>             theFrame=new JFrame("Cyber Beatbox");
>             BorderLayout layout=new BorderLayout();
>             JPanel background= new JPanel(layout);
>             background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
>              
>             checkboxList = new ArrayList();
>             Box buttonBox=new Box(BoxLayout.Y_AXIS);
>              
>             JButton start=new JButton("Start");
>             start.addActionListener(new MyStartListener());
>             buttonBox.add(start);
>              
>             JButton stop=new JButton("Stop");
>             stop.addActionListener(new MyStopListener());
>              buttonBox.add(stop);
>              
>              JButton upTempo=new JButton("Tempo Up");
>             upTempo.addActionListener(new MyUpTempoListener());
>             buttonBox.add(upTempo);
>              
>             JButton downTempo=new JButton("Tempo Down");
>             downTempo.addActionListener(new MyDownTempoListener());
>              buttonBox.add(downTempo);
>              
>              Box nameBox= new Box (BoxLayout.Y_AXIS);
>              for (int i=0; i<16; i++)  {
>                  nameBox.add(new Label(instrumentNames[i]));
>              
>         } //close for loop
>          
>          background.add(BorderLayout.EAST, buttonBox);
>          background.add(BorderLayout.WEST, nameBox);
>          
>          theFrame.getContentPane().add(background);
>          
>          GridLayout grid = new GridLayout (16,16);
>          grid.setVgap(1);
>          grid.setHgap(2);
>          mainPanel=new JPanel(grid);
>          background.add(BorderLayout.CENTER,mainPanel);
>          
>           for (int i=0; i<256; i++)  {
>              JCheckBox c= new JCheckBox();
>              c.setSelected(false);
>              checkboxList.add(c);
>              mainPanel.add(c);
>              
>           } //end loop
>              
>          setUpMidi();
>          
>          theFrame.setBounds(50,50,300,300);
>          theFrame.pack();
>          theFrame.setVisible(true);
>     } // closes method
>        
>     public void setUpMidi() {
>         try {
>             sequencer=MidiSystem.getSequencer();
>             sequencer.open();
>             sequencer.addMetaEventListener(this);
>             sequence=new Sequence(Sequence.PPQ,4);
>             track= sequence.createTrack();
>             sequencer.setTempoInBPM(bpm);
>              
>         } catch(Exception e) {e.printStackTrace();}
>     } // closes method
>      
>     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;
>                     }
>               } //closes inner for loop
>              
>             makeTracks(trackList);
>              
>         } // closes outer for loop
>          
>         track.add(makeEvent(192,9,1,0,15));
>          
>         try {
>              
>             sequencer.setSequence(sequence);
>             sequencer.start();
>             sequencer.setTempoInBPM(bpm);
>         }  catch (Exception e) {e.printStackTrace();}
>          
>     } // closes buildTrackAndStart method
>      
>     public class MyStartListener implements ActionListener {
>         public void actionPerformed(ActionEvent a) {
>    
>             buildTrackAndStart();
>         }
>     } // closes inner class
>      
>      public class MyStopListener implements ActionListener {
>         public void actionPerformed(ActionEvent b) {
>             sequencer.stop();
>         }
>     } // closes inner class
>      
>       public class MyUpTempoListener implements ActionListener {
>         public void actionPerformed(ActionEvent c) {
>             bpm+=3;
>         }
>     } // closes inner class
>        
>         public class MyDownTempoListener implements ActionListener {
>         public void actionPerformed(ActionEvent d) {
>             bpm-=3;
>         }
>     } // closes inner class
>          
>         public void makeTracks(int[] list) {
>              
>             for (int i=0; i<16; i++) {
>                 int key=list[i];
>                  
>                 if (key !=0) {
>                     track.add(makeEvent(144,9,key,100,i));
>                     track.add(makeEvent(128,9,key,100,i+1));
>                 }
>             }
>         }
>          
>         public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick ) {
>             MidiEvent event = null;
>              
>             try {
>                 ShortMessage a = new ShortMessage();
>                 a.setMessage(comd, chan, one, two);
>                 event = new MidiEvent(a, tick);
>                  
>             } catch (Exception e) {e.printStackTrace();}
>             return event;
>         }
>          
>         public void meta(MetaMessage message) {
>             if (message.getType()==47) {
>                 sequencer.start();
>                 sequencer.setTempoInBPM(bpm);
>             }
>         }
> } //closes class
[3]+  Done                    pluma BeatBox.java BeatBoxx.java

Maybe that will answer the problkem Bert mentioned. Remember Bert is one of the authors. And maybe not; it has shown the entire code as being different between the two files
 
Saloon Keeper
Posts: 11054
88
Eclipse IDE Firefox Browser MySQL Database VI Editor Java Windows ChatGPT
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
After running both through the Eclipse formatter and removing some comments...
 
Don't get me started about those stupid light bulbs.
reply
    Bookmark Topic Watch Topic
  • New Topic