JAVA大作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
new BeatBox().buildGUI(); } public void buildGUI(){
theFrame=new JFrame("Cyber BeatBox"); /*frame.setDefaultCloseOperation() 是设置 用户在 此窗体上发 起 "close" 时默认执行的操作。 * EXIT_ON_CLOSE:使用 System exit 方法退出应用程序。*/ theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
private JPanel mainPanel; /*用于储存复选框*/ private ArrayList<JCheckBox> checkbokList; /*Sequencer 用于控制 Sequence 对象。
* 它用于将所有的 midi 数据送到正确装置,相当与实际生活的发声装置, 如 CD 播放器。
} catch(Exception ex){
ex.printStackTrace(); System.out.println("sequencer 等对象生成有问题!"); } } /*这里是播放功能的具体实现*/ @SuppressWarnings("static-access") public void buildTrackAndStart(){ /*用于储存每种乐器的节拍*/ int[] trackList=null; /*每次播放前先删除掉旧的音乐节拍*/ sequence.deleteTrack(track); /*由 sequence 对象获取 track 对象*/ track=sequence.createTrack(); for(int i=0;i<16;i++){ trackList=new int[16]; /*key 储存乐器对应的编号*/ int key=instruments[i]; /*遍历每一组乐器复选当其为选中时,将数组对应节拍位赋值为 key*/
* 哎哎不是我们考虑的问题啦!*/ private Sequencer sequencer; /*Sequence 是一种数据结构,包含可由 Sequencer 对象回放的音乐信息。 * 类似于生活中 CD*/ private Sequence sequence; private Track track; /*Track 占用 Sequencer 演奏的数据层次中的一个中间层。 * sequencer 演奏 sequence,它包含音轨,而音轨包含 MIDI 事件。 * Sequencer 可能提供 mute 或 solo 具体音轨的控制。 * 类似于播放的歌曲本身,而 track 也类似歌曲它是由许多的音符(相对应 数字)组成的。 */ private JFrame theFrame; /*各种乐器的名称*/ private String[] instrumentNames={"低音鼓","闭镲","开镲","原声","铙钹","拍 子","高音鼓","高音圆鼓","沙球","口哨","低音手鼓","颈铃","颤音叉","中低嗵鼓"," 高音撞铃","高音手鼓"}; /*各种乐器所对应的编号*/ private int[] instruments={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63}; public static void main(String[] args) {
for(int j=0;j<16;j++){ JCheckBox jc=(JCheckBox)checkbokList.get(j+(16*i)); if(jc.isSelected()){ trackList[j]=key; } else{ trackList[j]=0; }
} /*调用 makeTracks 方法,为 track 对象添加每组乐器的 midiEvent 对 象,构成有序的节奏序列*/ makeTracks(trackList); /*插入编号为 176 的类型,它不会做任何事情,只是用来判别音符是 否被播放,它与 144(开始发声)类型是同时进行的*/ track.add(makeEvent(176, 1, 127, 0, 16)); } /*同 167 类似确保 16 有事件,否则其不会播放*/ track.add(makeEvent(192, 9, 1, 0, 15)); try{ /*将 sequence 放入 sequencer 中,类似将 CD 放进 CD 播放器中*/ sequencer.setSequence(sequence); /*设置循环播放*/ sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY); /*开始播放*/ sequencer.start(); /*设置设置速度,以每四分音符的微秒数为单位*/ sequencer.setTempoInBPM(120); } catch(Exception e){ e.printStackTrace();
/*使用边界布局*/ BorderLayout layout=new BorderLayout(); JPanel background=new JPanel(layout); /*设置边框属性距内部 10 像素*/ background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); checkbokList=new ArrayList<JCheckBox>(); /*Box 容器用于放置按钮,设置从上到下纵向布置组件*/ Box buttonBox=new Box(BoxLayout.Y_AXIS); /*开始播放,添加开始播放的事件监听*/ JButton start=new JButton("开始"); start.addActionListener(new MyStartListener()); buttonBox.add(start); /*结束播放*/ JButton stop=new JButton("结束"); stop.addActionListener(new MyStopListener()); buttonBox.add(stop); /*加快节奏*/ JButton upTempo=new JButton("加快"); upTempo.addActionListener(new MyUpTempoListener()); buttonBox.add(upTempo); /*减慢节奏*/ JButton downTempo=new JButton("减慢"); downTempo.addActionListener(new MyDownTempoListener()); buttonBox.add(downTempo); /*Box 容器用于放置乐器名,设置从上到下纵向布置组件*/ 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); /*JFrame 添加 JPanel 面板*/ theFrame.getContentPane().add(background); /*使用 GridLayout 布局分 16 行 16 列*/ 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++){
java 大作业
课程名称: java 大作业 设计题目: 简单的节奏发声器 学 院: 计算机科学与信息工程学院 学生姓名: 学生学号: 专业班级: 指导教师:
年月日
1.简介
程序的主要功能有:提供用户界面,可勾选每组乐器的不同节拍的复选框组成一定 规律的节奏发声,且带有播放、暂停、加快/减慢节奏的功能。主要涉及 java 程序设计 以下部分: (1) GUI 编程:利用 GUI 接口使用相应的功能组件和合理的布局方式完成程序的用户
2.程序源码
package en; import java.awt.*; import javax.swing.*; import javax.sound.midi.*; import java.util.*; import java.awt.event.*; /*这个程序主要用到时 JavaSound API 的 midi 即电子发声装置的一些标准*/ public class BeatBox {
try{ /*生成 sequencer 对象,并将它打开,用于对 sequence 的控制*/ sequencer=MidiSystem.getSequencer(); sequencer.open(); /*生成 sequence 对象*/ sequence=new Sequence(Sequence.PPQ,4); /*从 sequence 对象生成 track 对象*/ track=sequence.createTrack(); sequencer.setTempoInBPM(120);
JCheckBox c=new JCheckBox(); c.setSelected(false); checkbokList.add(c); mainPanel.add(c); } setUpMidi(); /*setBounds 设置 frame 左上角的坐标为(50,50),宽为 300,高为 300。*/ theFrame.setBounds(50,50,300,300); theFrame.pack(); theFrame.setVisible(true); } public void setUpMidi(){ /*可能会抛出异常 */
} } /*遍历数组通过 makeEvent 方法生成 key 值所对应的 midiEvent 对象*wenku.baidu.com 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)); /*节奏结束,节奏发声时间为 1*/ track.add(makeEvent(128, 9, key, 100, i+1)); }
界面。 (2) 组件的事件监听:为相应的功能组件注册事件,利用实现 ActionListener 接口
的内部类完成对应事件的事件监听。 (3) JavaSound API:程序主要用到只有 MIDI 部分,利用核心部分的 Sequencer、
Sequence 与 Track 对象的方法,完成程序的具体节奏发声。
} } /*这个方法主要用于生成 midiEvent 对象,其类似组合结拜的指令,如指定 发音,结束发音等,一系列的 midiEvent 组合在一起就成了有条理的节奏。*/ public static MidiEvent makeEvent(int comd,int chan,int one ,int two,int tick){
相关文档
最新文档