声音可以创造意境,触发遐想,当与虚拟图像相结合时,更加可以让整个世界充满幻觉。声音是多媒体技术的基础。这就是Sun公司的JAVA媒体技术开发小组忙于准备Java Sound 1.0 API并将其包含于下一版本的JAVA开发工具库中的原因。
在JAVA2平台出现之前,JAVA语言只能处理电话音质的声音,以单声道8KHZ的采样频率存储为μ-law AU文件。JAVA2平台增加了对AIFF,WAV以及三种MIDI文件类型的支持。所支持的三种MIDI文件格式为MIDI文件类型0、MIDI文件类型1、以及RMF。
应用程序接口API1.0版提供了一个易于使用的工具集,使程序员可以访问底层的合成与演奏引擎,从而扩展了JAVA声音的应用。其中两个重要的领域是创建数字化音频以及乐器指令数字化接口MIDI。由于提供了大量的底层支持功能,所以程序员能输入输出声音,控制MIDI设备,并能查询系统运作情况。
声音文件类型简介
主要的声音文件类型如下:
AU - (扩展名为AU或SND)适用于短的声音文件,为Solaris和下一代机器的通用文件格式,也是JAVA平台的标准的音频格式。AU类型文件使用的三种典型音频格式为: 8位μ-law类型(通常采样频率为8kHz), 8位线性类型,以及16位线性类型。
WAV - (扩展名为WAV)由 Microsoft和 IBM共同开发,对WAV的支持已经被加进Windows 95并且被延伸到Windows 98. WAV文件能存储各种格式包括μ-law,a-law和 PCM (线性)数据。他们几乎能被所有支持声音的Windows应用程序播放。
AIFF - (扩展名为AIF或IEF)音频互换文件格式是为Macintosh计算机和Silicon Graphics (SGI)计算机所共用的标准音频文件格式。AIFF和 AIFF-C几乎是相同的,除了后者支持例如μ-law和 IMA ADPCM类型的压缩。
MIDI - (扩展名为MID)乐器数字接口MIDI是为音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。
MIDI文件不包含数字音频采样,而是包括一系列指令,这些指令控制把来自不同乐器上的音符序列合成乐曲。一些MIDI文件包含附加指令来为各种合成设置进行编程。
大多数合成器支持MIDI标准,所以在一个合成器上制作的音乐能够在另一个上播放。 有 MIDI接口的计算机能操纵 MIDI数据以产生新音乐或音响效果。例如,一个完整的音乐作品可以通过一个软件驱动的命令转换成全新的形式。
JAVA声音引擎支持两种MIDI文件类型:
MIDI类型0文件-包含仅仅一个序列,所有相关的乐器部分被包含在同一个逻辑 "磁道"上。
MIDI类型1文件-包含多重的 "磁道"使得不同的乐器被逻辑地分开,从而使对声音的操作和重组更加容易。
RMF - (扩展名为RMF)混合音乐格式是由Beatnik设计出来的混合文件类型,通过交互式设定将MIDI和音频采样封装在一起。RMF好比是一个所有音乐相关文件的容器。RMF也包含对有关版权的详细文件说明的支持。RMF文件可以包含多个由不同艺术家创作的存储为MIDI类型或音频采样类型的作品,每个都关联着相关的版权信息。
对声音引擎的选择
在1997年,SUN的JAVA媒体开发组试图找到一种方法,以增强声音的处理能力并为将来提供一个坚实的平台。根据JAVA媒体开发组经理Michael Bundschuh所说,
"我们想要非常高质量的播放引擎以处理所有的从八位μ-law级直到 CD质量声音的每一件操作。 我们希望轻松跨越所有平台,诸如Solaris平台, Windows, Mac以及其他。我们也想要高度发展了的能够跨越不同平台的MIDI能力。为上述目的,合理的选择是Beatnik的音频引擎(从前是Headspace。)"
SUN取得了Beatnik的音频引擎使用许可,把它当作JAVA声音应用程序接口API的基础。
Thomas Dolby Robertson-Beatnik简介
在90年代初之前,Thomas Dolby Robertson的职业完全在音乐方面。他1982推出的"她用科学照亮了我"是一部早期的MTV巨作。整个80年代,他都在不断地作曲和录音,使用一种非结构化音乐制作软件。但是在 1990,通过一次为Guggenheim博物馆演示虚拟现实的合作,他开始思考能否做一些提高音乐制作能力的工作。
"我当时正伏在 C程序员的肩上,并且我突然认识到为做记录做了大量的工作,可是没有为演奏时的交互做任何事情。"有了这样的想法,Robertson在1992年建立了Headspace,雇用月光作曲组来帮助实现他的观点。Headspace于1996年成为公司,现在被称为Beatnik。
JAVA声音音频引擎
JAVA声音引擎为多媒体创建,同时考虑了游戏设计和发布WEB内容。用标准的 MIDI文件、RMF文件、并且/或来自任何源的采样,该引擎将播放音乐或制造音响效果,同时尽可能少用CPU。它提供完全的播放控制,具有混合音响的能力并可实时地回应用户的输入。
JAVA声音引擎是软件 MIDI合成器,采样播放设备,以及16位立体混声器。它支持混合直到64位的立体MIDI声音和音频采样。它直接支持MIDI类型0和类型1文件以及从8位设备到16位乐器的波表合成。该引擎支持所有通用的 MIDI控制器并且包含象回声处理, LFO (控制过滤器或立体声设备)之类的特性,以及ADSR信封 (播放时整形采样)。
即使用上所有的功能,JAVA声音引擎在一个90Mhz的奔腾计算机上也占用不超过30%的CPU时间。它还能通过有选择地禁用不需要的特性,使其变得更加高效一些。另外,它发布了存储在压缩的RMF音乐文件中的丰富的内容。Thomas Dolby Robertson的"她用科学照亮了我",一首7分21秒的歌曲,如存储为CD音质的文件足足占用70M字节空间。如果以RMF格式存储只需大约636 KB,是120:1的减少,同时丝毫不减音质。
为更多有关Beatnik的信息,请看Beatnik的WEB站点。
JAVA平台声音的简要历史
在JDK 1.0.x及JDK 1.1.x下, AudioClip接口提供下列机能:
l AudioClip接口
播放
循环
停止
恢复和播放声音最简单的方法是通过Applet类的play()方法。调用play()方法有如下二种方式:
play()-带有一个参数,一个 URL对象,装载并演奏储存在 URL处的声音片断。
play()-带有二个参数,基本 URL和文件夹路径名,装载并演奏声音文件。第一参数经常是对getCodeBase()或 getDocumentBase()的调用。
下列代码片断举例说明了直接播放 hello.au的方法。AU文件与小应用程序位于相同文件夹或目录。
play(getCodeBase(), "hello.au");
play()一旦被调用立刻开始恢复和播放声音。如果声音文件不能被查找,将不会有出错信息,仅仅是沉默。
启动和停止声音文件,或循环播放,你必须用 applet的 getAudioClip方法把它装载进入 AudioClip对象,类似上面play()方法的参数,getAudioClip方法要用一个或两个参数,当作播放的指示。 第一个或唯一的一个参数是 URL参数,用来指示声音文件的位置,第二参数是文件夹路径指针。
下列代码行举例说明加载声音文件进入剪贴对象:
AudioClip co = getAudioClip(getCodeBase(), "horns.wav");
getAudioClip()方法仅仅能被applet内调用。随着JAVA2的引入,应用程序也能用Applet类的newAudioClip方法装入声音文件。前一例子可以改写如下以用于Java应用程序:
AudioClip co = newAudioClip("horns.wav");
在你已创建 AudioClip对象之后,你能用该对象调用play()、loop()以及stop()方法。如果 getAudioClip或 newAudioClip方法不能找到指定的声音文件, AudioClip对象的值将是空的。试着播放空对象会导致出错,所以标准的过程首先是对该条件进行检测。
接下来是一个完整的程序设计示例,该程序将产生一个applet,当鼠标在该小应用程序applet范围内按下时会播放 flute+hrn+mrmba.au音乐样本。此AU示例文件与applet在相同目录或文件夹下的。
import java.applet.*;
import java.awt.event.*;
public class PlayAudio extends Applet
implements MouseListener {
AudioClip audio;
public void init() {
audio = getAudioClip(getDocumentBase(),
"flute+hrn+mrmba.au");
addMouseListener(this);
}
public void mousePressed(MouseEvent evt) {
if (audio != null) audio.play();
}
public void mouseEntered (MouseEvent me) {
}
public void mouseExited (MouseEvent me) {
}
public void mouseClicked (MouseEvent me) {
}
public void mouseReleased(MouseEvent me) {
}
}
注意: 在许多JAVA2技术书籍中,mouseDown()方法确实是JAVA 1.0事件模型的一部分。使用该方法会有一定的危险,因为该方法在将来可能不会被支持。在JAVA2平台下将MouseListener与mousePressed结合使用是优先的选择。
API 1.0-质的飞跃
注意:下列备注是以JAVA API的早期版本0.86为基础的。虽然目前这里讨论的大多数对象和概念与过去保持一致,但由于该API版本已经终止,出现某些改变的可能是存在的。
JAVA声音 1.0 API为JAVA平台定义了一整套的基本的底层音频处理功能。它提供如下接口为:
音频捕获和播放
IDI合成及序列化
这两个主要的功能模块在各自的程序包中提供。
javax.media.sound.sampled-该程序包明确地说明了捕获、混合以及回播数字采样音频的界面。
javax.media.sound.MIDI-该程序包提供MIDI合成、序列化以