Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java鼓机Midi项目的bug_Java_Swing_Midi_Javasound - Fatal编程技术网

Java鼓机Midi项目的bug

Java鼓机Midi项目的bug,java,swing,midi,javasound,Java,Swing,Midi,Javasound,我从Head First Java(第420页)一书的第13章中复制了代码来学习和使用,但代码似乎没有宣传的那样有效 首先,节拍不是从GUI上的第一次输入开始的。如果我在节拍1上放了一个钹击来开始节拍,在节拍3上放了一个响弦,程序就会回放:响弦-响弦 第二,大多数声音都不在那里,而是播放hihat或snare声音。口哨声、牛铃声和马拉卡斯声都在回响 自本书发布以来,Java中是否有什么变化,或者书中编写的代码中是否存在bug。如何更改此代码以正确播放并使用正确的声音 谢谢 import java

我从Head First Java(第420页)一书的第13章中复制了代码来学习和使用,但代码似乎没有宣传的那样有效

首先,节拍不是从GUI上的第一次输入开始的。如果我在节拍1上放了一个钹击来开始节拍,在节拍3上放了一个响弦,程序就会回放:响弦-响弦

第二,大多数声音都不在那里,而是播放hihat或snare声音。口哨声、牛铃声和马拉卡斯声都在回响

自本书发布以来,Java中是否有什么变化,或者书中编写的代码中是否存在bug。如何更改此代码以正确播放并使用正确的声音

谢谢

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 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(){
            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("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);

            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);
            } // close method

            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(); }
            } // close 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;
                            }
                    } // close inner loop

                    makeTracks(trackList);
                    track.add(makeEvent(176,1,127,0,16));
            } // close outer

            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();
            }
            } // close buildTrackAndStart method

            public class MyStartListener implements ActionListener{

                    public void actionPerformed(ActionEvent a){
                            buildTrackAndStart();
                    }
            } // close inner class

            public class MyStopListener implements ActionListener{
                    public void actionPerformed(ActionEvent a){
                    sequencer.stop();}
            } // close inner class

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

            public class MyDownTempoListener implements ActionListener{
                    public void actionPerformed(ActionEvent a){
                    float tempoFactor=sequencer.getTempoFactor();
                    sequencer.setTempoFactor((float)(tempoFactor*.97));
                    }
            } // close 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;
                    }
    } // close class
import java.awt.*;
导入javax.swing.*;
导入javax.sound.midi.*;
导入java.util.*;
导入java.awt.event.*;
公共类BeatBox{
JPanel主面板;
ArrayList复选框列表;
测序器;
序列;
轨道;
JFrame框架;
字符串[]乐器名称={“低音鼓”、“闭式高帽”、“开式高帽”、“原声圈套”,
“撞钟钹”,“拍手”,“高汤姆”,“你好邦戈”,“马拉卡斯”,“口哨”,“低康加”,“牛仔”,
“Vibraslap”、“中低档Tom”、“High Agogo”、“Open Hi Conga”};
国际[]文书={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
公共静态void main(字符串[]args){new BeatBox().buildGUI();
}
public void buildGUI(){
theFrame=新JFrame(“赛博BeatBox”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BorderLayout=新的BorderLayout();
JPanel背景=新JPanel(布局);
background.setboorder(BorderFactory.createEmptyBorder(10,10,10,10));
checkboxList=newarraylist();
框按钮框=新框(框布局Y_轴);
JButton start=新JButton(“start”);
start.addActionListener(新的MyStartListener());
按钮盒。添加(开始);
JButton stop=新JButton(“stop”);
addActionListener(新的MyStopListener());
按钮盒。添加(停止);
JButton upTempo=新JButton(“节拍上升”);
addActionListener(新的myuptempolListener());
按钮盒。添加(upTempo);
JButton downTempo=新JButton(“Tempo Down”);
downTempo.addActionListener(新的MyDownTempoListener());buttonBox.add(downTempo);
盒子名称盒子=新盒子(盒子布局Y_轴);
对于(int i=0;i<16;i++){
添加(新标签(仪器名称[i]);
}
背景。添加(边框布局。东,按钮盒);
添加(BorderLayout.WEST,名称框);
theFrame.getContentPane().add(后台);
GridLayout grid=新的GridLayout(16,16);grid.setVgap(1);
网格setHgap(2);
主面板=新的JPanel(网格);
添加(边框布局、中心、主面板);
对于(int i=0;i<256;i++){
JCheckBox c=新的JCheckBox();
c、 已选择(假);
复选框列表。添加(c);主面板。添加(c);
}//结束循环
setUpMidi();
机架立根(50,50300300);
frame.pack();
frame.setVisible(true);
}//关闭方法
公共无效设置MIDI(){
试一试{
sequencer=MidiSystem.getSequencer();
sequencer.open();
序列=新序列(序列PPQ,4);
track=sequence.createTrack();
sequencer.setTempoInBPM(120);
}catch(异常e){e.printStackTrace();}
}//关闭方法
public void buildTrackAndStart(){
int[]trackList=null;
顺序。删除跟踪(跟踪);
track=sequence.createTrack();

对于(int i=0;i我记得10年前构建了这个项目。我不记得它是否100%成功,而且我在我以前的Eclipse工作区档案中也找不到该项目。我认为它基本上是有效的,但也说服了我避免使用Java Midi。(无论如何,我对合成更感兴趣。)我有一些关于铅笔代码的杂项注释和更正,这是本书的一个旧版本,但我不认为任何注释和更正会导致您描述的问题

我注意到您展示的代码与我的版本(版权所有2003!)附录中列出的代码不同。也许您有第二版?鉴于代码保存了两个版本,很可能它当时运行得很好

你检查过他们的吗?一定要检查未经确认的勘误表。另外,你是自己输入代码还是导入代码

几乎可以肯定的是,您使用该程序访问的MIDI系统的布局与大多数PC上实现的不同。我从来没有很好地了解MIDI映射到语音的声卡或音响系统使用了什么,但听起来您引用的打击乐器映射是不同的。您的系统可能有超过一套打击乐器,所以你只需检查你正在使用的乐器,以及它是否是经典的GM 1音箱


我似乎还记得Sierra和Bates曾经(或现在仍然)的两位作者中的一位或两位与论坛有关联。你可能会有一些运气在那里交叉发布。如果你从该网站得到答案,请回到这里解决这个问题。

我记得10年前建立了这个网站。我不记得它是否100%成功,而且我在我以前的Eclipse工作区档案中找不到该项目。我认为它基本上是有效的但也说服了我避免使用JavaMIDI(无论如何,我对合成更感兴趣。)我有一些杂项注释和我在t