使用jfugue来演奏mid音乐

java真是无所不能,居然还能演奏音乐。今天要介绍的是一个用java写的演奏播放mid音乐的类库,名字叫[url=http://www.jfugue.org/index.html]jfugue[/url]。这个类库的优点是方便写曲谱,使得不懂java sound api的人也能写出程序来演奏mid音乐。

环境:
JDK1.7.0_72 64bit (理论上JDK1.5以上都可以)
当然电脑声卡,音响耳机,客官记得自备。

1.下载
先要到[url=http://www.jfugue.org/index.html]官网[/url]下载jfugue,本文写作时最新版是jfugue-4.0.3.jar。把这个jar包下载下来,加到classpath下就能用了。

2.第一个程序

Player player = new Player();
player.play("C D E F G A B");

没错,就2行代码,就可以演奏出“哆来咪发索拉西”这7个音了!把耳机戴上,听到了吗?

3.进阶,《两只老虎》
[img]http://dl2.iteye.com/upload/attachment/0104/6698/21d03bbf-a6ac-3425-80ce-3a2bf32e291c.png[/img]

Player player = new Player();
//两只老虎
Pattern pattern1 = new Pattern("I[40] C5q D5q E5q C5q");
//跑得快
Pattern pattern2 = new Pattern("E5q F5q G5h");
//一只没有眼睛
Pattern pattern3 = new Pattern("G5i A5i G5i F5i E5q C5q");
//真奇怪
Pattern pattern4 = new Pattern("C5q G4q C5h");

// Put all of the patters together to form the song
Pattern song = new Pattern();
song.add(pattern1, 2); // Adds 'pattern1' to 'song' twice
song.add(pattern2, 2); // Adds 'pattern2' to 'song' twice
song.add(pattern3, 2); // Adds 'pattern3' to 'song' twice
song.add(pattern4, 2); // Adds 'pattern4' to 'song' twice

// Play the song!
player.play(song);


看不懂的话下面解释一下。

4.名词理论

4.1 音符
note 音符
rest 休止符
chord 和弦

jfugue里用MusicString来表示曲谱。
CDEFGAB分别代表:哆来咪发索拉西
R代表 :休止符
sharp 升音符 用#表示
flat 降音符 用b表示

4.2 音阶
octave 八度音阶
[img]http://dl2.iteye.com/upload/attachment/0104/6694/1c98ffda-b651-3fde-87fd-7a387869768b.png[/img]
如上图所示,一般常用的7个音在红色区域的第5阶。
而MusicString里不写的话默认就为第5阶,比如《两只老虎》基本都是第5阶,只有1个音是第4阶。

4.3 音长
duration 音长
[table]
|whole|w|
|half|h|
|quarter|q|
|eighth|i|
|sixteenth|s|
|thirty-second|t|
|sixty-fourth|x|
|one-twenty-eighth|o|
[/table]

《两只老虎》里面基本都是q,表示四分之一音长,最后有个h表示二分之一音长。你可以对比上面的乐谱和代码,就能明白了。

4.4 Pattern的运用
Pattern其实就是为了避免重复的乐谱复制粘贴,《两只老虎》里面每段乐谱都重复2遍。所以用了4个Pattern来简化代码。

4.5 乐器
instrument 乐器
默认: Piano

这个是MIDI的一个规范
MIDI定义了128种乐器,用来表现不同的音色。
我这里不复制粘贴了,请自行去维基百科上查阅[url=http://zh.wikipedia.org/wiki/General_MIDI]General MIDI[/url]里面的 旋律音色(Melodic sounds) 这一章节。

要使用乐器,在MusicString里用I[]表示,其中中括号中是乐器的号码,不过和维基百科上的有一点不一样,它是从0开始编号的,所以是0~127
如此便能解释《两只老虎》开头的那个I[40]了,查维基百科上的表可知41号乐器是小提琴。
至此,你应该对《两只老虎》这首曲子的谱写方法完全明白了吧。

5. mid转谱工具
如果懒的话,有一个mid转谱工具可以用,而不用自己一个个把谱敲进去。
这个工具jfugue自带,类名是org.jfugue.extras.Midi2JFugue

比如我们已经在网上下载了一个《卡农》,文件名是canon.mid
执行以下命令,便可以转为乐谱,存到canon.txt里
java -cp jfugue-4.0.3.jar org.jfugue.extras.Midi2JFugue 11 canon.mid canon.txt
这个命令里面的11没有任何意义,只是一个占位符,因为官方这个工具有点小bug,多了一个无用参数。。。

OK,转好,最后用程序播放曲谱,试验下是否ok。(代码见music.7z里的Canon.java,文末自己找下载)

在卡农的乐曲声中,这次对jfugue的介绍就到此结束了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值