Java Sound API


Java Sound API是一组类和接口。它是一个低级API,用于影响和控制声音媒体和MIDI(Musical Instrument Digital Interface,乐器数字接口)数据的输入和输出。它提供对通常需要的声卡输入和输出功能的显式控制,在一个促进可扩展性和灵活性的框架中。它包含两个包:javax.sound.sampled和javax.sound.midi。

Java Sound API是为谁设计的?

Java Sound API满足广泛的应用程序开发人员的需求,因为声音是一个至关重要的组成部分。可能的应用领域包括:

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

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

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

  • 内容编辑和制作

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

其他接口如何与Java Sound API相关?

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

虽然Java Sound API不包含高级声音编辑器或图形工具,但它确实提供了此类程序的构建块。它强调低级别控制,这超出了最终用户通常的预期。

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

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

Java 3D API、电话API和视频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轴 - 音频级别对应于声压(振幅)。可见的红色数据点表示离散样本,产生捕获模拟声波测量的数字音频信号,以预定间隔定期减慢每个波峰或波谷,从而产生精确记录的数据点,以便参考位于红色线上方和下方的正值和负值进行分析,赋予收集的数据意义。水平中心线表示零振幅。采样率决定时间的精度,量化或振幅的精度决定用于表示每个样本的位数。作为比较,存储在紧凑型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 - 获取排序器,然后启动它

// make a sequencer named play and open it 
Sequencer play = MIDISystem.getSequencer():
play.open();
  • 步骤2 - 创建一个新的序列

// make a new sequence
Sequence seq = new Sequence (Sequence.PPQ, 4);
  • 步骤3 - 在序列中获取一个新的音轨

// creating a new track
Track t = seq.createTrack();
  • 步骤4 - 在音轨中放置MIDIEVENTS

// filing the track with MIDIEVENTS and
// giving the Sequence to the Sequencer

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

// play it using start
play.start();

示例

// Java Program to Illustrate Java Sound 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。

更新于:2023年8月1日

浏览量:632

开启您的职业生涯

完成课程,获得认证

开始学习
广告