2008-11-05 17:03

声明Java Sound教程系列属于Sun MicrosystemJava Tutorials,由kingmmxtj2008115日开始翻译,并将在http://hi.baidu.com/kingmmxtj上发布。译者尊重Sun的权利,仅仅把文章用于学习交流。转贴请保留,谢谢!

原文地址http://java.sun.com/docs/books/tutorial/sound/index.html

什么是MIDI

javax.sound.midi包包含传输和序列化MIDI事件的APIs,及从以上事件合成的APIs

相对于采样音频是其声音自身的一种直接描述,MIDI数据可以被认为是产生声音,特别是乐器声音的方法。MIDI数据,不像音频数据,不对声音进行直接描述。相反,MIDI数据描绘的是事件(events),这些事件影响了由支持MIDI的设备或乐器(像合成器)所产生的声音(或者动作)。MIDI数据与一个图形用户接口键盘或者鼠标事件相似。在MIDI里,事件可以被理解为对音乐键盘的各种动作,包括对该乐器设备上踏板的踩踏(pedal)、弦的滑动、开关打开关闭、按钮的旋转。这些事件不必需要相应的硬件设备来相应;他们可以有软件来模拟然后被存储在MIDI文件里。一个能创建、编辑、播放上述文件的程序称为序列器(sequencer)。许多电脑声卡包含MIDI控制音乐合成器芯片,而序列器将把MIDI事件发送给这些芯片。合成器也可以由软件完全实现。合成器解释他们收到的MIDI事件并产生音频输出。通常从MIDI数据中合成的声音是乐器声音(例如相对于语音信号)。MIDI合成器也能产生各种声音效果。

某些声卡包含MIDI输入和输出端口,通过这些端口外部的MIDI硬件设备可以连接(像键盘合成器或其他乐器)。从一个MIDI输入端口,一个应用程序可以接受外部MIDI音乐设备产生的事件。该程序可能用电脑内部的合成器来播放该乐器的演奏、把该事件保存为MIDI文件放在磁盘上、或者作为音乐注释文件来传递。一个应用程序可能会实用一个MIDI输出端口来播放外部乐器,或者控制其他外部设备,像录音设备。

下图描绘了基于Java Sound API下,某个可能的MIDI配置中,各个主要组件的功能关系。(与音频相似,Java Sound API允许不同的MIDI软件设备安装和连接,该图所示的系统仅仅是一个假想情景。)箭头表示了组件之间数据的流向。数据可以来自一个标准文件格式、或者(由右下角的key图所标识),来自音频、原始MIDI字节、或者时间标记的MIDI信息。

一个可能的MIDI配置

在该例中,应用程序通过加载存储在硬盘上的标准MIDI文件作为一个音乐记录来准备该乐器演奏(图左处)。标准MIDI文件包含了多轨(track),每一轨是一个时间标记MIDI事件的列表。大部分事件代表这乐曲的注释(调子和节奏)。该MIDI文件被读取,然后被软件序列器所“演奏”。序列器通过发送MIDI信息给其他设备来演奏曲目,像内部或外部的合成器。合成器自己可能会读取一个包含仿真某种乐器音色指令的音色库(soundbank)文件。如果没有读取,合成器将用任意已加载的音色指令来播放MIDI文件中的乐曲注释。

如上所述,MIDI事件在被送到MIDI输出端口的外部MIDI乐器之前必须转化为原始(非时间标记)MIDI。同样,从外部MIDI源(如图中的一个键盘乐器)进入电脑的原始MIDI数据必须被转化为时间标记MIDI信息,该信息进而能控制合成器,或者被序列器存储以背后用。

服务提供者接口(Service Provider Interfaces

javax.sound.sampled.spijavax.sound.midi.spi包包含了让软件开发者创建信音频或者MIDI源的APIs,而这些新的音频和MIDI源可以作为一个已存在的Java Sound API实现的“插件”(plugged in)而被单独提供。这里有一些添加服务(源)途径的例子:

l         一个音频混频器

l         一个MIDI合成器

l         一个能读取或写如一种新的音频格式文件或者MIDI文件的文件分析器

l         一个能转换不同声音数据格式的转换器

在某些情况下,服务是软件接口针对硬件设备功能的,像声卡,所以服务的提供者可能就是硬件设备厂商。在另外一些情况下, 服务纯粹以软件存在。例如,一个合成器或者混频器可以是针对声卡上芯片的接口,或者不依赖任何硬件支持来实现。

一个Java Sound API实现包含了基本服务集,然而SPI包允许第三方来创建新的服务。这些第三方的服务像内置服务一样被集成进系统。AudioSystem类和MidiSystem类扮演协调者的角色,使应用程序能显式或隐式的访问服务。通常现存的服务对于实用他们的应用程序来时是完全透明的。这种服务提供机制为建立基于Java Sound API的应用程序开发者提供益处,因为新的特性可以被加入到程序而不需要一个新版本的JDK或者JRE,而且,在多数情况下,甚至不需要重新编译该应用程序本身。


台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()