Audacity: 自由而免费的声音编辑器和录音软件

广告政策

Nyquist

  1. 关于Nyquist及List编程的介绍
  2. 使用Nyquist编程
  3. 创建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(卡内基梅隆大学计算机音乐项目)获取到 :

下载完整版 Nyquist

Nyquist 不但支持 Lisp 语法,还支持传统语法,称作SAL。 Audacity 1.3.8 版及之前的只支持 Lisp,但是现在的 Audacity 2.0 系列同时支持 Lisp 和 SAL。想要给Audacity写插件 ,请使用和你的Audacity版本对应的 Nyquist手册 和 推荐的语法:

注意,仅为了给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 用于给变量赋值。 (还有其他类似的函数,像 setsetq,但是 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)))

要将某元素从列表里提出来,可用 firstrest函数。(传统上,这两个还被称作 carcdr ,但是firstrest 更加好记,两种书写方式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的值

下一步:用Nyquist编程