java

位置:IT落伍者 >> java >> 浏览文章

JAVA声音技术


发布日期:2019年10月14日
 
JAVA声音技术

声音可以创造意境触发遐想当与虚拟图像相结合时更加可以让整个世界充满幻觉声音是多媒体技术的基础这就是Sun公司的JAVA媒体技术开发小组忙于准备Java Sound API并将其包含于下一版本的JAVA开发工具库中的原因

在JAVA平台出现之前JAVA语言只能处理电话音质的声音以单声道KHZ的采样频率存储为μlaw AU文件JAVA平台增加了对AIFFWAV以及三种MIDI文件类型的支持所支持的三种MIDI文件格式为MIDI文件类型MIDI文件类型以及RMF

应用程序接口API版提供了一个易于使用的工具集使程序员可以访问底层的合成与演奏引擎从而扩展了JAVA声音的应用其中两个重要的领域是创建数字化音频以及乐器指令数字化接口MIDI由于提供了大量的底层支持功能所以程序员能输入输出声音控制MIDI设备并能查询系统运作情况

声音文件类型简介

主要的声音文件类型如下

AU (扩展名为AU或SND)适用于短的声音文件为Solaris和下一代机器的通用文件格式也是JAVA平台的标准的音频格式AU类型文件使用的三种典型音频格式为: 位μlaw类型(通常采样频率为kHz) 位线性类型以及位线性类型

WAV (扩展名为WAV)由 Microsoft和 IBM共同开发对WAV的支持已经被加进Windows 并且被延伸到Windows WAV文件能存储各种格式包括μlawalaw和 PCM (线性)数据他们几乎能被所有支持声音的Windows应用程序播放

AIFF (扩展名为AIF或IEF)音频互换文件格式是为Macintosh计算机和Silicon Graphics (SGI)计算机所共用的标准音频文件格式AIFF和 AIFFC几乎是相同的除了后者支持例如μlaw和 IMA ADPCM类型的压缩

MIDI (扩展名为MID)乐器数字接口MIDI是为音乐制造业所认可的标准主要用于控制诸如合成器和声卡之类的设备

MIDI文件不包含数字音频采样而是包括一系列指令这些指令控制把来自不同乐器上的音符序列合成乐曲一些MIDI文件包含附加指令来为各种合成设置进行编程

大多数合成器支持MIDI标准所以在一个合成器上制作的音乐能够在另一个上播放 有 MIDI接口的计算机能操纵 MIDI数据以产生新音乐或音响效果例如一个完整的音乐作品可以通过一个软件驱动的命令转换成全新的形式

JAVA声音引擎支持两种MIDI文件类型

MIDI类型文件包含仅仅一个序列所有相关的乐器部分被包含在同一个逻辑 磁道

MIDI类型文件包含多重的 磁道使得不同的乐器被逻辑地分开从而使对声音的操作和重组更加容易

RMF (扩展名为RMF)混合音乐格式是由Beatnik设计出来的混合文件类型通过交互式设定将MIDI和音频采样封装在一起RMF好比是一个所有音乐相关文件的容器RMF也包含对有关版权的详细文件说明的支持RMF文件可以包含多个由不同艺术家创作的存储为MIDI类型或音频采样类型的作品每个都关联着相关的版权信息

对声音引擎的选择

SUN的JAVA媒体开发组试图找到一种方法以增强声音的处理能力并为将来提供一个坚实的平台根据JAVA媒体开发组经理Michael Bundschuh所说

我们想要非常高质量的播放引擎以处理所有的从八位μlaw级直到 CD质量声音的每一件操作 我们希望轻松跨越所有平台诸如Solaris平台 Windows Mac以及其他我们也想要高度发展了的能够跨越不同平台的MIDI能力为上述目的合理的选择是Beatnik的音频引擎(从前是Headspace)

SUN取得了Beatnik的音频引擎使用许可把它当作JAVA声音应用程序接口API的基础

Thomas Dolby RobertsonBeatnik简介

年代初之前Thomas Dolby Robertson的职业完全在音乐方面推出的她用科学照亮了我是一部早期的MTV巨作整个年代他都在不断地作曲和录音使用一种非结构化音乐制作软件但是在 通过一次为Guggenheim博物馆演示虚拟现实的合作他开始思考能否做一些提高音乐制作能力的工作

我当时正伏在 C程序员的肩上并且我突然认识到为做记录做了大量的工作可是没有为演奏时的交互做任何事情有了这样的想法Robertson在年建立了Headspace雇用月光作曲组来帮助实现他的观点Headspace于年成为公司现在被称为Beatnik

JAVA声音音频引擎

