文本阅读:
58第3章音频与控制计算
例如,假设我们想重复地从一个波表中读出一段录制的声音,每秒钟读100次,那么以通常的采样速率就是每次读取441个样点。由于每64个样点分成一块,则在分块的边界处造成的舍入错误将会令回放的音高产生一个全音的失谐;即使在边界舍入时达到一个样点的精度,仍会造成高达0.2%即3个音分的改变。这种情况就需要"偶发-音频"转换中的亚样点精度了。
3.4把音频信号转换为数值控制流
有时候我们需要进行反方向的转换,把一个音频信号转换为一个偶发信号。为此,我们需要以某种方式提供一系列逻辑时刻(一个时间序列),以及一个音频信号。我们希望输出的结果是把该时间序列与从该音频信号中提取的数值结合起来。在需要用信号的取值作为控制计算的一部分时,我们需要这种操作。
举例来说,我们可能如示例A03.line.pd(第17页)中那样使用一个line~对象控制一个信号的幅度。假设我们希望以一个固定的速率而非一个固定的时间量来关闭该声音。比如,我们想让这个网络能够在其他声音上得到重复使用,并且想在不产生可闻人造声的前提下尽可能快地让声音静音;我们可能要让声音以斜变的方式变为静音,并且斜变的时间根据声音当前幅度而定:幅度较低时斜变时间也较短。为此,我们必须以当前输出的取值为基础计算出斜变至0的时间,并将其生成为一条消息发送给line~对象。这首先就需要把line~对象的输出(一个音频信号)"采样"成一个控制流。
与把偶发信号转换成音频信号时的情况一样,这里也有时间延时和准确程度的问题,并且同样也需要在直接性和准确性之间进行折中。如前文一样,假设我们正在计算的音频信号的块尺寸为4个样点,并且假设我们希望查看一个音频信号位于逻辑时刻6处的取值,并要用它改变另外一个音频信号的取值。如图3.2b所示,信号中最近被计算的数值的索引值为3,而我们的计算能够对信号产生最早影响的索引值为4。因此完成整个计算只需延时一个样点。
不过,我们不能确切选择是哪个样点--更新只能发生在一个块的边界处。
如前所述,我们能以直接性为代价换取时间准确度的提升。如果在执行"音频控制一音频"计算时确实在乎它究竟发生在哪个样点上,那么当读取样点的索引值为2时,更新将发生在索引值为6的样点上。这样一来,如果我们想要在逻辑时刻7处执行同样的动作,就需要读取索引值为3的样点,然后在索引值7处更新,依此类推。一般来说,如果块尺寸为B,则对于任意索引值n,我们总能读取位于索引值n-B处的样点,并对索引值n处的样点产生影响。因此在进行"音频一控制一音频"计算时有B个样点的来回延时,这就是想确切指定索引值n需要付出的代价。
如果希望能够进一步指定到一个样点的几分之几,那么(与以前一样)需要进行内插--这又会轻微地增加一些延时。一般来说,与"偶发-音频"转换一样,在大多数情况下