head first java 创建beatbox

public class BeatBox {
    JFrame frame;
    JPanel panel;
    ArrayList<JCheckBox> checkBoxList;
    Sequencer sequencer;
    Sequence sequence;
    Track track;

    int[] instruments = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};
    String[] instrumentName = {"Bass Drum", "Cloud Hi-Hat", "Open Hi-Hat", "Acoustic Snare", "Crash Cymbal", "Hand Clap", "High Tom",
        "Hi Bingo", "Marcacas", "Whistle", "Low Conga", "Cowbel", "Vibraslap", "Low-mid Tom", "Hi Agogo", "Open Hi Conga"};

    public static void main(String[] args) {
        new BeatBox().gui();
    }

    public void gui(){
        frame = new JFrame("Beat-Box");
        frame.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("Tempo down");
        downTempo.addActionListener(new MyDownTempoListener());
        buttonBox.add(downTempo);

        background.add(BorderLayout.EAST, buttonBox);

        Box nameBox = new Box(BoxLayout.Y_AXIS);
        for(int i = 0; i != 16; ++i){
            nameBox.add(new Label(instrumentName[i]));
        }
        background.add(BorderLayout.WEST, nameBox);

        frame.getContentPane().add(background);

        GridLayout grid = new GridLayout(16, 16);
        grid.setHgap(1);
        grid.setVgap(2);
        panel = new JPanel(grid);
        background.add(BorderLayout.CENTER, panel);
        for(int i = 0; i != 256; ++i){
            JCheckBox c = new JCheckBox();
            c.setSelected(false);
            checkBoxList.add(c);
            panel.add(c);
        }

        setUpmidi();

        frame.setBounds(50, 50, 300, 300);
        frame.pack();
        frame.setVisible(true);
    }

    public void buildTrackAndStart(){
        sequence.deleteTrack(track);
        track = sequence.createTrack();

        int[] trackList = new int[16];
        for(int i = 0; i != 16; ++i){
            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 MidiEvent makeEvent(int comd, int chan, int one, int two, int tick){
        MidiEvent event = null;
        try{
            ShortMessage message = new ShortMessage();
            message.setMessage(comd, chan, one, two);
            event = new MidiEvent(message, tick);
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return event;
    }

    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 class MyStopListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            sequencer.stop();
        }
    }

    public class MyUpTempoListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            float tempoFactor = sequencer.getTempoFactor();
            sequencer.setTempoFactor((float) (tempoFactor * 1.03));
        }
    }

    public class MyDownTempoListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
            float tempoFactor = sequencer.getTempoFactor();
            sequencer.setTempoFactor((float) (tempoFactor * 0.97));
        }
    }

    public void setUpmidi(){
        try{
            sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequence = new Sequence(Sequence.PPQ, 4);
            track = sequence.createTrack();
            sequencer.setTempoInBPM(120);

        } catch (Exception ex){ ex.printStackTrace(); }
    }

    public class MyStartListener implements ActionListener {
        public void actionPerformed(ActionEvent event){
            buildTrackAndStart();
        }
    }
}

head first java 创建beatbox_第1张图片

你可能感兴趣的:(head first java 创建beatbox)