JAVA声音引擎为多媒体创建同时考虑了游戏设计和发布WEB内容用标准的 MIDI文件RMF文件并且/或来自任何源的采样该引擎将播放音乐或制造音响效果同时尽可能少用CPU它提供完全的播放控制具有混合音响的能力并可实时地回应用户的输入

JAVA声音引擎是软件 MIDI合成器采样播放设备以及位立体混声器它支持混合直到位的立体MIDI声音和音频采样它直接支持MIDI类型和类型文件以及从位设备到位乐器的波表合成该引擎支持所有通用的 MIDI控制器并且包含象回声处理 LFO (控制过滤器或立体声设备)之类的特性以及ADSR信封 (播放时整形采样)

即使用上所有的功能JAVA声音引擎在一个Mhz的奔腾计算机上也占用不超过%的CPU时间它还能通过有选择地禁用不需要的特性使其变得更加高效一些另外它发布了存储在压缩的RMF音乐文件中的丰富的内容Thomas Dolby Robertson的她用科学照亮了我一首秒的歌曲如存储为CD音质的文件足足占用M字节空间如果以RMF格式存储只需大约 KB:的减少同时丝毫不减音质

为更多有关Beatnik的信息请看Beatnik的WEB站点

JAVA平台声音的简要历史

在JDK x及JDK x下 AudioClip接口提供下列机能

l AudioClip接口

播放

循环

停止

恢复和播放声音最简单的方法是通过Applet类的play()方法调用play()方法有如下二种方式:

play()带有一个参数一个 URL对象装载并演奏储存在 URL处的声音片断

play()带有二个参数基本 URL和文件夹路径名装载并演奏声音文件第一参数经常是对getCodeBase()或 getDocumentBase()的调用

下列代码片断举例说明了直接播放 helloau的方法AU文件与小应用程序位于相同文件夹或目录

play(getCodeBase() helloau);

play()一旦被调用立刻开始恢复和播放声音如果声音文件不能被查找将不会有出错信息仅仅是沉默

启动和停止声音文件或循环播放你必须用 applet的 getAudioClip方法把它装载进入 AudioClip对象类似上面play()方法的参数getAudioClip方法要用一个或两个参数当作播放的指示 第一个或唯一的一个参数是 URL参数用来指示声音文件的位置第二参数是文件夹路径指针

下列代码行举例说明加载声音文件进入剪贴对象:

AudioClip co = getAudioClip(getCodeBase() hornswav);

getAudioClip()方法仅仅能被applet内调用随着JAVA的引入应用程序也能用Applet类的newAudioClip方法装入声音文件前一例子可以改写如下以用于Java应用程序:

AudioClip co = newAudioClip(hornswav);

在你已创建 AudioClip对象之后你能用该对象调用play()loop()以及stop()方法如果 getAudioClip或 newAudioClip方法不能找到指定的声音文件 AudioClip对象的值将是空的试着播放空对象会导致出错所以标准的过程首先是对该条件进行检测

接下来是一个完整的程序设计示例该程序将产生一个applet当鼠标在该小应用程序applet范围内按下时会播放 flute+hrn+mrmbaau音乐样本此AU示例文件与applet在相同目录或文件夹下的

import javaapplet*;

import javaawtevent*;

public class PlayAudio extends Applet

implements MouseListener {

AudioClip audio;

public void init() {

audio = getAudioClip(getDocumentBase()

flute+hrn+mrmbaau);

addMouseListener(this);

}

public void mousePressed(MouseEvent evt) {

if (audio != null) audioplay();

}

public void mouseEntered (MouseEvent me) {

}

public void mouseExited (MouseEvent me) {

}

public void mouseClicked (MouseEvent me) {

}

public void mouseReleased(MouseEvent me) {

}

}

注意 在许多JAVA技术书籍中mouseDown()方法确实是JAVA 事件模型的一部分使用该方法会有一定的危险因为该方法在将来可能不会被支持在JAVA平台下将MouseListener与mousePressed结合使用是优先的选择

API 质的飞跃

注意下列备注是以JAVA API的早期版本为基础的虽然目前这里讨论的大多数对象和概念与过去保持一致但由于该API版本已经终止出现某些改变的可能是存在的

JAVA声音 API为JAVA平台定义了一整套的基本的底层音频处理功能它提供如下接口为:

音频捕获和播放

IDI合成及序列化

这两个主要的功能模块在各自的程序包中提供

diasoundsampled该程序包明确地说明了捕获混合以及回播数字采样音频的界面

diasoundMIDI该程序包提供MIDI合成序列化以

上一篇:Java 技巧:在对标准流进行重定向

下一篇:让Java程序只运行一个实例