Trail: Sound

Java Sound API 是用于影响和控制声音媒体(包括音频和乐器数字interface(MIDI)数据)的 Importing 和输出的低级 API。 Java Sound API 在提高可扩展性和灵 Active 的框架中,提供了对声音 Importing 和输出通常所需的功能的显式控制。

Java Sound API 满足了许多应用程序开发人员的需求。潜在的 Applications 包括:

  • 通信框架,例如会议和电话

  • final用户内容传送系统,例如使用流式传输内容的媒体播放器和音乐

  • 使用动态内容的交互式应用程序,例如游戏和网站

  • 内容创建和编辑

  • 工具,工具箱和 Util

Java 声音 API 在 Java 平台上提供了最低级别的声音支持。它为应用程序提供了对声音操作的大量控制,并且是可扩展的。例如,Java Sound API 提供了用于安装,访问和操纵系统资源的机制,例如音频混合器,MIDI 合成器,其他音频或 MIDI 设备,文件读取器和写入器以及声音格式转换器。 Java Sound API 不包括复杂的声音编辑器或图形工具,但是它提供了可以构建此类程序的功能。它强调了低级控制,超出了final用户通常期望的控制范围。

Java Sound API 包括对数字音频和 MIDI 数据的支持。这两个主要的功能模块在单独的软件包中提供:

  • javax.sound.sampled –此软件包指定用于catch,混合和回放数字(采样)音频的interface。

  • javax.sound.midi –该软件包提供了 MIDI 合成,音序和事件传输的interface。

另外两个软件包允许服务提供者(与应用程序开发者相对)创建定制软件组件,以扩展 Java Sound API 的实现功能:

本页介绍了采样音频系统,MIDI 系统和 SPI 软件包。然后,本教程后面将详细讨论每个软件包。

Note:

还有其他 Java 平台 API 也具有与声音相关的元素。 Java Media Framework API(JMF)是更高级别的 API,当前可以作为 Java 平台的标准扩展使用。 JMF 指定了一个统一的体系结构,消息传递协议和编程interface,用于catch和回放基于时间的媒体。 JMF 为基本的媒体播放器应用程序提供了一个更简单的解决方案,它使音频和视频等不同媒体类型之间的同步成为可能。另一方面,专注于声音的程序可以从 Java Sound API 中受益,特别是当它们需要更高级的功能时,例如能够仔细控制缓冲的音频播放或直接操纵 MIDI 合成器的功能。其他具有声音方面的 Java API 包括 Java 3D 和用于电话和语音的 API。所有这些 API 的实现都可以在内部使用 Java Sound API 的实现,但并非必须如此。

什么是采样音频?

javax.sound.sampled包处理数字音频数据,Java Sound API 将其称为采样音频。 samples是 signal 的连续快照。就音频而言,signal 是声波。麦克风将声音 signal 转换为相应的模拟电 signal,而模数转换器将该模拟 signal 转换为采样的数字形式。下图显示了录音中的一小段时间。

采样声波

采样声波

该图在垂直轴上绘制声压(振幅),在水平轴上绘制时间。以一定速率定期测量模拟声波的幅度,从而得到包含数字音频 signal 的离散采样(图中的红色数据点)。中心水平线表示振幅为零;线上方的点是正值 samples,线下方的点是负值。模拟 signal 的数字逼近的精度取决于其时间分辨率(采样率)和其量化或幅度分辨率(用于表示每个 samples 的位数)。作为参考,记录为记录在光盘上的音频每秒被采样 44100 次,并以每个采样 16 位表示。

这里使用的“采样音频”一词有些宽松。声波可以以离散的间隔采样,同时以模拟形式保留。但是,出于 Java Sound API 的 Object,“采样音频”等效于“数字音频”。

通常,计算机上采样的音频来自录音,但是可以替代地合成声音(例如,创建按键式电话的声音)。术语“采样音频”是指数据的类型,而不是其来源。

Java Sound API 不采用特定的音频硬件配置;它旨在允许将不同种类的音频组件安装在系统上并由 API 访问。 Java Sound API 支持通用功能,例如声卡的 Importing 和输出(例如,用于记录和回放声音文件)以及混合多个音频流。这是典型音频体系结构的一个示例:

以下上下文描述了此图

典型的音频架构

在此示例中,诸如声卡之类的设备具有各种 Importing 和输出端口,并且在软件中提供了混合。混音器可能会接收从文件读取的数据,从网络流式传输的数据,由应用程序即时生成的数据或由 MIDI 合成器生成的数据。混音器将所有音频 Importing 合并为一个流,然后可以将其发送到输出设备进行渲染。

