一开始是下面红字部分,那个数组,少打了一个字,导致·原来16字长的数组变成了15字长,在后面,instruments数组赋值给其他数组的时候,出现了数组溢出的错误。 1 import java.awt.*
;
2 import javax.swing.*
;
3 import javax.sound.midi.*
;
4 import java.util.*
;
5 import java.awt.event.*
;
6
7 public class BeatBox {
8
9 JPanel mainPanel;
10 ArrayList<JCheckBox>
checkboxList;
11 Sequencer sequencer;
12 Sequence sequence;
13 Track track;
14 JFrame theFrame;
15
16 String[] instrumentNames={"Bass Drum","Closed Hi-Hat"
,
17 "Open Hi-Hat","Acoustic Snare","Crash Cymbal"
,
18 "Hand Clap","High Tom","Hi Bongo","Maracas","Whistle"
,
19 "Low Conga","Cowbell","Vibraslap","Low-mid Tom","High Agogo","Open Hi Conga"};
//乐器的名称,以String的array维护。
20 int[] instruments={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};//实际的乐器关键字,例如说35是bass,42是Closed Hi-Hat。
21
22 public static void main(String[] args){
23 new BeatBox().buildGUI();
24 }
25 public void buildGUI(){
26 theFrame=
new JFrame("CyberBeatBox"
);
27 theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
28 BorderLayout layout=
new BorderLayout();
29 JPanel background=
new JPanel(layout);
30 background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
//设置面板上摆设组件时的空白边缘。
31
32 checkboxList=
new ArrayList<JCheckBox>
();
33 Box buttonBox=
new Box(BoxLayout.Y_AXIS);
//设置buttonBox沿着Y轴摆放。
34
35 JButton start=
new JButton("Start"
);
36 start.addActionListener(
new MyStartListener());
37 buttonBox.add(start);
38
39 JButton stop=
new JButton("Stop"
);
40 stop.addActionListener(
new MyStopListener());
41 buttonBox.add(stop);
42
43 JButton upTempo=
new JButton("Tempo Up"
);
44 upTempo.addActionListener(
new MyUpTempoListener());
45 buttonBox.add(upTempo);
46
47 JButton downTempo=
new JButton("Tempo Down"
);
48 downTempo.addActionListener(
new MyDownTempoListener());
49 buttonBox.add(downTempo);
50
51 Box nameBox=
new Box(BoxLayout.Y_AXIS);
52 for (
int i=0;i<16;i++
){
53 nameBox.add(
new Label(instrumentNames[i]));
54 }
55
56 background.add(BorderLayout.EAST,buttonBox);
57 background.add(BorderLayout.WEST,nameBox);
58
59 theFrame.getContentPane().add(background);
60
61 GridLayout grid=
new GridLayout(16,16
);
62 grid.setVgap(1
);
63 grid.setHgap(2
);
64 mainPanel=
new JPanel(grid);
65 background.add(BorderLayout.CENTER,mainPanel);
66
67 for(
int i=0;i<256;i++
){
68 JCheckBox c=
new JCheckBox();
69 c.setSelected(
false);
70 checkboxList.add(c);
71 mainPanel.add(c);
72 }
//创建checkbox组,设定成未勾选的为false并加到ArrayList和面板上。
73
74 setUpMidi();
75
76 theFrame.setBounds(50,50,300,300
);
77 theFrame.pack();
78 theFrame.setVisible(
true);
79 }
//关闭方法
80
81 public void setUpMidi() {
82 // TODO Auto-generated method stub
83 try{
84 sequencer=
MidiSystem.getSequencer();
85 sequencer.open();
86 sequence=
new Sequence(Sequence.PPQ,4
);
87 track=
sequence.createTrack();
88 sequencer.setTempoInBPM(120
);
89 }
catch(Exception e){e.printStackTrace();}
90 }
//关闭方法
91 public void buildTrackAndStart(){
92 int[] trackList=
null;
93
94 sequence.deleteTrack(track);
95 track=
sequence.createTrack();
96
97 for(
int i=0;i<16;i++
){
98 trackList=
new int[16
];
99
100 int key=
instruments[i];
101
102 for(
int j=0;j<16;j++
){
103 JCheckBox jc=(JCheckBox) checkboxList.get(j+(16*
i));
104 if(jc.isSelected()){
105 trackList[j]=
key;
106 }
else{
107 trackList[j]=0
;
108 }
109 }
//关闭内部循环
110
111 makeTracks(trackList);
112 track.add(makeEvent(176,1,127,0,16
));
113 }
//关闭外部循环
114
115 track.add(makeEvent(192,9,1,0,15
));
116 try{
117
118 sequencer.setSequence(sequence);
119 sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
120 sequencer.start();
121 sequencer.setTempoInBPM(120
);
122 }
catch(Exception e){e.printStackTrace();}
123 }
//关闭buildTrackAndStart方法。
124 public class MyStartListener
implements ActionListener{
125 public void actionPerformed(ActionEvent a){
126 //buildTrackAndStart();
127 buildTrackAndStart();
128 }
129 }
//关闭内部类
130 public class MyStopListener
implements ActionListener{
131 public void actionPerformed(ActionEvent a){
132 sequencer.stop();
133 }
134 }
//关闭内部类
135 public class MyUpTempoListener
implements ActionListener{
136 public void actionPerformed(ActionEvent a){
137 float tempoFactor=
sequencer.getTempoFactor();
138 sequencer.setTempoFactor((
float)(tempoFactor*1.03
));
139 }
140 }
//关闭内部类
141 public class MyDownTempoListener
implements ActionListener{
142 public void actionPerformed(ActionEvent a){
143 float tempoFactor=
sequencer.getTempoFactor();
144 sequencer.setTempoFactor((
float)(tempoFactor*.97
));
145 }
146 }
//关闭内部类
147
148
149 public void makeTracks(
int[] list){
150 for(
int i=0;i<16;i++
){
151 int key=
list[i];
152
153 if(key!=0
){
154 track.add(makeEvent(144,9,key,100
,i));
155 track.add(makeEvent(128,9,key,100,i+1
));
156 }
157 }
158 }
159 public MidiEvent makeEvent(
int comd,
int chan,
int one,
int two,
int tick){
160 MidiEvent event=
null;
161 try{
162 ShortMessage a=
new ShortMessage();
163 a.setMessage(comd,chan,one,two);
164 event=
new MidiEvent(a,tick);
165 }
catch(Exception e){e.printStackTrace();}
166 return event;
167 }
168 }
下面这个报错,就是运行时候,出现了“数组越界问题。”:。。。。。java.lang.ArrayIndexOutOfBoundsException....翻译成汉语,还真是数组越界。。。不难嘛~~~
转载于:https://www.cnblogs.com/meihao1989/p/3248734.html