当前位置: 首页 > news >正文

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/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2013/04/16/3023800.html

相关文章:

  • string与char*的转换(转载)
  • OSSIM远程连接与文件传输图示
  • android studio修改项目包名
  • 每天一个linux命令(18):locate 命令
  • android微信支付
  • 13 款惊艳的 Node.js 框架——第1部分
  • shell学习笔记2---awk字符串处理(原创)
  • 各主流浏览器的区别
  • java获取真实ip地址
  • 简单查询(1)
  • 详解Zoosk千万用户实时通信背后的开源技术[转]
  • 【转】jvm 内存模型及内存调优
  • UESTC 75 The Queen's New Necklaces
  • 冯·若依曼体系结构
  • MySQL学习总结(二)数据库以及表的基本操作
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Intervention/image 图片处理扩展包的安装和使用
  • java小心机(3)| 浅析finalize()
  • JSONP原理
  • JS笔记四:作用域、变量(函数)提升
  • MQ框架的比较
  • PAT A1092
  • React-Native - 收藏集 - 掘金
  • 对JS继承的一点思考
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 实现菜单下拉伸展折叠效果demo
  • 数组大概知多少
  • 为什么要用IPython/Jupyter?
  • 线上 python http server profile 实践
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​【已解决】npm install​卡主不动的情况
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (四)汇编语言——简单程序
  • (算法设计与分析)第一章算法概述-习题
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • *2 echo、printf、mkdir命令的应用
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net mvc 获取url中controller和action
  • .NET6 开发一个检查某些状态持续多长时间的类
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [20161214]如何确定dbid.txt
  • [2669]2-2 Time类的定义
  • [BT]BUUCTF刷题第4天(3.22)
  • [CF482B]Interesting Array
  • [C进阶] 数据在内存中的存储——浮点型篇