很久前看到別人寫的電子樂器軟件,感覺很炫,一直以為音效是采用錄制的音樂,然后事件觸發音效播放,今天才知道理解錯了,javax.sound.midi包下提供了一系列與音樂播放,音效組合相關的API.這里實現一個簡單的樂器音效組合.來說明相關參數的作用.
/** * MidiEvent是組合樂曲的指令,一連串的MidiEvent就好像是樂譜一樣. * MidiEvent用來指示在何時執行什么操作,每個指令都必須包括該指令的執行時機.也就是說,樂聲應該在那一拍發響. * * @param comd * chmod代表信息類型 144類型的信息代表NOTE ON表示打開 128代表NOTE OFF 表示關閉 * @param chan * chan表示頻道,每個頻道代表不同的演奏者. * 例如:一號頻道是吉他,二號頻道是Bass.或者可以像IronMaiden用3把不同音色的吉他編制 * @param one * one表示音符,從0~127代表不同音高 * @param two * two代表音道/音量,用多大的音道按下? 0幾乎聽不到,100算是差不多 * @param tick * @return
*/
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); //表示在tick拍啟動a這個Message
event = new MidiEvent(a, tick); } catch (Exception e) { e.printStackTrace(); } return event; }
實例應用代碼
import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; import javax.sound.midi.ShortMessage; import javax.sound.midi.Track; /** * * MiniMusic.java * * 功 能: TODO * 類 名: MiniMusic.java * * ver 変更日 角色 擔當者 変更內容 * ────────────────────────────────────────────── * V1.00 2013-3-19 模塊 蘇若年 初版 * * Copyright (c) 2013 dennisit corporation All Rights Reserved. * * Email:<a href="mailto:DennisIT@163.com">發送郵件</a> * */
public class MiniMusic { public void play(){ try { Sequencer player = MidiSystem.getSequencer(); player.open(); //節拍器
Sequence seq = new Sequence(Sequence.PPQ,4); Track track = seq.createTrack(); int r=0; for(int i=0; i<60; i+=4){ r = (int)((Math.random()*50)+1); //隨即音符
track.add(makeEvent(144, 1, r, 100, i)); track.add(makeEvent(128, 1, r, 100, i+2)); } player.setSequence(seq); player.setLoopCount(player.LOOP_CONTINUOUSLY); //指定無窮的重復次數
player.setTempoInBPM(120); player.start(); } catch (Exception e) { // TODO: handle exception
} } /** * MidiEvent是組合樂曲的指令,一連串的MidiEvent就好像是樂譜一樣. * MidiEvent用來指示在何時執行什么操作,每個指令都必須包括該指令的執行時機.也就是說,樂聲應該在那一拍發響. * * @param comd * chmod代表信息類型 144類型的信息代表NOTE ON表示打開 128代表NOTE OFF 表示關閉 * @param chan * chan表示頻道,每個頻道代表不同的演奏者. * 例如:一號頻道是吉他,二號頻道是Bass.或者可以像IronMaiden用3把不同音色的吉他編制 * @param one * one表示音符,從0~127代表不同音高 * @param two * two代表音道/音量,用多大的音道按下? 0幾乎聽不到,100算是差不多 * @param tick * @return
*/
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); //表示在tick拍啟動a這個Message
event = new MidiEvent(a, tick); } catch (Exception e) { e.printStackTrace(); } return event; } public static void main(String[] args) { MiniMusic mini = new MiniMusic(); mini.play(); } }
運行即可聽到,有一段循環播放的樂器音效,當然你有興趣,可以做成更炫的Java版的電子樂器軟件.如下.
轉載請注明出處:[http://www.cnblogs.com/dennisit/archive/2013/03/19/2969745.html]