java吧 关注:1,274,974贴子:12,789,335
  • 6回复贴,共1

java新手求助。。

只看楼主收藏回复

我按照Head First java书上的写了个BeatBox,但是音量特别小,如果直接复制书上代码 音量就很大。。但我实在看不出这两个代码有什么区别。。代码在楼下贴出 求指导。。自己的代码没写备注。。不好意思


IP属地:江苏1楼2014-03-22 13:26回复
    这是我自己的:
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;
    import javax.sound.midi.*;
    import javax.swing.*;
    public class BeatBox {
    JFrame frame;
    Sequencer player;
    Sequence seq;
    Track track;
    JPanel background;
    ArrayList<JCheckBox> checkList;
    ArrayList<JCheckBox> check = new ArrayList<JCheckBox>();
    // the name of instruments
    String instrument[] = {"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"};
    //the key number of instruments
    int key[] = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
    public static void main(String[] args){
    BeatBox game = new BeatBox();
    game.go();
    }
    void go(){
    Box nameBox = new Box(BoxLayout.Y_AXIS);
    for(int i = 0;i < 16;i++){
    nameBox.add(new Label(instrument[i]));
    }
    JButton start = new JButton("start");
    start.addActionListener(new StartListener());
    JButton stop = new JButton("stop");
    stop.addActionListener(new StopListener());
    JButton up = new JButton("up");
    up.addActionListener(new UpListener());
    JButton down = new JButton("down");
    down.addActionListener(new DownListener());
    Box buttonBox = new Box(BoxLayout.Y_AXIS);
    buttonBox.add(start);
    buttonBox.add(stop);
    buttonBox.add(up);
    buttonBox.add(down);
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout grid = new GridLayout(16,16);
    grid.setHgap(2);
    grid.setVgap(1);
    JPanel myPanel = new JPanel();
    myPanel.setLayout(grid);
    checkList = new ArrayList<JCheckBox>();
    for(int i = 0 ; i < 256; i ++){
    checkList.add(new JCheckBox());
    myPanel.add(checkList.get(i));
    checkList.get(i).setSelected(false);
    }
    background = new JPanel();
    background.setLayout(new BorderLayout());
    background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    background.add(BorderLayout.WEST,nameBox);
    background.add(BorderLayout.EAST,buttonBox);
    frame.getContentPane().add(background);
    background.add(myPanel);
    frame.setBounds(450,200, 567, 315);
    frame.setVisible(true);
    makeMidi();
    }
    void checkAndPlay(){
    seq.deleteTrack(track);
    track = seq.createTrack();
    int[] keynumber = new int[16];
    for(int i = 0; i < 16; i++){
    for(int j = 0 ; j < 16; j++){
    if(((JCheckBox)checkList.get(i*16+j)).isSelected()){
    keynumber[j]=key[i];
    }
    else{
    keynumber[j]=0;
    }
    }
    makeTraceAndAdd(keynumber);
    }
    }
    void makeTraceAndAdd(int[] key){
    for(int i = 0 ; i < 16 ;i++){
    if(key[i]!=0){
    MidiEvent e1 = makeEvent(144,1,key[i],100,i);
    MidiEvent e2 = makeEvent(128,1,key[i],100,i);
    track.add(e1);
    track.add(e2);
    track.add(makeEvent(192,9,1,0,15));
    }
    }
    try {
    player.setSequence(seq);
    player.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
    player.start();
    } catch (InvalidMidiDataException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public MidiEvent makeEvent(int ev ,int intr , int whi , int vol ,int when){
    MidiEvent event = null;
    try{
    ShortMessage s = new ShortMessage();
    s.setMessage(ev, intr, whi, when);
    event = new MidiEvent(s,when);
    }catch(Exception e){
    System.out.println("makeEvent failed");
    }
    return event;
    }
    void makeMidi(){
    try {
    player = MidiSystem.getSequencer();
    player.open();
    player.setTempoInBPM(120);
    seq = new Sequence(Sequence.PPQ,4);
    track = seq.createTrack();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    System.out.println("makeMidi failed");
    }
    }
    void startPlay(){
    checkAndPlay();
    }
    class StartListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
    startPlay();
    // TODO Auto-generated method stub
    }
    }
    class StopListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
    player.stop();
    // TODO Auto-generated method stub
    }
    }
    class UpListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
    player.setTempoFactor((float) (player.getTempoFactor()*1.03));
    // TODO Auto-generated method stub
    }
    }
    class DownListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    player.setTempoFactor((float) (player.getTempoFactor()*0.97));
    }
    }
    }


    IP属地:江苏2楼2014-03-22 13:27
    回复
      2025-08-22 00:47:10
      广告
      不感兴趣
      开通SVIP免广告
      这是书上的 :
      /**
      * 2013.04.08
      * Michel
      */
      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; //把checkbox储存在ArrayList中
      Sequencer sequencer;
      Sequence sequence;
      Track track;
      JFrame theFrame;
      //乐器的名称,以String的array维护
      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"};
      //实际的乐器关键字,例如35是bass,42是Closed Hi-Hat
      int[] instruments = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
      public static void main(String[] args) {
      BeatBox gui = new BeatBox();
      gui.buildGUI();
      }
      public void buildGUI(){
      JFrame 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));
      //ArrayList<JCheckBox> checkboxList = new ArrayList<JCheckBox>(); //这种写法会报空指针错误。
      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);
      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);
      //创建checkbox组,设定成未勾选。并加入到ArrayList和面板上
      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);
      }
      //一般的MIDI设置程序代码
      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();
      }
      }
      //创建出16个元素的数组来存储一项乐器的值。
      //如果该节应该要演奏,其值会是关键值,否则值为0
      public void buildTrackAndStart(){
      int[] trackList = null;
      //清除掉旧的track做一个新的
      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;
      }
      }
      //创建此乐器的事件并加到track上
      makeTracks(trackList);
      track.add(makeEvent(176,1,127,0,16));
      }
      //确保第16拍有时间,否则beatbox不会重复播放
      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{
      @Override
      public void actionPerformed(ActionEvent a) {
      // TODO Auto-generated method stub
      buildTrackAndStart();
      }
      }
      //内部类 监听按钮
      public class MyStopListener implements ActionListener{
      @Override
      public void actionPerformed(ActionEvent a) {
      // TODO Auto-generated method stub
      sequencer.stop();
      }
      }
      //内部类 监听按钮
      //节奏因子,预设为1.0,每次调整0.03
      public class MyUpTempoListener implements ActionListener{
      @Override
      public void actionPerformed(ActionEvent a) {
      // TODO Auto-generated method stub
      float tempoFactor = sequencer.getTempoFactor();
      sequencer.setTempoFactor((float) (tempoFactor * 1.03));
      }
      }
      //内部类 监听按钮
      public class MyDownTempoListener implements ActionListener{
      @Override
      public void actionPerformed(ActionEvent a) {
      // TODO Auto-generated method stub
      float tempoFactor = sequencer.getTempoFactor();
      sequencer.setTempoFactor((float) (tempoFactor * 0.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;
      }
      }
      先谢谢大家啦


      IP属地:江苏3楼2014-03-22 13:28
      回复
        这是书上的:
        /**
        * 2013.04.08
        * Michel
        */
        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; //把checkbox储存在ArrayList中
        Sequencer sequencer;
        Sequence sequence;
        Track track;
        JFrame theFrame;
        //乐器的名称,以String的array维护
        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"};
        //实际的乐器关键字,例如35是bass,42是Closed Hi-Hat
        int[] instruments = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
        public static void main(String[] args) {
        BeatBox gui = new BeatBox();
        gui.buildGUI();
        }
        public void buildGUI(){
        JFrame 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));
        //ArrayList<JCheckBox> checkboxList = new ArrayList<JCheckBox>(); //这种写法会报空指针错误。
        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);
        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);
        //创建checkbox组,设定成未勾选。并加入到ArrayList和面板上
        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);
        }
        //一般的MIDI设置程序代码
        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();
        }
        }
        //创建出16个元素的数组来存储一项乐器的值。
        //如果该节应该要演奏,其值会是关键值,否则值为0
        public void buildTrackAndStart(){
        int[] trackList = null;
        //清除掉旧的track做一个新的
        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;
        }
        }
        //创建此乐器的事件并加到track上
        makeTracks(trackList);
        track.add(makeEvent(176,1,127,0,16));
        }
        //确保第16拍有时间,否则beatbox不会重复播放
        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{
        @Override
        public void actionPerformed(ActionEvent a) {
        // TODO Auto-generated method stub
        buildTrackAndStart();
        }
        }
        //内部类 监听按钮
        public class MyStopListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent a) {
        // TODO Auto-generated method stub
        sequencer.stop();
        }
        }
        //内部类 监听按钮
        //节奏因子,预设为1.0,每次调整0.03
        public class MyUpTempoListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent a) {
        // TODO Auto-generated method stub
        float tempoFactor = sequencer.getTempoFactor();
        sequencer.setTempoFactor((float) (tempoFactor * 1.03));
        }
        }
        //内部类 监听按钮
        public class MyDownTempoListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent a) {
        // TODO Auto-generated method stub
        float tempoFactor = sequencer.getTempoFactor();
        sequencer.setTempoFactor((float) (tempoFactor * 0.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;
        }
        }
        谢谢大家啦


        IP属地:江苏4楼2014-03-22 13:30
        收起回复
          有问题请加群273213416


          IP属地:北京5楼2015-12-02 16:46
          回复