Java播放midi文件及加载sf2音色库示例

这篇博客介绍了如何在Java中深入使用MIDI功能,包括播放MIDI文件和加载sf2音色库。作者提供了逐步升级的代码示例,从基础的MidiDevice使用,到添加设备选择和退出处理,再到支持直接读取sf2音色库文件。文章还提到了一个更完整的版本,将MIDI部分封装为类并使用Swing创建了UI。
摘要由CSDN通过智能技术生成

最近折腾Java的MIDI功能,发现网上的教程大多只讲到怎么用Sequencer,更深入的比较难找,而且大都没的注释,于是自己踩坑无数,来这里发点稍微深入使用Java的MIDI功能的示例(嘛其实也没多么深入,毕竟我玩Java也只是刚入门的水平而已)

运行环境及测试如下,Mac虚拟机,Oracle JDK 8u201。

bogon:temp donmor$ screenfetch
readlink: illegal option -- f
usage: readlink [-n] [file ...]
awk: can't open file /proc/fb
 source line number 1
/usr/local/bin/screenfetch: line 1341: [: =: unary operator expected
                               
                 -/+:.          donmor@bogon
                :++++.          OS: 64bit Mac OS X 10.11.6 15G22010
               /+++/.           Kernel: x86_64 Darwin 15.6.0
       .:-::- .+/:-``.::-       Uptime: 39m
    .:/++++++/::::/++++++/:`    Packages: 9
  .:///:`   Shell: bash 3.2.57
  `     Resolution: 1918x888
 -+++++++++++++++++++++++`      DE: Aqua
 /++++++++++++++++++++++/       WM: Quartz Compositor
 /sssssssssssssssssssssss.      WM Theme: Blue
 :ssssssssssssssssssssssss-     Font: Monaco
  osssssssssssssssssssssssso/`  CPU: Intel Core i5-4210U @ 1.70GHz
  `syyyyyyyyyyyyyyyyyyyyyyyy+`  GPU: 
   `ossssssssssssssssssssss/    RAM: 2402MiB / 4096MiB
     :ooooooooooooooooooo+.    
      `:+oo+/:-..-:/+o+/-      
                               
bogon:temp donmor$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
bogon:temp donmor$ java MIDITest 01.mid 


下面贴代码:

bogon:temp donmor$ cat MIDITest.java 
import java.io.File;
import javax.sound.midi.*;

public class MIDITest {
   

	public static void main(String[] args) {
   

		try {
   
			File midif = new File(args[0]);//打开MIDI文件,这里是直接从参数的第一位读取
			Sequence seq = MidiSystem.getSequence(midif);//加载文件到序列(Sequence)中
			Sequencer midip= MidiSystem.getSequencer();//创建一个音序器(Sequencer),即播放器的核心
			midip.open();//启动音序器,
			midip.setSequence(seq);//把序列插入到音序器中
			if(!midip.isRunning())
				midip.start();//开始播放
			long time = midip.getMicrosecondLength() / 1000;//获取MIDI文件长度
			Thread.sleep(time);//让程序等待,直到播放结束
			if(midip.isRunning())
				midip.stop();
			if(midip.isOpen())
				midip.close();//此四句关闭音序器,程序主体结束
		} catch(Exception e) {
   
			e.printStackTrace();//处理异常
		}
	}
}

如果只是听个响,到这里就可以不用看了。然而说好要深入一点的……

那么上第二版,加入了MidiDevice

bogon:temp donmor$ cat MIDITest.java
import java.io.File;
import java.util.ArrayList;
import javax.sound.midi.*;

public class MIDITest {
   

	private static MidiDevice midid;

	public static void main(String[] args) {
   

		try {
   
			MidiDevice.Info[] vdevs = MidiSystem.getMidiDeviceInfo();//获取所有MIDI设备信息
			ArrayList<MidiDevice.Info> xdevs = new ArrayList<MidiDevice.Info>();//准备筛除一些不能用来播放的设备,用这个ArrayList存放合格的
			for (MidiDevice.Info dev : vdevs) {
   
				String s = dev.getName();
				try {
   
					MidiDevice vc = MidiSystem.getMidiDevice(dev);//启动每个设备试验
					vc.getReceiver();//直接访问Receiver,如果没有就走catch
					vc.close();//关闭设备
				} catch (MidiUnavailableException e) {
   
					s 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值