声音的表示

声音 一节介绍了如何用函数和数据列表产生声音. 这里讨论的是如何在 Wolfram 系统中表示声音.

Wolfram 系统处理声音的方式与图形类似. 事实上,Wolfram 系统可以将声音和图形结合起来生成具有音轨的图片.

与图形类似,在 Wolfram 系统中声音用符号声音对象表示. 声音对象以 Sound 为头部,包含一列声音基元,依次代表着被演奏的声音.

Sound[{s1,s2,}]包含一列声音基元的声音对象

声音对象的结构.

声音 一节中讨论的函数 PlayListPlay 的返回值是 Sound 对象.

Play 返回一个 Sound 对象. 在适当的计算机系统中,它也产生声音.
In[1]:=
Click for copyable input
Out[1]=
Sound 声音对象包含一个基元 SampledSoundFunction,它用一个编译函数产生声音振幅的样本值.
In[2]:=
Click for copyable input
Out[2]//Short=
SampledSoundList[{a1,a2,},r]具有一系列振幅级,采样率为 r 的声音
SampledSoundFunction[f,n,r]采样率为 r,振幅级由函数 f 作用于 n 个连续整数得到的声音
SoundNote[n,t,"style"]具有指定风格,音符为 n,持续时间为 t 的类似于音符的声音

Wolfram 系统的声音基元.

在最底层,Wolfram 系统中的所有声音是由一系列振幅样本值或 MIDI 事件确定的. 在 SampledSoundList 中,这些振幅样本是在一个列表中明确给出的. 而在 SampledSoundFunction 中,振幅样本则是在输出声音时将指定的函数作用于一列整数变量而得到的. 在这两种情况下,所得到的振幅值必须在   之间. 在 SoundNote 中,一个音符样的声音是由代表着音频、持续时间、振幅和音符风格的一系列 MIDI 事件表示的.

ListPlay 生成基元 SampledSoundList,而 Play 生成 SampledSoundFunction 基元. 使用默认选项设置 Compiled->TruePlay 将生成包含一个 CompiledFunction 的对象 SampledSoundFunction.

一旦生成了包含各种声音基元的 Sound 对象,必须将其作为声音输出. 与图形很像,基本途径是把根据 Wolfram 系统对声音的表示,将其转换成 Wolfram 系统前端等外部程序能够处理的更低级形式.

Wolfram 系统使用的声音样本的低级形式是一系列表示振幅级的十六进制数字. 在 Wolfram 系统中,振幅级是由在   之间变化的近似实数表示. 在生成低级形式时,这些振幅级被量化. 可以使用选项 SampleDepth 来指定每个样本所使用的位数,默认值是 SampleDepth->8,它产生256种不同的振幅级,这对大多数情况是够用了. 基于音符的声音的低级形式是一个 MIDI 事件的时间量化的字节流,以此指定音符对象的各种参数. 时间的量化是在回放时自动决定的.

选项 SampleDepth 可以用在函数 PlayListPlay 中. 在声音基元中,可以通过用列表 代替采样率变量的方法来指定样本深度.