文本阅读:
6.5示例139
过了由cos~对象定义的正半周。
口
bell-curve
在bbl
品tl(
EF1
【611999 tff日
expr($f1-100)/25|
lexpr exp(-$f1*sf1)
tabwrite bell-curvel
【6.18 为图6.17填写波表
半正弦的幅度随后被调制指数(就是带宽商数0。/o)所调整。波表("bell-curve【钟形曲线】")存储的是一个非归一化的高斯曲线,其范围为-4到4,采样点为200个(每个单位25个样点),因此波表的中央(样点100)对应的是钟形曲线的中央谱峰。在-4到4区间之外,高斯曲线的取值很小,可以忽略不计。
图6.18所示为如何准备该高斯波表。这里需要一个新的控制对象:
【until:当左输入口即"开始"输入口接收到"bang"消息时,它将反复地按顺序输出多个"bang"消息(在各个bang消息之间没有经行时间),直到右输入口即"停止"输入口接收到"bang"消息为止。用于停止的"bang"消息必须以某种方式由until~对象的输出口发起;否则,输出口将一直发送"bang"消息,逼走可能打断循环的任何对象。
在本例中,由一个until对象驱动的循环从0计数到199,包含端点在内。循环的计数由"f"和"+1"对象维护,两者相互将输出馈送给对方。但由于"+1"对象的输出进入到
"f"的右输入口,因此其结果(大于1)将在"f"下一次接收到"until"的bang消息时才会出现在"f"处。这样,来自"until"的每个"bang"消息都会让数值增加1。
循环以何种顺序开始是有关系的:上部的"tbb"对象(即"trigger【触发】bang bang"
的缩写)必须先发送0给"f",即对其进行初始化,然后再设置until对象让它发送"bang"消息,让数值开始递增,直到被停止。为了当数值达到199时让其停止,由一个select对象检查该数值,当它看到两者匹配时,就向until对象的"停止"输入口发送"bang"消息。
其间,对于由"f"对象产生的每个在0到199之间的数字,我们创建一个有序消息对发送给tabwrite对象。第一个消息就是指数本身,从0到199,它被送到右输入口。然后对于左输入口,第一个expr对象把指数调整至-4到4区间(之前位于0到199之间),然后第二个expr 对象计算出高斯函数的值送到左输入口。
在该音色中,我们没有完全解决在适当的时间对中心频率商数进行更新的问题。只要载