Nyquist和Lisp编程简介

从版本1.1.1开始,Audacity允许用户使用Nyquist编写一些音频处理插件。不同于VSTVirtual Studio Technology)和LADSPALinux Audio Developer's Simple Plug-in API  )插件,Nyquist可以用任何编辑器编写,并且不需要编译。在Mac上,Audacity还支持Audio Unit插件。

NyquistRoger B. Dannenberg编写的,设计用于合成处理音频的一种领域语言,它支持MIDI,录音回放,文件I/OOO等。Audacity使用了Nyquist的部分功能,允许你对音频数据进行一些简单的Nyquist操作。Audacity没有提供Nyquist的调试支持,如果你想编写一个复杂的插件,最好使用完整版本的Nyquist进行编写,然后转成Audacity的插件。完整版的Nyquist的地址如下。

CMU Computer Music Project Software 卡内基梅隆大学大学的计算机音乐项目)

Nyquist支持类Lisp语法和传统的SAL语法。Audacity 1.3.8之前的版本只是支持Lisp,后面的版本同时支持LispSAL。如果要编写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,是一个赋值到变量的函数(还有其他的赋值函数,比如setsetq)。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)))

要从列表中取出元素,可以使用firstrest函数(习惯上,它们被称为carcdrfirstrest比较容易记住,它们在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)

1n-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)

不解释

 

 

你可能感兴趣的:(Nyquist和Lisp编程简介)