第11章 程序料理

2015/6/15
1、用Sequencer(音序器)來創(chuàng)建音樂;但是Sequencer是一個接口,所以在創(chuàng)建對象時要用:
<pre><code>
Sequencer player=MidiSystem.getSequencer();
</code></pre>
同時,MidiSystem是一個類,Sequencer繼承了MidiSystem。
在使用Sequencer時,要用try……catch……包裹
player.open();//開啟音序器

2、MidiEvent是組合樂曲的指令,,指令實際會放在Message對象中(用ShortMessage,ShortMessage 包含了一個 MIDI 消息,該消息在狀態(tài)字節(jié)后最多有兩個數(shù)據(jù)字節(jié)。ShortMessage 類提供了用于獲取和設置 MIDI 消息內(nèi)容的方法)
<pre><code>
//創(chuàng)建Message
ShortMessage a=new ShortMessage();

//置入指令
//44代表發(fā)出44音符
//第一個參數(shù)是信息類型,其余三個要根據(jù)信息類型而定
//144代表打開類型,128代表關(guān)閉類型
1代表頻道(指不同的演奏者),44代表音符號(0-127代表不同的音高),100代表音道(0-100代表音量)
a.setMessage(144,1,44,100);
b.setMessage(128,1,44,100);
first.setMessage(192,1,70,0);

//用Message創(chuàng)建MidiEvent
//表示在第一拍啟動a
MidiEvent noteoff=new MidiEvent(a,1);
//在第四拍啟動b,即關(guān)閉
MidiEvent noteoff=new MidiEvent(b,4);

//將MidiEvent加到Track(軌道)中
//所有的MidiEvent都要加到Track中,Sequencer會根據(jù)時間來組織它們,同一時間可以執(zhí)行多個,例如合聲。
track.add(noteoff);
</code></pre>

3.更換樂器和音調(diào)的方法
192代表著設置樂器,
1是頻道,確定修改樂器的頻道
70代表修改的樂器,
0是音道,這里必須是0.
<pre><code>
ShortMessage first=new ShortMessage();
first.setMessage(192,1,70,0);
MidiEvent f=new MidiEvent(first,1);
//中的“1”代表更改的節(jié)拍號。
track.add(f);
</code></pre>

4.Sequence是一個類,通過把它添加到sequencer對象中來執(zhí)行音樂:
<pre><code>
Sequence seq=new Sequence(Sequence.PPQ,4);
player.setSequence(seq);
</code></pre>
同時:track作為一個接口,也要通過Sequence來創(chuàng)建:
<pre><code>
Track track=seq.createTrack();
</code></pre>

源碼:
<pre><code>
package Music;
import javax.sound.midi.*;
public class MiniMiniMusicApp {
public static void main(String[] args){
MiniMiniMusicApp mini=new MiniMiniMusicApp();
mini.play();
}
public void play(){
try{
Sequencer player=MidiSystem.getSequencer();
player.open();

        Sequence seq=new Sequence(Sequence.PPQ,4);
        
        Track track=seq.createTrack();
        
        ShortMessage first=new ShortMessage();
        first.setMessage(192,1,70,0);
        MidiEvent f=new MidiEvent(first,1);
        track.add(f);
        
        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,8);
        track.add(noteoff);
        
        player.setSequence(seq);
        
        player.start();
    }catch(Exception e){
        e.printStackTrace();
    }
}

}
</code></pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容