java

位置:IT落伍者 >> java >> 浏览文章

如何为Java程序中添加播放MIDI音乐功能


发布日期:2022年06月19日
 
如何为Java程序中添加播放MIDI音乐功能

Java在多媒体处理方面的确优势不大但是我们在程序中有些时候又需要一些音乐做为点缀如果播放的音乐是wav等波形音频文件又挺大所以背景音乐最好就是MIDI了可是网上很多播放MIDI的教程都是简单的几句话的例子并且没有考虑资源的释放问题如果程序长久运行的话就会出现内存越耗越多的情况以至于最后抛出一个javalangOutOfMemoryError整个程序就挂了

在MIDI的播放中一个类是比较重要的那就是MidiSystem类它负责整个MIDI播放设备等的管理其实就是Seqencer它就是一个MIDI播放设置用于播放MIDI序列的还有一个类叫Seqence它就是MIDI的序列MIDI的序列可以自己由程序生成也可以从文件中或者URL中读取

下面是一个播放MIDI音乐功能实例

/* * Testjava * * Created on :: * * To change this template choose Tools | Templates * and open the template in the editor */package test;import javaioFile;import javaioIOException;import javaioInputStream;import javautilHashtable;import javautilMap;import javautilloggingLevel;import javautilloggingLogger;import javaxsoundmidiInvalidMidiDataException;import javaxsoundmidiMidiSystem;import javaxsoundmidiMidiUnavailableException;import javaxsoundmidiSequence;import javaxsoundmidiSequencer;/** * * @author hadeslee */public class Test implements Runnable{    private Sequencer midi;    private String[] names={midmidmidmidmid};    private int i;    private Map<StringSequence> map;    public Test(){        initMap();        new Thread(this)start();    }    private void initMap(){        try {            map = new Hashtable<String Sequence>();            midi = MidiSystemgetSequencer(false);            midiopen();            for (String s : names) {                try {                    Sequence s = MidiSystemgetSequence(new File(s));                    mapput(s s);                } catch (InvalidMidiDataException ex) {                    LoggergetLogger(TestclassgetName())log(LevelSEVERE null ex);                } catch (IOException ex) {                    LoggergetLogger(TestclassgetName())log(LevelSEVERE null ex);                }            }        } catch (MidiUnavailableException ex) {            LoggergetLogger(TestclassgetName())log(LevelSEVERE null ex);        }    }    private void createPlayer(String name){        try {            Sequence se=mapget(name);            midisetSequence(se);            midistart();        }catch (InvalidMidiDataException ex) {            LoggergetLogger(TestclassgetName())log(LevelSEVERE null ex);        }    }    public void run(){        while(true){            try {                Systemoutprintln(换文件了+(++i));                String name=names[(int)(Mathrandom()*nameslength)];                createPlayer(name);                Threadsleep();            } catch (InterruptedException ex) {                LoggergetLogger(TestclassgetName())log(LevelSEVERE null ex);            }        }    }    public static void main(String[] args) {        new Test();    }}

               

上一篇:Java获取及修改图像的RGB值和Alpha值

下一篇:使用javamail自动获取gmail邮件