1 Nyquist内置函数-杂项函数
1.1 杂项函数
这些函数对于日常使用来说都是安全且推荐的。
1.1.1 to-mono(sound) [SAL]
(to-mono sound) [LISP]
如果 sound
是多声道声音,返回其所有声道的总和;如果 sound
本身就是单声道声音,则直接返回,不做改变。有关声道求和的更多详细信息,请参见 sim
(“组合与时序结构”部分 )。
; 假设已有一个多声道声音对象multi_channel_sound
(setq mono_sound (to-mono multi_channel_sound))
; 此时mono_sound就是转换后的单声道声音,可进行后续处理,比如播放等操作
1.1.2 db-to-linear(x) [SAL]
(db-to-linear x) [LISP]
将 x
从分贝转换为线性值。0dB 转换为 1,20dB 表示线性因子为 10。如果 x
是声音,会对每个样本进行转换并返回一个声音;如果 x
是多声道声音,每个声道都会进行转换并返回一个多声道声音(数组)。注意:对于声音,转换仅对实际样本进行,不对声音起始前和结束后的隐式零值进行转换。采样率、起始时间等信息取自 x
。
1.1.3 db-to-vel(x [, float]) [SAL]
(db-to-vel x [float]) [LISP]
使用将 -60dB 映射到 1 且 0dB 映射到 127 的规则,将 x
从分贝转换为 MIDI 速度。MIDI 速度与幅度的平方根成线性关系。float
的默认值为 nil
,结果是一个截断在 1 - 127 合法范围内的定点数;但如果提供了非 nil
值,则结果是一个不进行舍入或截断的浮点数。输入参数必须是定点数或浮点数,不允许是声音。
1.1.4 follow(sound, floor, risetime, falltime, lookahead) [SAL]
(follow sound floor risetime falltime lookahead) [LISP]
一种用于压缩器和限制器功能的包络跟随器,旨在生成一个平滑信号,跟随输入信号的峰值。该函数的基本目标是产生一个代表均方根(RMS)测量幅度的平滑信号。输入的第一个参数是低采样率控制速率信号(表示局部RMS测量)。floor
是最小输出值;risetime
是输出从 floor
上升到 1.0 所需的时间(秒);falltime
是输出从 1.0 下降到 floor
所需的时间(秒);lookahead
是提前查看峰值并提前开始下降的时间(秒)。算法按以下方式工作:根据 lookahead
的值预测输出信号的变化量,根据 risetime
增加,根据 falltime
减少。如果下一个输入样本在该范围内,该样本即为输出。如果下一个输入样本太大,算法会回溯到下一个必要样本,计算一个包络样本,使其上升到 risetime
以达到新值。算法只会在 lookahead
的范围内回溯。如果回溯不够,就会进行最终的前向传递,计算一个上升信号,至少与输入信号一样快,直到与输入信号相交。如果输入信号下降速度比 falltime
指示的速度快,输出下降速率将受 falltime
限制,当输出达到 floor
时停止下降。该算法在输入急剧上升时可能需要对缓冲区进行两次遍历,所以速度不是特别快。使用短缓冲区和低采样率时,这一点会更明显。有关相关帮助生成低采样率输入的函数,请参见 snd-avg
,关于相关滤波器,请参见“滤波器”部分 。
1.1.5 gate(sound, lookahead, risetime, falltime, floor, threshold) [SAL]
(gate sound lookahead risetime falltime floor threshold) [LISP]
生成一个用于噪声门的指数上升和下降包络。当信号下降到 threshold
以下且持续时间超过 lookahead
(以秒为单位的浮点数)时,衰减开始。(信号在越过 threshold
时开始下降,而不是在 lookahead
之后。)衰减持续进行,直到值达到 floor
(一个浮点数),此时衰减停止,输出值保持恒定。在信号越过 threshold
之前,每个持续时间(衰减)或在衰减停止时(如果信号再次超过 threshold
),输出值将在信号越过 threshold
时上升到 1.0。由于内部提前查看,信号实际上在越过 threshold
之前就开始上升。上升是恒定速率的指数变化,设置为从 floor
上升到 1.0 的时间为 risetime
。类似地,下降也是恒定速率的指数变化,从 1.0 下降到 floor
的时间为 falltime
。
1.1.6 noise-gate(sound [, lookahead, risetime, falltime, floor, threshold] [, rms: use-rms, link: link-option]) [SAL]
(noise-gate sound [lookahead risetime falltime floor threshold] [rms: use-rms:link link-option]) [LISP]
一种基于门的简单噪声门实现。除 snd
外,所有参数都是可选的,默认值为 lookahead: 0.5
,risetime: 0.02
,falltime: 0.5
,floor: 0.01
,threshold: 0.01
。关键字参数 :rms
和 :link
也是可选的,默认值分别为 use-rms: NIL
(假)和 link-option: T
(真)。结果是输入声音,根据上述阈值段进行衰减。注意:无论是否使用 use-rms
,都会从声音的所有声道计算一个最大值,并用于控制噪声门。如果 link-option
不为 NIL
,且输入声音是多声道的,则会计算并应用一个单一的门到所有声道。如果噪声门的阈值被任何声道超过,噪声门就会打开(即无论是否使用 use-rms
,都会从所有声道计算一个最大值,并用于控制噪声门)。
1.1.7 hz-to-step(freq) [SAL]
(hz-to-step freq) [LISP]
返回 freq
(以赫兹为单位,也可以是一个声音)对应的音阶步数,结果与参数类型相同。另请参见 step-to-hz
(如下)。
1.1.8 linear-to-db(x) [SAL]
(linear-to-db x) [LISP]
将 x
从线性值转换为分贝值。1 转换为 0,0 转换为 -INF(一种特殊的IEEE浮点值)。因子 10 表示 20dB 的变化。如果 x
是声音,会对每个样本进行转换并返回一个声音;如果 x
是多声道声音,每个声道都会进行转换并返回一个多声道声音(数组)。注意:对于声音,转换仅对实际样本进行,不对声音起始前和结束后的隐式零值进行转换。采样率、起始时间等信息取自 x
。
1.1.9 linear-to-vel(x [, float]) [SAL]
(linear-to-vel x [float]) [LISP]
使用将 -60dB 映射到 1 且 0dB 映射到 127 的规则,将 x
从线性幅度转换为 MIDI 速度。MIDI 速度与幅度的平方根成线性关系。float
的默认值为 nil
,结果是一个截断在 1 - 127 合法范围内的定点数;但如果提供了非 nil
值,则结果是一个不进行舍入或截断的浮点数。输入参数必须是定点数或浮点数,不允许是声音。
1.1.10 log(x) [SAL]
(log x) [LISP]
计算 x
(一个浮点数)的自然对数。(有关对信号进行操作的版本,请参见 s-log
。)
1.1.11 set-control-srate(rate) [SAL]
(set-control-srate rate) [LISP]
通过设置 *default-control-rate*
并重新初始化环境,将控制信号的默认采样率设置为 rate
。在任何合成函数中请勿调用此函数(请参见“控制速率绝对值转换”部分 )。
1.1.12 set-sound-srate(rate) [SAL]
(set-sound-srate rate) [LISP]
通过设置 *default-sound-rate*
并重新初始化环境,将音频信号的默认采样率设置为 rate
。在任何合成函数中请勿调用此函数(请参见“声音速率绝对值转换”部分 )。
1.1.13 set-pitch-names() [SAL]
(set-pitch-names) [LISP]
初始化音高变量(c0
,cs0
,d0
,ds0
,…,b0
,c1
,…,b7
)。A440(默认调音)由音阶步数 69.0 表示,因此变量 a4
(第四八度的A)设置为 69.0。你可以通过将 *A4-Hertz*
设置为一个值(以赫兹为单位)并调用 set-pitch-names
来重新初始化音高变量,从而改变调音。请注意,这将导致非整数音阶步数值,它不会拉伸或映射音分的值到频率。没有内置的规定用于处理非十二平均律音阶,但用户可以编写或计算任何所需的分数音阶步数值。
1.1.14 step-to-hz(pitch) [SAL]
(step-to-hz pitch) [LISP]
返回 pitch
(一个音阶步数或表示随时间变化的音阶步数的声音类型)对应的赫兹频率。如果 pitch
是一个数,结果是一个浮点数;如果 pitch
是一个声音,结果是一个声音。另请参见 hz-to-step
(如上)。
1.1.15 get-ioi(dur) [SAL]
(get-ioi dur) [LISP]
获取从局部时间 0 开始到局部时间 dur
结束的某事物的时间间隔。为方便起见,*rslt*
设置为对应局部时间 0 的全局时间。请注意,在此计算中不考虑 sustain
。目的是计算序列中当前事件之后下一个事件的标称起始时间(即考虑当前事件的逻辑停止时间,而不是实际持续时间)。
1.1.16 get-duration(dur) [SAL]
(get-duration dur) [LISP]
获取从局部时间 0 开始到局部时间 dur
结束的某事物的实际持续时间,计算时考虑 sustain
。为方便起见,*rslt*
设置为对应局部时间 0 的全局时间。另请参见 get-ioi
(如上)。
1.1.17 get-loud() [SAL]
(get-loud) [LISP]
获取 *loud*
环境变量的当前值。如果 *loud*
是一个信号,则在局部时间 0 对其求值并返回一个数(浮点数)。
1.1.18 get-sustain() [SAL]
(get-sustain) [LISP]
获取 *sustain*
环境变量的当前值。如果 *sustain*
是一个信号,则在局部时间 0 对其求值并返回一个数(浮点数)。
1.1.19 get-transpose() [SAL]
(get-transpose) [LISP]
获取 *transpose*
环境变量的当前值。如果 *transpose*
是一个信号,则在局部时间 0 对其求值并返回一个数(浮点数)。
1.1.20 get-warp() [SAL]
(get-warp) [LISP]
获取与 *warp*
环境变量当前值对应的函数。为提高效率,*warp*
存储为三个部分的表示:shift
、scale
因子和一个连续的扭曲函数。get-warp
检索一个将逻辑时间映射到实际时间的信号,该信号将 *warp*
的三个部分的信息组合成一个单一信号。如果连续的扭曲函数部分不存在(这表明时间扭曲主要是 at
和 stretch
变换的简单组合),则不会引发错误。此函数主要供内部使用。将来,get-warp
可能会重新实现,始终返回一个信号且不会引发错误。
1.1.21 local-to-global(local-time) [SAL]
(local-to-global local-time) [LISP]
根据当前环境将乐谱(局部)时间转换为实际(全局)时间。
1.1.22 round(x) [SAL]
(round x) [LISP]
将 x
四舍五入到最接近的整数。如果 x
为 n + 0.5
,其中 n
是整数,则返回 n + 1
,即使 n
为负数。
1.1.23 snd-set-latency(latency) [SAL]
(snd-set-latency latency) [LISP]
将Nyquist播放声音时请求的延迟设置为 latency
(一个浮点数),返回先前的值。默认值为 0.3 秒。为避免出现杂音,延迟应大于垃圾回收和消息打印所需的时间,以及Nyquist外部的其他系统活动时间。
1.1.24 vel-to-db(x) [SAL]
(vel-to-db x) [LISP]
使用将MIDI速度 1 映射到 -60dB 且 127 映射到 0dB 的规则,将 x
从MIDI速度转换为分贝值。幅度与MIDI速度的平方成正比。输入 x
可以是定点数或浮点数,但不能是声音,结果是一个浮点数。
1.1.25 vel-to-linear(x) [SAL]
(vel-to-linear x) [LISP]
使用将MIDI速度 1 映射到 -60dB(0.001)且 127 映射到单位增益的规则,将 x
从MIDI速度转换为线性幅度比。幅度与MIDI速度的平方成正比。输入 x
可以是定点数或浮点数,但不能是声音,结果是一个浮点数。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.