Nyquist内置函数-声音合成函数

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 并传入零。还要注意,你可以将标量常量(数字)传递给 simsummult,在这些函数中它们的处理效率更高,而不是传递常量函数。
  • 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 的最终电平。t3dur 隐含,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。波形表用于 oscoschzoscamoscfmosclfofmlfo
  • 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]
    soundshift 秒进行时间偏移。如果声音为 f(t),则结果为 f(t - shift)。见图5。这是 snd-xform 的一种特殊情况(请参见“信号操作”部分 )。
    在这里插入图片描述

图5shift-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-ratestretch,它们都采用 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值