Java 声音 API

javaobject oriented programmingprogramming更新于 2024/8/7 23:33:00

Java 声音是一组类和接口。它是一种低级 API,用于影响和控制声音媒体和乐器数字接口 (MIDI) 数据的输入和输出。它在一个促进可扩展性和灵活性的框架中,提供了对声音输入和输出通常所需的功能的明确控制。它由两个包组成,即 javax.sound.sampled 和 javax.sound.midi。

Java 声音 API 是为谁设计的?

Java 声音 API 满足了广泛应用程序开发人员的需求,因为声音是一个非常重要的组件。可能的应用领域包括 −

  • 通信框架,包括电话和会议

  • 提供用户生成内容的技术,例如媒体播放器和流媒体音乐

  • 交互式应用程序,例如游戏和动态生成的网站

  • 编辑和制作内容

  • 实用程序、设备和工具包。

其他接口与 Java Sound API 有何关系?

Java 平台通过 Java Sound API 提供最简单级别的声音功能。它非常灵活,使应用程序能够对声音操作进行广泛的控制。例如,Java Sound API 提供了设置、访问和修改系统资源的方法,包括音频混音器、MIDI 合成器、其他音频或 MIDI 设备、文件读取器和写入器以及声音格式转换器。

尽管 Java Sound API 没有附带高级声音编辑器或图形工具,但它确实为此类程序提供了构建块。除了最终用户通常预期的功能之外,它还强调低级控制。

其他 Java 平台 API 提供与声音相关的组件。Java 平台的更高级 API 是 Java Media Framework (JMF),它目前作为标准扩展提供。对于录制和播放基于时间的材料,JMf 定义了统一的架构、通信协议和编程接口。JMF 允许各种媒体类型(如音频和视频)之间的同步。

它为基础媒体播放器应用程序提供了更直接的解决方案。另一方面,Java Sound API 对于主要关注声音的程序非常有用,特别是当它们需要更复杂的功能(例如精确调节延迟音频播放或直接控制 MIDI 合成器的能力)时。

Java 3D API、电话 API 和 Vice API 是具有声音相关功能的附加 Java API。尽管不是必需的,但任何这些 API 的实现都可以在内部利用 Java Sound API 的实现。

Java Sound API 中的包

Java Sound API 支持数字音频和 MIDI 数据。这两个关键功能元素在不同的包中提供 -

  • javax.sound.sampled - 指定用于捕获、混合和播放数字音频的接口。

  • javax.sound.midi - 指定用于 MIDI 合成、排序和事件传输的接口。

什么是采样音频?

Java Sound API 还将数字音频数据称为采样音频。它由 javax.sound.sampled 包处理。信号是在一系列样本中捕获的。声波构成音频中的信号。模拟数字转换器将麦克风发出的声音信号产生的模拟电信号转换为采样的数字形式。下图描绘了一段简短的录音。

此处呈现的视觉表示告诉我们如何在数字系统中准确捕捉声音。具体来说,根据此图表描述 - 时间沿 X 轴和 Y 轴从左向右流动 - 音频级别对应于声压(振幅)。可见的红色数据点表示离散样本产生数字音频信号,这些数字音频信号每隔预定间隔定期捕捉模拟声波测量值,减慢每个峰值或波谷的速度,从而产生精确记录的数据点,以供分析,参考位于上方的 +ve 值和位于所述红线下方的 -ve 值,这为收集的数据赋予了重要意义。水平中心线表示零振幅。采样率决定了时间分辨率,量化或振幅分辨率决定了用于表示每个样本的位数。为了进行比较,存储在紧凑型 CD 上的音频以每秒 44,100 个样本的速率进行采样,每个样本表示 16 位。

这里使用短语"采样音频"相当宽泛。声波可以以模拟形式保存,并定期采样。但是,Java Sound API 将"采样音频"视为与"数字音频"相同。

通常,计算机上的采样音频取自录音,尽管声音也可能是人工产生的(例如,模拟按键式电话噪音)。"采样音频"一词描述的是数据类型,而不是数据来源。

音频配置

Java Sound API 旨在允许在系统上安装多种类型的音频组件,并由 API 访问;它不预先假定特定的音频硬件设置。Java Sound API 支持标准功能,包括混合多个音频流以及声卡的输入和输出(例如,用于录制和播放声音文件)。这是一个典型的音频架构图 −