什么是 MIDI?

javax.sound.midi程序包包含用于传输和排序 MIDI 事件以及从这些事件中合成声音的 API。

采样的音频是声音本身的直接表示,而 MIDI 数据可以被视为创建声音(尤其是音乐声音)的秘诀。 MIDI 数据与音频数据不同,它不能直接描述声音。相反,它描述的事件会影响由启用 MIDI 的设备或乐器(如合成器)执行的声音(或动作)。 MIDI 数据类似于图形用户interface的键盘和鼠标事件。在 MIDI 的情况下,事件可以被视为对音乐键盘的操作,以及对该乐器上各种踏板,滑块,switch和旋钮的操作。这些事件实际上不一定起源于硬件乐器。它们可以在软件中模拟,也可以存储在 MIDI 文件中。可以创建,编辑和执行这些文件的程序称为定序器。许多计算机声卡都包含 MIDI 可控制的音乐合成器芯片,音序器可以向其发送 MIDI 事件。合成器也可以完全用软件实现。合成器解释接收到的 MIDI 事件并产生音频输出。通常,从 MIDI 数据合成的声音是音乐声(例如,与语音相反)。 MIDI 合成器还能够生成各种声音效果。

某些声卡包括 MIDIImporting 和输出端口,可以将外部 MIDI 硬件设备(例如键盘合成器或其他乐器)连接到该声卡。应用程序可以从 MIDIImporting 端口接收由配备了 MIDI 的外部乐器产生的事件。该程序可能会使用计算机的内部合成器播放音乐表演,将其作为 MIDI 文件保存到磁盘上,或将其呈现为音乐符号。程序可以使用 MIDI 输出端口来播放外部乐器,或控制其他外部设备,例如录音设备。

下图说明了基于 Java Sound API 的可能的 MIDI 配置中主要组件之间的功能关系。 (与音频一样,Java Sound API 允许安装和互连各种 MIDI 软件设备.此处显示的系统只是一种可能的情况.)组件之间的数据流由箭头指示。数据可以是标准文件格式,也可以(如图右下角的键所示),可以是音频,原始 MIDI 字节或带有时间标记的 MIDI 消息。

以下上下文描述了此图。

可能的 MIDI 配置

在此示例中,应用程序通过将乐谱作为标准 MIDI 文件存储在磁盘上(图的左侧)来准备乐曲。标准 MIDI 文件包含音轨,每个音轨都是带有时间标签的 MIDI 事件的列表。大多数事件代表音符(音高和节奏)。读取此 MIDI 文件,然后由软件音序器“执行”。音序器通过将 MIDI 消息发送到其他设备(例如内部或外部合成器)来执行音乐。合成器本身可以读取声库文件,其中包含用于模拟某些乐器的声音的指令。如果不是,则合成器将使用已加载到其中的任何乐器声音来播放 MIDI 文件中存储的音符。

如图所示,在通过 MIDI 输出端口将 MIDI 事件发送到外部 MIDI 乐器之前,必须将 MIDI 事件转换为原始 MIDI(无时间标记)。类似地,从外部 MIDI 源(图中的键盘乐器)进入计算机的原始 MIDI 数据将转换为带有时间标记的 MIDI 消息,可以控制合成器或音序器可以存储以供以后使用。

服务提供商interface

javax.sound.sampled.spijavax.sound.midi.spi软件包包含 API,这些 API 使软件开发人员可以创建新的音频或 MIDI 资源,这些资源可以分别提供给用户并“插入”到 Java Sound API 的现有实现中。以下是可以通过这种方式添加的服务(资源)的一些示例:

  • 混音器

  • MIDI 合成器

  • 文件解析器,可以读取或写入新型音频或 MIDI 文件

  • 转换器,可在不同的声音数据格式之间转换

在某些情况下,服务是通往硬件设备(例如声卡)功能的软件interface,并且服务提供商可能与硬件供应商相同。在其他情况下,服务纯粹存在于软件中。例如,合成器或混频器可以是声卡上芯片的interface,或者可以完全不用任何硬件支持来实现。

Java Sound API 的实现包含一组基本服务,但是服务提供商interface(SPI)包允许第三方创建新服务。这些第三方服务以与内置服务相同的方式集成到系统中。 AudioSystem类和MidiSystem类充当协调器,使应用程序可以显式或隐式访问服务。通常,服务的存在对于使用该服务的应用程序是完全透明的。服务提供者机制使基于 Java Sound API 的应用程序用户受益,因为可以将新的声音功能添加到程序中,而不需要新版本的 JDK 或运行时环境,并且在许多情况下甚至不需要新的功能。释放应用程序本身。