猿问

求哪里错了

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",

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

BeatBox GUI = new BeatBox();

GUI.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 for

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();}

} //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 for

makeTracks(trackList);

track.add(makeEvent(176,1,127,0,16));

}//close for

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*0.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+2));

}//end if

}// end for

} //end method

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;

}

}


慕粉3355806
浏览 1504回答 1
1回答

一寸灰_0002

48行的for循环不要写死成16,用你想要使用的数组长度,不然数组长度不够就越界了,还有代码注意缩进,不然可读性太差
随时随地看视频慕课网APP

相关分类

Java
我要回答