在此图中,混音由程序提供,并通过具有多个输入和输出端口的设备(例如声卡)完成。数据可以从文件中读取,通过网络传输,由应用程序即时创建或由 MIDI 合成器合成并发送到混音器。

(稍后将介绍的 javax.sound.midi 包为合成器提供了 Java 语言接口)。混音器从其所有音频输入创建的单个流可以传输到输出设备进行渲染。

什么是 MIDI?

MIDI 数据可以看作是产生声音(尤其是音乐声音)的配方,而不是采样音频,后者是声音本身的直接描述。与音频数据不同,MIDI 数据并不直接描述声音。相反,它谈论的是影响合成器产生的声音的事物。图形用户界面的键盘和鼠标事件与 MIDI 数据相当。

对于 MIDI,事件可以与键盘操作以及不同踏板、滑块、开关和旋钮上的键盘操作进行比较。这些活动并不总是需要从物理乐器开始,它们可以在软件中模拟并保存为 MIDI 文件。音序器是一个可以生成、修改和执行这些文件的程序。音序器可以将其 MIDI 事件传送到许多计算机声卡中的 MIDI 可控音乐合成器电路。

此外,合成器可以完全在软件中实现。合成器通过解释接收到的 MIDI 信号来生成音频输出。与语音相比,MIDI 数据通常用于创建音乐声音。使用 MIDI 合成器也可以产生不同的声音效果。

MIDI 配置

下图描绘了基于 Java Sound API 的潜在 MIDI 配置的关键元素之间的功能链接。(与音频一样,Java Sound API 支持安装和连接一系列 MIDI 软件设备。一种可能的情况是上面显示的设置)。箭头显示数据在组件之间移动的方向。信息可能采用通用文件格式,如图右下角的图例所示。

在此图中,应用程序加载以通用 MIDI 文件形式保存在磁盘上的乐谱(图左侧),以准备音乐表演。典型 MIDI 文件中的每个音轨都是带有时间标记的 MIDI 事件的集合。大多数事件都类似于音符(音高和节奏)。软件音序器读取此 MIDI 文件,然后"演奏"它。将 MIDI 数据发送到另一个设备(例如内部或外部合成器)可让音序器执行其音乐。合成器本身可以读取包含模拟某些乐器声音的指令的声音库文件。如果没有,合成器将使用当前加载到合成器中的任何乐器声音来播放 MIDI 文件中指定的音符。

使用 Java Sound API 的示例

这些都是由 Java Sound API 解决的 -

SEQUENCER >> SEQUENCE >> TRACK >> MIDI EVENTS

方法

  • 步骤 1 - 获取一个音序器,然后启动它

// 创建一个名为 play 的音序器并打开它
Sequencer play = MIDISystem.getSequencer():
play.open();
  • 步骤 2 − 创建新序列

// 创建新序列
Sequence seq = new Sequence (Sequence.PPQ, 4);
  • 步骤 3 − 获取序列中的新轨道

// 创建新轨道
Track t = seq.createTrack();
  • 步骤 4 − 将 MIDIEVENTS 放入整个音轨中

// 使用 MIDIEVENTS 归档音轨并
// 将序列提供给序列器

t.add(myMIDIEvent1);
play.setSequence(seq);

// 使用 start 播放
play.start();

示例

// Java 程序说明 Java 声音 API

import javax.sound.midi.*;
public class Example {

   public static void main (String [] args) {
      Example minimusic = new Example ();
      minimusic.play();
      System.out.print("Successfully compiled and executed");
   }

   // Method 2
   public void play() {
      try {
         Sequencer player = MidiSystem.getSequencer();
         play.open();

         Sequence seq = new Sequence(Sequence.PPQ, 4);
         Track track = seq.createTrack();
         ShortMessage a = new ShortMessage();
         a.setMessage(144, 1, 44, 100);

         MidiEvent noteOn = new MidiEvent(a, 1);
         track.add(noteOn);

         ShortMessage b = new ShortMessage();
         b.setMessage(128, 1, 44, 100);
         MidiEvent noteOff = new MidiEvent(b, 16);
         track.add(noteOff);

         play.setSequence(seq);

         play.start();
      }

      catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

输出

Successfully compiled and executed

结论

Java Sound API 是一种低级 API。它用于影响和控制声音媒体和 MIDI 数据的输入和输出。它提供对功能的明确控制。该软件包可满足各种应用程序开发人员的需求。它有两个软件包,分别是 javax.sound.sampled 和 javax.sounds.midi。


相关文章