创建Nyquist插件
- 关于Nyquist及List编程的介绍
- 使用Nyquist编程
- 创建Nyquist插件
给Audacity创建Nyquist插件很简单,只需创建一个后缀名为 ".ny"的文本文件,里面输些 Nyquist代码,加少许注释说明此插件的类型,然后将此文件存放在 Audacity的 plug-ins 目录。下面是个简单的插件实例:
;nyquist plug-in ;version 1 ;type process ;name "Fade In" ;action "Fading In..." (mult (ramp) s)
Nyquist插件的第一行必须和上述例子一模一样,第二行必须写明版本号。版本2和3能支持更多小工具,但是Audacity 1.3.3 及更早版本不支持版本3的插件。下一行是插件的类型,将在下面详细讨论。然后是插件名,这名字将显示在菜单栏,第5行是"action",当插件运行时显示在菜单栏上。接下来可以加些别的选项行。所有行首没有分号 (;)的行都会被视作Nyquist命令行,会被执行。
Audacity 支持三种用Nyquist编写的插件:
;type generate ;type process ;type analyze
上面三种类型分别可容纳插件:生成,特效和分析。生成插件用来生成新的音频,特效插件("process")编辑并修改已有的音频,分析插件只用来加工音频,不修改音频(不过允许它们添加标签)。
对于特效和分析插件,Audacity自动设置Nyquist环境,使得用户选择的音频用变量表示s。插件文件中所有表达式都按照顺序执行,最后一条表达式的返回值替换Audacity中选择的音频。如果最后一条表达式没返回音频,Audacity会报错。
参数对话框
Audacity 支持的插件控制对话框数目有限。下面的例子是讲打开了一个对话框的插件。
;nyquist plug-in
;version 1
;type process
;name "Delay..."
;action "Performing Delay Effect..."
;info "Demo effect for Nyquist by Roger Dannenberg.\nThis effect
creates a fixed number of echos." ; (should be all on one line)
;control decay "Decay amount" int "dB" 6 0 24
;control delay "Delay time" real "seconds" 0.5 0.0 5.0
;control count "Number of echos" int "times" 5 1 30
(defun delays (s decay delay count)
(if (= count 0) (cue s)
(sim (cue s)
(loud decay (at delay (delays s decay delay (- count 1)))))))
(stretch-abs 1 (delays s (- 0 decay) delay count))
如果Audacity找到至少一个"control"行,它将打开一个对话框提示用户输入特定的参数给插件。每个参数包含一个文本框和一个滑块,在用户设置好每项后,最终值会被存放在"control"行定义的Nyquist变量中。下面是Linux下Audacity 的延迟特效控制窗口。
注意"info"行的内容会显示在对话框顶部,"\n"代表新行。"control"行里的参数会影响外观和参数限制。每个"control"行必须由8个元素组成,按照下面的顺序:
- 单词"control"
- control的名字-这是Nyquist变量的名字,在用户操作对话框时被设置。
- 控制器左面的标签
- 值的类型: 仅为
int(整形) 或real. - 控制器右边的标签(通常为单位,比如“Hz”或“dB”)。
- 参数 默认/初始化 值
- 参数的最小值
- 参数的最大值
返回标签
除了返回音频,Nyquist插件可以返回一个标签列表。很多标签列表只是一个 时间/标签 对,例如:
((0.0 "start") (30.0 "middle") (60.0 "end"))
档插件返回这种形式的列表时,Audacity会创建一个新的标签轨道,按照位置放置好标签。这种类型的插件通常是"分析"插件。
新消息!从Audacity 1.3.1开始,你可以选择同时返回一个开始和一个结束时间,像这样:
((0.0 25.0 "start") (30.0 45.0 "middle") (60.0 75.0 "end"))
注意,在Audacity 1.3中,标签可以重叠;一个标签的结束时间可在另外一个标签的开始时间后面(即两标签时间重叠)。
处理立体声音轨
Nyquist将立体声轨道视为一个数组(而非一个列表)。许多Nyquist函数自动处理这些数组,但是并不能处理所有数组,所以某些时候有必要拆开立体声数组,或合并一个,下面是些很有用的函数:
(arrayp s) | 如果 s是一个数组 |
(aref s 0) | 数组的第一个元素 s -左声道 |
(aref s 1) | 数组的第二个元素 s -右声道 |
(setf s (make-array 2)) | 将 s 变成新数组,长度为2 |
(setf (aref s 0) left) | 将 left作为数组 s |
(setf (aref s 1) right) | 将right作为数组 s |
为了方便起见,如果Nyquist插件的输入是立体声,但是输出是单声道(mono),Audacity会自动将它(单声道)复制到左右声道变为立体声。
下一步干什么?
Audacity 有些示范插件,你可以从改造它们开始。熟悉Nyquist最好的办法还是用它。如果调试出问题,请下载最新版的Nyquist(查看第1部分中的链接)。
如果您都不能让Nyquist工作,请联系我们。
如果您在编写Nyquist特效插件并想和别人分享,或者想讨论如何用Nyquist实现某种特效,请在 论坛里的 Nyquist 版块 发帖或加入 audacity-nyquist 邮件列表。
不要忘了查阅完整版 Nyquist 2.37 参考手册 获取更多关于 Lisp 和 Nyquist 的信息。

