1 Nyquist内置函数-声音合成函数
1.1 行为
1.1.1 使用先前创建的声音
这些行为会获取一个声音,并根据环境对该声音进行转换。在编写代码将低级函数转换为高级函数,或者调用先前创建的声音时,这些行为非常有用:
- cue(sound) [SAL]
(cue sound) [LISP]
将*loud*
、来自*warp*
的起始时间、*start*
和*stop*
应用于sound
。 - cue-file(filename) [LISP]
(cue-file filename) [LISP]
与cue
功能相同,只是声音来自指定文件,文件中的样本会被强制转换为当前默认的*sound-rate*
采样率。 - sound(sound) [SAL]
(sound sound) [LISP]
将*loud*
、起始时间以及(可能连续变化的)来自*warp*
、*start*
和*stop*
的拉伸应用于sound
。 - control(sound) [SAL]
(control sound) [LISP]
与sound
完全相同,但按照惯例,当sound
是控制信号而非音频信号时使用。
1.2 声音合成
这些函数提供了有趣的音乐创作行为,能对环境做出反应;它们是Nyquist的 “单元生成器”:
- const(value [, duration]) [SAL]
(const value [duration]) [LISP]
以*control-rate*
创建一个常量函数。每个样本都具有给定值,默认持续时间为1.0。另请参见s-rest
,它等同于调用const
并传入零。还要注意,你可以将标量常量(数字)传递给sim
、sum
和mult
,在这些函数中它们的处理效率更高,而不是传递常量函数。 - env(t1 t2 t3 t4 l1 l2 l3 [dur]) [SAL]
(env t1 t2 t3 t4 l1 l2 l3 dur) [LISP]
创建一个4阶段包络。ti
是阶段i
的持续时间,li
是阶段i
的最终电平。t3
由dur
隐含,t4
为0.0。如果未提供dur
,则假定为1.0。包络持续时间是dur
、*stretch*
和*sustain*
的乘积。如果t1 + t2 + 2ms + t4
大于t1/t4
的持续时间,则返回包络的采样率为*control-rate*
。(有关更通用的分段线性函数生成器,请参见pwl
。)时间扭曲的效果是扭曲起始时间和结束时间。然后按照上述方法计算中间断点。 - exp-dec(hold, halfdec, length) [SAL]
(exp-dec hold halfdec length) [LISP]
这种凸包络形状是pwev
的一种特殊情况(请参见“分段逼近”部分 )。包络从1开始,在hold
秒内保持恒定。然后以halfdec
秒的半衰期衰减,直到length
秒(即总持续时间为length
秒)。换句话说,每halfdec
秒幅度减半。当拉伸时,此包络会线性缩放,这意味着保持时间增加,衰减时间也增加。 - force-srate(rate, sound) [SAL]
(force-srate rate sound) [LISP]
返回一个声音,其采样率根据rate
进行上采样或下采样。插值为线性插值,下采样时不应用预滤波,因此可能会出现混叠现象。另请参见resample
。 - lfo(freq [, duration, table, phase]) [SAL]
(lfo freq [duration table phase]) [LISP]
与osc
(如下)类似,只是它以*control-rate*
计算,频率以赫兹指定。初始相位phase
以度为单位指定,默认为零。不应用*transpose*
和*sustain*
。时间扭曲的效果是扭曲起始时间和结束时间。信号本身将具有恒定的未扭曲频率。 - fmlfo(freq [, table, phase]) [SAL]
(fmlfo freq [table phase]) [LISP]
一种低频振荡器,它以*control-rate*
计算,使用一个声音来指定随时间变化的频率(单位为赫兹)。初始相位是一个以度为单位的浮点数。结果的持续时间由sound
确定。 - maketable(sound) [SAL]
(maketable sound) [LISP]
假定sound
中的样本构成波形表的一个周期,然后返回一个适合osce
函数使用的波形表(请参见下方)。当前,表的样本数量限制为100,000,000个。此限制是在编译时由sound.h
中的常量max_table_len
设置的。波形表的形式为:
(sound pitch-number periodic)
其中,第一个元素是一个声音,第二个元素是声音的音高(这并非多余,因为声音可能表示任意数量的周期),第三个元素如果声音是一个周期的周期信号则为t
,如果声音是不应循环的样本则为nil
。波形表用于osc
、osc
、hzosc
、amosc
、fmosc
、lfo
和fmlfo
。 - build-harmonic(n, table-size) [SAL]
(build-harmonic n table-size) [LISP]
用于构建正弦波形表,此函数返回一个长度为table-size
样本的声音,其中包含n
个周期的正弦波。这些可以进行缩放和求和,以形成具有所需谐波成分的波形。有关示例,请参见“非正弦波形” 。这些谐波的缩放和可以传递给maketable
,以构建适合osc
和其他振荡器使用的波形表。 - control-warp(warp-fn, signal [, wrate]) [SAL]
(control-warp warp-fn signal [wrate]) [LISP]
使用函数复合将扭曲函数warp-fn
应用于signal
。如果省略wrate
,则使用线性插值。warp-fn
是从乐谱(逻辑)时间到实际时间的映射,signal
是从乐谱时间到实值的函数。结果是一个从实际时间到实值的函数,采样率为*control-rate*
。有关wrate
和高质量扭曲的解释,请参见sound-warp
。 - mult(beh1, beh2…) [SAL]
(mult beh1 beh2…) [LISP]
返回行为的乘积。参数也可以是数字,在这种情况下进行简单乘法运算。如果数字和声音混合,则使用scale
函数按数字缩放声音。当声音相乘时,结果的采样率是因子的最大采样率。 - prod(beh1, beh2…) [SAL]
(prod beh1 beh2…) [LISP]
与mult
相同。 - pan(sound, where) [SAL]
(pan sound where) [LISP]
根据where
(另一个行为或数字)对声音进行声像定位。sound
必须是单声道声音。where
可以是单声道声音(例如(ramp)
)或简单数字(例如0.5)。在这两种情况下,where
的取值范围应为0到1,其中0表示完全左声道,1表示完全右声道。对于中间值,每个声道的声音会进行线性缩放。目前,pan
不会仔细检查其参数。 - prod(beh1, beh2…) [SAL]
(prod beh1 beh2…) [LISP]
与mult
相同。 - resample(sound, srate) [SAL]
(resample sound srate) [LISP]
与force-rate
类似,但使用高质量插值进行预滤波和信号重建以达到新的采样率。此外,结果会按0.95缩放,以减少削波问题(另请参见sound-warp
)。 - scale(scale, sound) [SAL]
(scale scale sound) [LISP]
按因子scale
缩放sound
的幅度。与snd-scale
功能相同,只是它可以处理多声道声音。采样率、起始时间等信息取自sound
。 - scale-db(db, sound) [SAL]
(scale-db db sound) [LISP]
按因子db
(以分贝表示)缩放sound
的幅度。采样率、起始时间等信息取自sound
。 - scale-srate(sound, scale) [SAL]
(scale-srate sound scale) [LISP]
按比例因子scale
缩放sound
的采样率。这具有线性收缩或拉伸时间的效果(信号不会进行上采样或下采样)。这是snd-xform
的一种特殊情况(请参见“信号操作”部分 )。 - shift-time(sound, shift) [SAL]
(shift-time sound shift) [LISP]
将sound
按shift
秒进行时间偏移。如果声音为f(t)
,则结果为f(t - shift)
。见图5。这是snd-xform
的一种特殊情况(请参见“信号操作”部分 )。
图5:shift-time
函数根据其 shift
参数在时间上对声音进行偏移。
- sound-warp(warp-fn, signal [, wrate]) [SAL]
(sound-warp warp-fn signal [wrate]) [LISP]
使用函数复合将扭曲函数warp-fn
应用于signal
。如果可选参数wrate
被省略或为NIL
,则使用线性插值。否则,使用高质量样本插值,并按0.95缩放结果(以减少插值样本中可能超过输入信号峰值的值)。warp-fn
是从乐谱(逻辑)时间到实际时间的映射,signal
是从乐谱时间到实值的函数。结果是一个从实际时间到实值的函数,采样率为*sound-rate*
。另请参见control-warp
。如果wrate
不为NIL
,它必须是一个数字,指定warp-fn
的采样率。高质量重采样会减慢速度。(有关详细信息,请参见注释。)注意,高质量重采样比线性插值慢。要进行固定比例的高质量重采样(与sound-warp
中允许的可变比例重采样相对),请使用scale-rate
和stretch
,它们都采用warp-fn
的逆函数来从原始采样率恢复时间。此逆函数的每个样本都是一个乐谱时间;在这些乐谱时间对signal
进行求值,以产生任意输出。使用线性插值时,逆扭曲函数的采样率被视为输出采样率。然而,请注意,逆扭曲函数的样本存储为32位浮点数,因此它们的精度有限。由于这些浮点数表示样本时间,舍入可能会成为一个问题。在这种情况下,舍入等同于在样本时间添加抖动。Nyquist忽略此问题用于普通扭曲,但对于高质量扭曲,抖动不能被忽略。解决方法是使用双精度浮点数来最小化样本之间的抖动。sound-warp
线性插值此信号,具有降低精度的逆扭曲函数。采样率是一种折衷:低采样率可减少抖动,而高采样率更适合捕获详细信息(例如快速波动)。一个好的经验法则是,逆扭曲函数最多使用1,000到10,000个样本。例如,如果结果将是1分钟的声音,采样率为3000个样本/60秒 = 50个样本/秒。因为Nyquist没有关于如何为warp
函数提供逆函数的高级信息,所以必须将逆扭曲函数的样本率作为参数提供。如有疑问,只需尝试一下,用耳朵判断。 - integrate(signal) [SAL]
(integrate signal) [LISP]
计算signal
的积分。起始时间、采样率等信息取自signal
。 - slope(signal) [SAL]
(slope signal) [LISP]
计算signal
的一阶导数。起始时间、采样率等信息取自signal
。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.