从版本1.1.1开始,Audacity允许用户使用Nyquist编写一些音频处理插件。不同于VST(Virtual Studio Technology)和LADSPA(Linux Audio Developer's Simple Plug-in API )插件,Nyquist可以用任何编辑器编写,并且不需要编译。在Mac上,Audacity还支持Audio Unit插件。
Nyquist由Roger B. Dannenberg编写的,设计用于合成处理音频的一种领域语言,它支持MIDI,录音回放,文件I/O,OO等。Audacity使用了Nyquist的部分功能,允许你对音频数据进行一些简单的Nyquist操作。Audacity没有提供Nyquist的调试支持,如果你想编写一个复杂的插件,最好使用完整版本的Nyquist进行编写,然后转成Audacity的插件。完整版的Nyquist的地址如下。
CMU Computer Music Project Software (卡内基梅隆大学大学的计算机音乐项目)
Nyquist支持类Lisp语法和传统的SAL语法。Audacity 1.3.8之前的版本只是支持Lisp,后面的版本同时支持Lisp和SAL。如果要编写Audacity插件,可以选择下面合适的手册:
Nyquist version 2.37 Manual – 完全是Lisp语法
Nyquist 3.0x Reference Manual – 最新的Nyquist手册,大部分使用的是SAL语法
Lisp
Nyquist是基于Lisp的。如果你使用过Lisp,可以完全忽略本节。本节简单介绍一下Lisp。
在Lisp中,一切都是S表达式,它是包含在圆括号之内的,由空格分隔的一些列标识符构成。函数的名字一定在S表达式的第一个标识符位置,其他的标识符都是这个函数的参数。下面是一个简单的实例:
(setf area (* 3.14159 (expt radius 2)))
外层的S表达式有3个成员。第一个是setf,是一个赋值到变量的函数(还有其他的赋值函数,比如set和setq)。Setf之后是area,它是需要赋值的变量。最后一个同样是一个S表达式,将它计算的结果赋值给area。
Lisp没有专门为数学计算提供的特殊操作,所有的都是函数。Lisp使用的是前缀表达式,函数在参数之前。因此3*7要写作(* 3 7)。Nyquist中,expt计算第一个参数在第二个参数次方,因此(* 3.14159 (expt radius 2))的意思就是将3.14159乘以radius的平方。
我们可以定义函数来实现一些公共操作:
(defun circlearea (radius) (* 3.14159 (expt radius 2)))、
Defun函数用来定义新的函数。第一个参数是函数的名字,第二个参数是参数列表,第三个参数是定义的函数的值,也就是函数真正的执行体。现在如果你想计算一个半径为r的的园的面积,直接调用函数即可:
(setf area (circlearea r))
一个S表达式仅仅表述一个列表,Lisp使用列表表示任何东西。LISP的名字来源于LISt Processing language。这有助于帮助我们理解Lisp对列表的操作。你不能像下面操作列表:
setf mylist (1 2 3 4 5)) <-- error!
因为,Nyquist看到一个S表达式,它就试图把它当做函数处理。因为每一个名为“1”并且带有4个参数的函数,Lisp将会报错。你需要告诉Lisp,你想把一个S表达式当做文本来处理,而不是函数,给它加上引号即可。在Nyquist中,只需要在它前面加上单引号即可。
(setf mylist \'(1 2 3 4 5)) ;\为转义
Nyquist也提供了一个list函数来构造一个列表。如果一些列表元素是函数的时候,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/Nyquist函数可以参考Nyquist version 2.37 Manual。
需要注意的是Nyquist是不区分大小写的,内部会将所有标识符转为大写的形式。
常用数学函数
(+ a b) |
加 |
(- a b) |
减 |
(* a b) |
乘 |
(/ a b) |
除 |
(truncate a b) |
向下取整 |
(float a b) |
整数转浮点 |
(rem a b c ...) |
取余 |
(min a b c ...) |
最小 |
(max a b c ...) |
最大 |
(abs a) |
绝对值 |
(random n) |
1到n-1的随机值 |
(sin a b) |
正弦 |
(cos a b) |
余弦 |
(tan a b) |
正切 |
(expt a b) |
指数 |
(sqrt a b) |
开方 |
(< a b) |
测试a小于b |
(<= a b) |
测试a小于等于b |
(> a b) |
测试a大于b |
(>= a b) |
测试a大于等于b |
(= a b) |
测试a等于b |
(/= a b) |
测试a不等于b |
列表支持函数
(first l) |
取列表第一个元素 (car) |
(rest l) |
除第一个余下的列表 (cdr) |
(reverse l) |
翻转列表 |
(list a b ...) |
构造新列表 |
(append l1 l2) |
连接两个列表 |
(length l) |
返回列表长度 |
(maplist function l) |
对列表中每个元素调用函数 |
控制结构
(if expr expr1 expr2) |
不解释 |