Nyquist
- 关于Nyquist及List编程的介绍
- 使用Nyquist编程
- 创建Nyquist插件
从1.1.1版本开始,Audacity允许你使用的奈奎斯特编程语言编写自己的效果插件。与VST和LADSPA插件不同,奈奎斯特插件可以用普通的文本编辑器,不需要进行编译。
Nyquist 由 Roger B. Dannenberg 编写,原计划作为一个完整的音频合成和分析语言,支持MIDI,音频录制和回放,文件输入/输出,面向对象编程、分析、调试等等。 Audacity 仅采用了 Nyquist 的一部分功能,让用户能用简单的 Nyquist 函数处理音频文件。Audacity不能使用 Nyquist 的调试代码, 如果你想写一个完整的插件,可以获取完整的Nyquist 并用它开发,然后将编好的插件加入Audacity。Nyquist 可以在 Carnegie Mellon University Computer Music Project(卡内基梅隆大学计算机音乐项目)获取到 :
下载完整版 NyquistNyquist 不但支持 Lisp 语法,还支持传统语法,称作SAL。 Audacity 1.3.8 版及之前的只支持 Lisp,但是现在的 Audacity 2.0 系列同时支持 Lisp 和 SAL。想要给Audacity写插件 ,请使用和你的Audacity版本对应的 Nyquist手册 和 推荐的语法:
- Nyquist 2.37版手册 -完全 使用 Lisp 语法
- Nyquist 3.0x 参考手册 - 最新的 Nyquist 手册(大多数使用 SAL 语法).
注意,仅为了给Audacity写个简单的脚本不需要下载 Nyquist 。所有使用Lisp需要的基础指南 和 2.37 手册都在下面。如果你也想探索SAL,以及了解最新版Nyquist的特性 请查看 Nyquist 文档 ,在 Wiki.
上Lisp
Nyquist 基于 Lisp。如果之前用过 Lisp 编程,你可以直接跳过这部分直接看 下一页。否则,请看下面的Lisp 简单介绍:
在 Lisp 中(Nyquist一样适用),全部用S表达式,即由一列标识符(字)组成,用空格分隔,括号围住。函数的名字始终是S表达式的第一个参数。这里有个简单的例子:
(setf area (* 3.14159 (expt radius 2)))
我们分解次啊这个例子。最外层的S表达式有三个参数。第一个setf,是函数的名字(代表设置字段set-field)。 setf 用于给变量赋值。 (还有其他类似的函数,像 set 和 setq,但是 setf 用处很大,之后的实例中采用了它) 。 setf 之后是 area,代表将要设置变量的名字。接下来是给变量赋值,在本例中用的是另一个S表达式(即,将另一个表达式的值赋给前面的变量)。
Lisp 没有针对数学函数的特殊运算符-所有运算符都和别的语言一样。使用 前缀 表示法,即函数名称(或运算)出现在参数前。在 Lisp 中用(* 3 7)代表 3 乘 7,而不是一般的 3*7 。在 Nyquist 里 expt (指数exponent) 函数将第一个参数作为底数,第二个作为指数得到幂。所以 (* 3.14159 (expt radius 2)) 代表 3.14159乘以 radius 的平方,或者圆的面积公式。
我们可以自定义函数以减轻工作,例如定义一个计算圆面积的函数,下次想用就可直接调用:
(defun circlearea (radius) (* 3.14159 (expt radius 2)))
defun 函数用于定于新函数。第一个参数是新函数的名字,在这个例子中是 circlearea。第二个参数是要定义的函数的参数-这是为数不多的S表达式不解释为调用的情况。最后的参数是函数的值。如果要计算半径为r的圆面积,只需计算:
(setf area (circlearea r))
S表达式只是一个列表的表达方式。Lisp用列表表示所有东西(LISP代表LISt Processing language),所以知道如何使用列表很重要。首先,学习将一串数字赋给一个变量。不能直接像下面那样做:
(setf mylist (1 2 3 4 5)) <-- error!
这样不能工作的原因是, Nyquist 解释S表达式时,它首先会将其看成一个函数,除非你加了别的参数。因为以(2 3 4 5)为参数,名为"1"的函数不存在,所以产生了错误。要让 Lisp 将S表达式作为普通文字而不是作为函数对待,可以将其quote起来。在Nyquist中,可通过在列表前加单引号将此列表quote,例如:
(setf mylist \'(1 2 3 4 5))
Nyquist 也提供一个 list 函数,可用它构造列表 - 在列表中某些元素是函数时很有用:
(setf mylist (list 1 2 3 4 (sqrt 25)))
要将某元素从列表里提出来,可用 first 和 rest函数。(传统上,这两个还被称作 car 和 cdr ,但是first 和 rest 更加好记,两种书写方式Nyquist 都支持。) (first mylist) 的输出结果为 1, (rest mylist) 的结果是列表 (2 3 4 5)。 所以列表的第二个元素可表示为 (first (rest mylist)) 。
Lisp函数参考
下面是可能用到的lisp函数列表。要获取完整的 Lisp / Nyquist 函数列表,查看 Nyquist 2.37版参考手册。
注意:Nyquist中符号(比如变量名和函数名)不区分大小写。它们最终都会被转为大写。
数学函数(Math functions)
(+ a b) | addition [加] |
(- a b) | subtraction [减] |
(* a b) | multiplication [乘] |
(/ a b) | division [除] |
(truncate a b) | round down to integer (floor) [向下取整] |
(float a b) | integer to floating-point [整数转为浮点数] |
(rem a b c ...) | remainder [取余数] |
(min a b c ...) | minimum [取最小值] |
(max a b c ...) | maximum [取最大值] |
(abs a) | absolute value [绝对值函数] |
(random n) | random integer between 1 and n-1 [随机数函数,生成1至n-1之间的正整数] |
(sin a b) | sine [正弦函数] |
(cos a b) | cosine [余弦函数] |
(tan a b) | tangent [正切函数] |
(expt a b) | exponent (a to the power of b) [幂函数] |
(sqrt a b) | square root [平方根函数] |
(< a b) | 测试 a 是否小于 b |
(<= a b) | 测试 a 是否等于或小于 b |
(> a b) | 测试 a 是否大于 b |
(>= a b) | 测试 a 是否大于等于 b |
(= a b) | 测试是否相等 |
(/= a b) | 测试是否不等 |
列表函数(List functions)
(first l) | 列表的第一个元素(car) |
(rest l) | 列表除第一个以外的元素(cdr) |
(reverse l) | 反转一个列表 |
(list a b ...) | 构造一个列表 |
(append l1 l2) | 追加两个列表 |
(length l) | 列表长度 |
(maplist function l) | 给列表中所有元素应用一个函数 |
控制语句(Control)
(if expr expr1 expr2) | 如果expr 成立,则计算expr1的值,否则计算expr2的值 |

