最近折腾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