欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

Java 添加播放MIDI音乐

发布时间:2025/3/19 java 67 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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音乐的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。