让 Java 轻松乐动起来,使用 JFugue 制作自己的音乐

学过或用过 Basic 的朋友大约还会记得,在 Basic 里要演奏(当时还是从 PC 喇叭里发出的,现在也能走声卡了)一段 哆来咪发唆拉西哆 可以写成:

直接用 JDK 可没有这么简单,虽然 JDK 1.3 开始就引入了 Java Sound API 处理 MIDI(Musical Instrument Digital Interface),可是它的接口很难使用,另外,Sun 也专为视、音频的捕获、回放、格式转换提供了 Java Media Framework API (JMF),但不能用来创作。有一个开源的组件 JFugue(http://www.jfugue.org/),它能让你尽显音乐方面的天赋,给你一个高级易用的接口来操作 Java Sound,制作自己的 MIDI 音乐。


一:JFugue Hello World

JFugue 使用字符串来描述音乐表现,然后将其转换成 MIDI 指令并通过 Java Sound 接口对其进行处理。JFugue 可以播放音乐本身,或是保存为一个 MIDI 文件。使用它的 API 非常的容易,比如完成上面 Basic 代码的功能,只要写成

其中的 "C D E F G A B C6W" 就是一个 MIDI 指令集,字符串描述不区分大小写,对音乐有所了解的朋友一眼就能看明白。每一项是一个音符,音符由三部分组成,分别是:

1. 音符名 -- 即唱名,如 CDEFGAB
2. 音高 -- 默认为 5(表示第五个八度-中央 C 所在的八度),如 C7 就是简谱的 ⅰ。您能够用#和b字符分别表示升半音和降半音。
3. 音长 -- 默认为 Q(quartar),表示四分之一符,还有 W(whole),全音符,H(half),半音符。其他如:1/8("i")、1/16("s")、1/32("t")、1/64("x")和1/128音值("n")。您能够通过在音值字符后面加上一个点(".")来表示一个点音值。

除了用音符字母来指定音符名之外,还可直接使用“音符值(note value)”,同时表达音符名和音高。MIDI 有128个音符,编号是从0到127,以半音为间距。第60号音符是Middle-C。要指定音符值,就要在一个方括号里加上数值,比如 [60]。例如前面的 哆来咪发唆拉西哆 可以写成:

所以前面的 C 其实是 C5Q 的缩写,音符名为 C,音高 5 表示第五个八度,音长为 Q,表示四分之一符。

二:音色与节拍

此外,MIDI 可以指定音色(即乐器) 和节拍,JFugue 也当仁不让的支持,例如我们依次用吉他和短笛以每分钟 120 拍演奏上面的序列:

上面的 T 是 Tempo 拍子的缩写,I 是 Instrument 乐器的缩写。General Midi(GM) 音色表里有 128 种乐器(名称和编号)可选,参见:★GM 音色表★常用MIDI控制器一览表★专业术语字典★常用术语。I[] 中括号里可以用乐器名,也可以用编号,如 I[Guitar] 可用 i[24] 替换。只是对于中国民族乐器,如二胡、琵琶的支持还得研究一下。

三:和弦支持

用字符串来描述音乐的另一个优良特性是能够制作和弦。例如用下面的代码方便时创建一个和弦编组(使用了 Pattern 的写法):

关于和弦的命名可参考:常用和弦的分类和命名,针对 JFugue 的准确命名还得看 JFugue 提供的文档。说明一下,c5majw 中的 c5 表示根音为中央 C,maj 表示大三和弦,w 为全音符。上面执行后发出来的是和弦齐奏的声音,还要研究一下和弦如何进行分解。

可用 Player 来保存成一个 Midi 文件:


四:请您欣赏

最后来欣赏一段用 JFugue 演奏的节奏感很强的鼓点的音乐(beat16.mid),这段音乐的代码如下:

接下来就是研究一下的是如何把多音乐进行合成,得到更发烧一级的效果。更详细的 JFugue 使用请浏览它的官网 http://www.jfugue.org/index.html

参考:1. 用Java JFugue进行快速音乐编程 英文原文:Rapid music programming with Java JFugue
2. Code To Joy: myTunes: Groovy and JFugue
3. Interview: JFugue Goes Hip Hop
4. Swing application that uses JFugue API for MIDI files
5. JFugue User's Guide

本文链接 https://yanbin.blog/java-music-jfugue/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

2 Comments
Inline Feedbacks
View all comments
ci
ci
16 years ago

good

peigen
16 years ago

您的文章太好了,我转到我的blog里面以作备份.....谢谢