2.9.18 声音的表示1.9.13 节介绍了用函数和数据产生声音,这一小节讨论 Mathematica 中声音的表示. Mathematica 处理声音的方式与图形类似,事实上,Mathematica 可以将声音和图形结合起来产生 "声道圈". 与图形类似,声音在 Mathematica 中用符号声音对象表示. 声音对象有头部声音, 包括一个声音基元集合,该基元构成了演奏的声音序列. 声音对象的结构 在 1.9.13 节中讨论的函数 Play 和 ListPlay 的返回值是 Sound 对象. Play 返回一个声音对象,在合适的计算机系统中,它也产生声音
Out[1]= |  |
这个 Sound 对象含有一个 SampledSoundFunction 基元,它用一个编译函数产生声音振幅的样本值
Out[2]//Short= |  |
Mathematica的声音基元 在最低层,Mathematica 的声音是由一系列振幅样本值确定的. 在 SampledSoundList 中,这些振幅是在一个集合中直接给出的. 在 SampledSoundFunction 中,振幅是在输出声音时将指定的函数作用于一列整数变量而得到的. 在这两种情况下,所得到的振幅值必须在 -1和 1 之间. ListPlay 产生 SampledSoundList 基元,而 Play 则产生 SampledSoundFunction 基元,在默认设置 Compiled->True下, Play 将产生一个包含 CompiledFunction 的 SampledSoundFunction 对象. 在产生包含各种声音基元的 Sound 对象后,就需要将它作为声音输出. 与图形类似,基本方案是把声音表示转换成Mathematica 笔记本前端等 外部程序能够处理的低级形式. 声音的低级形式是一系列表示振幅的十六进制数字. 在 Mathematica 中, 振幅大小是由在 -1 和 1之间变化的近似实数表示.在生成低级形式时,这些振幅 值被 "量子化". 可以用选项 SampleDepth 来指定每个样本中使用的二进制位数, 默认值是 SampleDepth->8,它产生 256 种不同的振幅,这对大多数情况是够用了. 选项 SampleDepth 可以用在函数 Play, ListPlay 和 PlaySound 中. 在声音基元中,可以通过用列表 代替抽样速率变量的 方法来指定样本深度. 在 Mathematica 中可以把声音和图形结合起来,所以其低级形式不应当冲突. 像 2.9.14 节中讨论的一样,所有图形用PostScript 产生. 声音也是以特定的 PostScript 函数产生, 在不支持声音输出设备上它就被 PostScript 编译器忽略. 将声音输出到一个流中 Mathematica 用同一函数 Display 输出声音, 图形或二者的结合. 在 Play, ListPlay 和 Sound 中,选项 DisplayFunction 确定声音最终怎样输出,该选项的默认值是变量$SoundDisplayFunction. 一般这是调用 Display 的合适设置.
|