Java 添加播放MIDI音乐
? ? ?Java?在多媒體處理方面的確優勢不大,但是我們在程序中有些時候又需要一些音樂。
? ? 如果播放的音樂是wav等波形音頻文件,又很大的話,所以背景音樂最好就是MIDI了。
? ? 網上很多播放MIDI的教程都是簡單的幾句話的例子。
? ? 沒有考慮資源的釋放問題,如果程序長久運行的話,就會出現內存越耗越多的情況,最后會拋出一個?java.lang.OutOfMemoryError。
在MIDI的播放中,一個類是比較重要的,那就是?MidiSystem?類。
? ? 負責整個MIDI播放設備等的管理,其實就是?Seqencer,它就是一個MIDI播放設置,用于播放MIDI序列的。
? ? 另外還有一個類叫?Seqence,它就是MIDI的序列,MIDI的序列可以自己由程序生成,也可以從文件中或者URL中讀取。
package test1;import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; public class Test5 implements Runnable{private Sequencer midi;private String[] names={"1.mid","2.mid","3.mid","4.mid","5.mid"};private int i;private Map<String,Sequence> map;public Test5(){initMap();new Thread(this).start();}private void initMap(){try {map = new Hashtable<String, Sequence>();midi = MidiSystem.getSequencer(false);midi.open();for (String s : names) {try {Sequence s1 = MidiSystem.getSequence(new File(s));map.put(s, s1);} catch (InvalidMidiDataException ex) {Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);} catch (IOException ex) {Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);}}} catch (MidiUnavailableException ex) {Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);}}private void createPlayer(String name){try {Sequence se=map.get(name);midi.setSequence(se);midi.start();}catch (InvalidMidiDataException ex) {Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);}}public void run(){while(true){try {System.out.println("換文件了."+(++i));String name=names[(int)(Math.random()*names.length)];createPlayer(name);Thread.sleep(10000);} catch (InterruptedException ex) {Logger.getLogger(Test5.class.getName()).log(Level.SEVERE, null, ex);}}}public static void main(String[] args) {new Test5();} }? ? 在這里有很重要的一點,那就是在程序運行的時候,只要一個?Seqencer?就可以。
? ? 我以前在程序里面每次播放的時候都生成了一個Seqencer,我都調用它的?close()?方法了,它還能被打開嗎?
? ? 其實它還可以再度被打開的,就是這樣一種思維使得程序最終因內存溢出而崩潰。
?本文轉自Orson博客園博客,原文鏈接:http://www.cnblogs.com/java-class/archive/2013/04/16/3023800.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Java 添加播放MIDI音乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改Windows7登录界面背景图片的方
- 下一篇: SQL Server 2008 R2 系