Advertisement
If you have a new account but are having problems posting or verifying your account, please email us on hello@boards.ie for help. Thanks :)
Hello all! Please ensure that you are posting a new thread or question in the appropriate forum. The Feedback forum is overwhelmed with questions that are having to be moved elsewhere. If you need help to verify your account contact hello@boards.ie

Quickest way to do this

Options
  • 04-04-2012 12:01am
    #1
    Closed Accounts Posts: 2,087 ✭✭✭


    Hi folks,

    I'm doing a Java project in College and we are using NetBeans to code. One of the elements I'm putting in is a Midi Drumbeat type thing. It's from Head First Java if any of you know it (pages 420 - 423). The code is below for reference.

    Can anyone tell me if there's a quick way to dynamically change the pattern being played as the user clicks a checkbox i.e they don't have to keep hitting the play button? Would I have to write 256 actionListeners, one for each checkBox? I'm confusing the hell out of myself at this stage.

    Any help would be much appreciated.
    import java.awt.*;
    import javax.swing.*;
    import javax.sound.midi.*;
    import java.util.*;
    import java.awt.event.*;
    
    public class BeatBox {
        JPanel mainPanel;
        ArrayList <JCheckBox> checkboxList;
        Sequencer sequencer;
        Sequence sequence;
        Track track;
        JFrame theFrame;
        
        String [] instrumentNames = {"Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustic Snare", "Crash Symbol", "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(){
            theFrame = new JFrame ("Cyber BeatBox");
            theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            BorderLayout layout = new BorderLayout();
            JPanel background = new JPanel (layout);
            background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            
            checkboxList = new ArrayList <JCheckBox>();
            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("Temp 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]));
            }
            
            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);
            }
            
            setUpMidi();
            
            theFrame.setBounds(50, 50, 300, 300);
            theFrame.pack();
            theFrame.setVisible(true);       
        }
        
        public 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();
            }
        }
        
        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;
                    }
                }
                
                makeTracks(trackList);
                track.add(makeEvent(176, 1, 127, 0, 16));
            }
            
            track.add(makeEvent(192, 9, 1, 0, 15));
            try{
                sequencer.setSequence(sequence);
                sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
                sequencer.start();
                sequencer.setTempoInBPM(120);
            } 
            catch (Exception e){
                e.printStackTrace();
            }
        }
        
        public class MyStartListener implements ActionListener{
            public void actionPerformed (ActionEvent a){
                buildTrackAndStart();
            }
        }
        
        public class MyStopListener implements ActionListener{
            public void actionPerformed (ActionEvent a){
                sequencer.stop();
            }
        }
        
        public class MyUpTempoListener implements ActionListener {
            public void actionPerformed (ActionEvent a){
                float tempoFactor = sequencer.getTempoFactor();
                sequencer.setTempoFactor((float)(tempoFactor * 1.03));
            }
        }
        
        public class MyDownTempoListener implements ActionListener{
            public void actionPerformed (ActionEvent a){
                float tempoFactor = sequencer.getTempoFactor();
                sequencer.setTempoFactor((float)(tempoFactor * .97));
            }
        }
     
        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;
        }
    }
    


Comments

  • Closed Accounts Posts: 2,087 ✭✭✭Clanket


    Anyone?


  • Registered Users Posts: 2,494 ✭✭✭kayos


    Would you really need to write that many actionListeners? Surely the exact same one can be used from your 256 checkboxes?

    *I dont do java...


  • Closed Accounts Posts: 238 ✭✭WolfgangWeisen


    That's a fairly roundabout way of doing it.

    Something like this will end up much easier:

    Create some objects and add action listeners to them as follows:
    JButton myButton = new JButton("Button1");
    myButton.addActionListener(this);

    JButton myOtherButton = new JButton("Button2");
    myOtherButton.addActionListener(this);

    Then have one method to deal with the actions performed and pull the name of the object the action was performed on into a string. Some people use Object objects as ActionEvent has more methods available on it. Read the API for details.

    Anyway , as such:
    public void actionPerformed(ActionEvent e) {
    String event = e.getActionCommand()

    //Then handle the events that are generated as such

    if(event == "Button1"){
    some code;
    }
    else if (event == "Button2"){
    more code;
    }
    else {
    etc;
    }

    }

    Any actions will need handlers but the above will handle it a lot more efficiently than the manner you're currently implementing it in. Make sure you have whatever sound files you are using looping so when other events are triggered, the original ones keep playing regardless.


  • Closed Accounts Posts: 2,087 ✭✭✭Clanket


    Thanks for your reply Wolfgang. I think I may be biting off more than I can chew by dynamically changing the pattern based on individual checkbox clicks. I'm only 7 months into coding and the project is due next Friday.

    I'm having a hard enough time integrating the non GUI built class into our project which is primarily built in Netbeans GUI. I'm getting there though.

    Have to say I'm loving Programming. It really gets you thinking about problem solving. And when you figure something out it's very rewarding. You really feel like you've achieved something.

    I've been cursing the Problem Based Learning they emply in college but at the end of the day I'm learning.

    Thanks again for taking the time. I'll definately look back at this thead over the summer.


  • Closed Accounts Posts: 238 ✭✭WolfgangWeisen


    Best of luck with the project regardless. If you've any other questions just post them, I know I for one will certainly have a look and see if I can help, especially since we're all off for four days now :)

    I grew to love programming through Java, having done C/C++ previously and not liking it. It's a fantastic language and I find it very enjoyable to use, so I'm glad to see you're enjoying it too. Luckily, it's an extremely well supported language also.


  • Advertisement
Advertisement