1 异常
使用带有throws的方法时需要把方法放入try/catch函数中。
import javax.sound.midi.*;
public class MusicTest1
{
public void play()
{
try
{
Sequencer sqquencer = MidiSystem.getSequencer();
System.out.println("We got a sequencer");
}
catch (MidiUnavailableException ex)
//catch (Exception ex)
{
System.out.println("Bummer");
}
}
public static void main(String[] args)
{
MusicTest1 mt = new MusicTest1();
mt.play();
}
}
异常是一种Exception类型的对象,其他异常都是Exception的子类。
2 抛出异常
有风险,会抛出异常的程序代码:
public void takeRisk() throw BadException
{
if(abandonAllHope)
{
throw new BadException();
}
}
调用该方法的程序代码
public void crossFingers()
{
try
{
anObject.takeRisk();
}
catch(BadException ex)
{
ex.printStackTrace();
}
}
3 RuntimeExceptions
RuntimeExceptions极其子类被称为不检查异常,编译器不会抛出其异常。
因为大部分RuntimeExceptions都是因为程序的逻辑问题。
try/catch是用来处理真正的异常,而不是程序中的逻辑错误。
4 finally 一定会执行的部分
finally块是用来存放不管有没有异常都得执行的程序。
可以把重要的代码集中在一处,不需要在try和finally都写一遍。
如果try或catch有return指令,finally还是会执行,再跳回return指令。
try
{
anObject.takeRisk();
}
catch(BadException ex)
{
ex.printStackTrace();
}
finally
{
turnOvenOff()
}
5 MIDI
JavaSoundAPI是在Java1.3之后所加入的一组类和接口,放在J2SE的类函数库中。
JavaSound被分为两个部分:MIDI和取样。
MIDI即Musical Instrument Digital Interface,也是不同电子发声装置沟通的标准协议。
可以把MIDI详细成某种乐谱,本身不带有声音,带有的是MIDI播放功能装置的指令。
Sequencer CD播放机
Sequence 单曲CD
Track 单曲
MIDI event 乐符
5个步骤:
//1.获取Sequencer并将它打开
Sequencer player = MidiSystem.getSequencer();
player.open();
//2.创建新的Sequence
Sequence seq = new Sequence(time,4);
//3.从Sequence中创建新的Track
Track t = seq.createTrack();
//4.填入MidiEvent
t.add(myMidiEvent1)
player.setSequence(Seq);
//5.播放
player.start();
import javax.sound.midi.*;
public class MiniMiniMusicApp {
public static void main(String[] args){
MiniMiniMusicApp mini = new MiniMiniMusicApp();
mini.play();
}//end main
public void play(){
try{
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
ShortMessage a = new ShortMessage();
a.setMessage(144, 1, 44, 100);
MidiEvent noteOn = new MidiEvent(a, 1);
track.add(noteOn);
ShortMessage b = new ShortMessage();
b.setMessage(128, 1, 44, 100);
MidiEvent noteOff = new MidiEvent(b, 16);
track.add(noteOff);
player.setSequence(seq);
player.start();
} catch (Exception ex){
ex.printStackTrace();
}
}
}
6 MidiEvent
MIDI指令实际上会放在Message对象中
Message描述做什么,MIDIEvent描述何时做
ShortMessage a = new ShortMessage();
//发出44音符
a.setMessage(144, 1, 44, 100);
//在第一拍启动a这个Message
MidiEvent noteOn = new MidiEvent(a, 1);
track.add(noteOn);
a.setMessage(144, 1, 44, 100);
信息类型 144打开 128关闭
频道 1吉他 2贝斯
音符 0-128代表不同音高
音量 0几乎听不到,100普通