给Audacity编写Nyquist插件

Audacity编写Nyquist插件比较简单,创建一个带有“.ny”后缀的文本文件,然后在里面写上需要的Nyquist代码即可。当然需要一些注释来告诉Audacity一些信息,比如版本和类型。编写完后的.ny文件放到plug-ins目录,重启Audacity即可。下面是一个非常简单的插件:

;nyquist plug-in
;version 1
;type process
;name "Fade In"
;action "Fading In..."
(mult (ramp) s)

 

第一行必须写成;nyquist plug-in,第二行用来指定版本号,版本2和版本3支持更多的窗口部件,但版本3Audacity 1.3.3之前是不支持的。随后的一行是插件的类型,它用来指定该插件放到菜单中的哪一些当中。下一行用来用来设定插件运行时,Audacity显示的内容。还有其他一些选项可以使用。任何不以分号开始的行都当做Nyquist代码来执行。

Nyquist支持三种类型:

  ;type generate
  ;type process
  ;type analyze

与之对应的是菜单栏上三个包含插件的菜单项:GenerateEffectAnalyzeGenerate用来生产新的音频;Effect插件用来修改当前选中的音频;Analyze插件用来处理选中的音频,但不做任何修改。可以根据分类选择适合自己的类型。

对于EffectAnalyze插件,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”,它就为插件打开一个对话框。每个参数包含一个文本框和一个滑动条。用户设置参数后,Nyquist都会把值放到一个“control”行指定的名字当中。下面是代码在Linux上运行的截图:

给Audacity编写Nyquist插件

info”被显示到对话框的顶部,“\n”意味着换行。“control”行的参数决定了滑动条的外观。每个“control”行必定有下面8个元素:

1.    关键词“control

2.    控件的名字,Nyquist用它来存放参数值

3.    控件显示标签

4.    参数值的类型,可以是int或者real

5.    值右侧的标签,通常是参数单位,比如“Hz”或“dB

6.    参数初始值

7.    参数的下限

8.    参数的上限

Nyquist插件不但可以返回音频,还可以返回一个标签列表。标签列表其实就是一系列时间/便签对,比如:

((0.0 "start") (30.0 "middle") (60.0 "end"))

当插件返回的是标签列表时,Audacity创建新的标签到指定的时间位置,这种类型的插件属于“analyze”类型。

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

制造一个长度为2的数组

(setf (aref s 0) left)

left作为数组中的第一个元素,左声道

(setf (aref s 1) right)

right作为数组中的第二个元素,右声道

为了简便起见,如果输入到插件的是立体音,但你只输出单声道的音频,Audacity会自动将其拷贝到左声道和右声道中。

Audacity提供了一些实例,可以基于这些实例进行模仿学习。学习的最好办法就是去尝试。如果你遇到调试的问题,可以考虑下载完整版本的Nyquist。如果你想分享讨论自己的成果,可以参加社区论坛或邮件列表。

你可能感兴趣的:(给Audacity编写Nyquist插件)