补完 REAPER 效率链的最后一环(三)Command Line 详解

大家好,我是溪夜。
在《补完 REAPER 效率链的最后一环》专栏的第三篇中暂时先把 ReaScript 放到一边,分享一些其他的内容。
上篇文章的开头处曾谈到包括 REAPER、Wwise 和 LMB 都对 Command Line(命令行)有着使用支持。然而对于这部分功能的使用方法,少见的在 REAPER 帮助文档内居然一句未提,Cockos 论坛上也只有少数帖子有过相关讨论。
作为冷门技巧爱好者,出于对 REAPER 文档欠缺部分的补充,我认为有必要详细聊一聊 REAPER 的 Command Line 用法及其扩展思路。
注:本文使用的 REAPER 版本均基于 V6.14

本系列文章阅读需要的前置知识:

  • 有 Python 基础。
  • 对 macOS 终端、Windows 命令行等略有了解。
  • 了解 REAPER 批处理的使用方法。

本文目录:

[toc]

概念与配置方法

为什么要用 Command Line(命令行)?

为什么有好好的图形界面不用,非得要通过命令行来使用 REAPER?
原因很简单:图形界面虽然对用户更友好,但命令行调用可提供更稳定、准确、快速的操作执行结果。
这也是 REAPER 的伟大之处,一个完整的 DAW 愿意放下身段提供这样的底层使用方式。通过把一部分功能提取出来,可做到同时实现命令行的精准操作与 DAW 级别的后期处理。
要知道,FFMpeg 的功能是有限的。想通过它调用一串效果器来进行音频处理难以完成,此时 REAPER 的命令行用法就成了一个大杀器。
举个例子,通过简单的封装,可以把 REAPER 的效果器链批处理功能封装到音频管线中(就像暴雪在 TED 引擎里的用法),此时用户无需再面对 DAW 就能调用相关功能。

查看参数文档的方法

对于 Windows 和 macOS 来说,查看命令行使用帮助的方法相同。Linux 版暂不在本文的讨论范围之内,不过使用方法亦无太大差别。
可分别在命令行和终端中输入以下命令(需自行修改为自己的 REAPER 安装目录):

1
2
Windows: X:\YYY\ZZZ\reaper.exe -h
Mac: /Applications/REAPER64.app/Contents/MacOS/REAPER -h

执行之后可看到以下提示:
REAPER Windows
Windows
REAPER macOS
macOS
不难看出,命令行的用法为:reaper(REAPER 安装路径) [options] [filename.rpp] [filename.wav],在 Windows 下横线“-”也可写为“/”。
对比两者文档的区别,会发现 macOS 比 Windows 缺少 -newinst-nonewinst-close 这三个选项,且 Windows 具有一个独享的选项 -noactive,在之后的部分我们会聊一聊它们的用法。

添加 REAPER 到环境变量

每次都要先输一长串 REAPER 的安装路径再加指令,无疑是比较麻烦的。
为此,可以把 REAPER 的安装目录添加到环境变量,之后即可直接在命令行中无需目录直接调用 REAPER。关于环境变量的配置方法在此不多加赘述,如有疑问可自行通过搜索引擎查找配置方法。
下面分别是 Windows 和 macOS 下配置截图及执行结果图:
Windows 环境变量
Windows 环境变量设置
Windows 环境变量测试
在命令行中直接执行 reaper -h 可看到与之前相同的结果
macOS 环境变量
macOS 环境变量设置
macOS 环境变量测试
在终端中直接执行 reaper -h 后也可看到相同的结果

功能详解

在开始实例之前,我们详细分析一下 REAPER 命令行工具所提供的功能。鉴于 Windows 版的功能更多,这部分的介绍以 Windows 版文档为准。
在这里我把功能分为三大块。
第一部分为单一的选项:
-audiocfg:在启动时打开 Preferences 中的 Audio Device 设置窗口
-cfgfile file.ini:如果使用其他的资源文件夹需要完整路径,否则会使用默认路径
-new:以新的工程启动
-template filename.rpp:使用指定的模板工程开启 REAPER
-saveas newfilename.rpp:当创建或加载完工程后,另存为指定名称的工程
-renderproject filename.rpp:使用工程内保存的渲染设置来渲染指定工程
-ignoreerrors:在加载时不会出现报错窗口
-nosplash:静默加载,不显示开始画面
-splashlog /path/to/filename.log:把开始画面中的信息写入到指定路径下的 Log 文件里
-newinst | -nonewinst:是否创建新的 REAPER 实例(打开新的窗口而不是标签页),会忽略设置中对于新实例的检测设置
-close[all][:save|:nosave]:关闭工程,可通过选项设置保存与否(无效)
第二部分为批量转换文本文件中的语法格式:
-batchconvert filelist.txt
在执行批处理时需使用一个 txt 文件来定义所有的配置。为了方便展示配置文本的内容,我使用代码块来展示配置文件的书写语法(为了写注释,这里使用 Python 格式渲染代码块),并且其中写入了可被使用的参数格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 每行一个文件名(实际使用中需要额外添加路径)
filename.wav
# 也可以每行一个文件名+制表符+输出文件名
filename.wav(制表符分割)outputfile.wav
# 配置代码模块(可选)
<CONFIG
SRATE 44100 # 采样率
NCH 2 # 全局输出的通道数
RSMODE 7 # 重采样模式,0到9之间,需要在
DITHER 3 # 抖动处理模式,1为添加抖动,2为噪音塑形,3为两者协作
USESRCSTART 1 # 把 BWF 内的开始偏置信息应用到输出文件中
PAD_START 1.0 # 在开头增加静音段落,以秒为单位
PAD_END 1.0 # 在结尾增加静音段落,以秒为单位
OUTPATH 'C:\output' # 设置批处理文件的输出目录
OUTPATTERN '$filenumber_$track' # 使用通配符定义输出文件名,如不设置则使用原文件名
FXCHAIN 'chain1.RfxChain' # 使用效果器链
<FXCHAIN # 效果器链子模块,可把效果器链文件内的内容复制在这里,可避免每次都寻找效果器链文件的麻烦
WAK 0 0
BYPASS 0 0
<VST "VST3: PAZ- Analyzer Stereo (Waves)" "WaveShell1-VST3 11.0.vst3" 0 "" 1462399732{5653545741455370617A2D20616E616C} ""
XXXXXXX # 此处省略效果器链文件内容,太长了
>
<OUTFMT # 输出格式子模块,为 base64 格式的数据。可先保存好输出格式设置,之后用文本编辑器打开 .rpp 文件后在 RENDER_CFG 中找到对应的数据
bDNwbVAAAAAAAAAABQAAAP////8EAAAAUAAAAAAAAAA=
>
<METADATA # 元数据子模块,查找方法同上,在工程文件中搜索 RENDER_METADATA 中可找到对应的数据
(contents of <RENDER_METADATA block from project file)
>
>

第三部分为 Windows 独有的选项:
-noactivate:打开 REAPER 后并不前置窗口(无效)

简单实例

下面通过一些实例,体验一下命令行工具的应用。

按需创建新的工程

通过预先创建好的模板文件创建工程:
reaper -template C:\Users\xiye\AppData\Roaming\REAPER\ProjectTemplates\templates1.rpp
结果1

通过预先创建好的模板文件创建工程并另存为 newfilename.rpp(默认另存为的位置为用户名文件夹下):
reaper -template C:\Users\xiye\AppData\Roaming\REAPER\ProjectTemplates\templates1.rpp -saveas newfilename.rpp
结果2

渲染刚创建的工程(轨道里已放入音频文件),默认生成的文件会与 Project - Render 设置里的路径相同,如果没指定文件名将会生成一个无名的 wave 文件:
reaper -renderproject C:\Users\xiye\newfilename.rpp
结果3

对文件进行效果链批处理

REAPER 的效果器链是个很棒的功能,不仅储存了效果器的名称、顺序,还储存了效果器当前所有的参数。在二次调用的时候非常方便,只需简单加载即可轻松复现之前的配置。
这个例子中,我们演示一下如何对一些 wav 文件通过效果器链进行批量渲染,示例目录中创建的结构如下,注意这个目录仅做演示,实际上音频文件、配置文件、输出文件夹可随意放在不同的文件夹中。
示例工程
其中有配置文件、输出文件夹及三个音频文件
首先创建一个配置文件 convert_setting.txt 供批处理使用(实际使用时需删除注释):

1
2
3
4
5
# 需要被处理的文件
C:\Users\xiye\Desktop\TestAudio\1.wav C:\Users\xiye\Desktop\TestAudio\2.wav C:\Users\xiye\Desktop\TestAudio\3.wav
# CONFIG 块 <CONFIG SRATE 44100 # 采样率 NCH 2 # 通道数 RSMODE 9 # 重采样模式 DITHER 3 # 抖动模式 PAD_START 0.0 # 不添加开始静默 PAD_END 0.0 # 不添加结束静默
# 以上的部分如果不想设置,其实不写也行 :)
OUTPATH "C:\Users\xiye\Desktop\TestAudio\Output" # 输出路径设置为源文件目录下的子目录 Output OUTPATTERN "" # 使用原文件名输出 FXCHAIN "chain1.RfxChain" # 使用提前创建好的效果器链 chain1 >

提前创建好的效果器链 chain1 中,包括 ReaEQ 和 ReaVerb,并已设置了参数
chain1
chain1 的内容(图为加载后的效果,仅演示效果链的内容)
在命名行中执行以下命令:
reaper -batchconvert C:\Users\xiye\Desktop\TestAudio\convert_setting.txt
因为文件很少,可看到批处理窗口一闪而过:
批量处理中
一闪而过的批处理窗口
执行结束后打开 Output 文件夹查看批处理后的音频文件,通过试听,发现已经完成了 EQ 与混响处理:
处理后
输出的文件
同时,TestAudio 文件夹中还创建了 Log 文件记录了操作日志:
操作日志
批处理日志

更深的思考

通过 Python 修改 Batch Processing 的文本文件

每次都人工修改批处理配置文件里的路径和参数,这对于聪明的用户绝对是难以忍受的。既然如此,不妨通过 Python 来完成这种繁琐的操作。
举个实际使用时的例子,对于文件路径而言,完全可以写个函数获取目标路径内所有音频文件的完整路径,并修改到批处理配置文件内的对应位置。
在这里我们预先构建好一个 txt 文件作为模板,内容如下:

1
2
3
4
5
# 原始配置文件
input_path <CONFIG SRATE 44100 NCH 2 RSMODE 9 DITHER 3 PAD_START 0.0 PAD_END 0.0 OUTPATH output_path OUTPATTERN "" FXCHAIN fx_chain >

# 修改后的配置文件
input_path <CONFIG SRATE sample_rate NCH channels RSMODE re_sample_mode DITHER dither_mode PAD_START pad_start PAD_END pad_end OUTPATH output_path OUTPATTERN out_pattern FXCHAIN fx_chain >

根据其中的内容,可利用字符串的 replace 方法,通过下面的函数对配置文件的内容进行修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 三个参数分别为读取后的配置文件,需要修改的字符串代号(如 input_path、fx_chain),修改后的字符串或数字
def file_changer(setting_file, old_str, new_str):
file_data = ""
# 修改文件中的内容
with open(file, "r", encoding="utf-8") as f:
for line in f:
if old_str in line:
line = line.replace(old_str, new_str)
file_data += line
# 写入修改后的内容
with open(file,"w", encoding="utf-8") as f:
f.write(file_data)

# 因为 input_path 肯定不会是单行,而是一大堆文本文件。所以在获取完文件路径后,需要用换行符把其分割开,写成:
file_path = "path1\npath2\npath3"

在命令行启动时调用 Action 或 ReaScript

如果想要在命令行调用 REAPER 的同时启动某个 Action 或脚本得怎么办?
这在有些应用场景下可能是个刚需,例如在命令行创建工程后通过脚本让工程自行执行一些更复杂的初始化操作,然而命令行的语法中并没有跟这个功能有关的参数。
其实很简单,有两个变通的方法可以解决这个需求。
第一个方法,可以通过 SWS 中现有的脚本来做到:

1
2
3
4
# 设置全局启动时加载的 Action 或脚本
SWS/S&M: Set global startup action
# 设置工程启动时加载的 Action 或脚本
SWS/S&M: Set project startup action

第二个方法,在 REAPER 资源路径的 Scripts 文件夹中通过创建名为 __startup.(后缀名可以是 eel 或 lua)的脚本,也可在启动时被加载(除非 Shift 键被按下),在 REAPER V5.3 之后均可使用。

接下来讲什么?

《补完 REAPER 效率链的最后一环》专栏除了分享有关 ReaScript 的知识外,还会分享一些我认为比较冷门的 REAPER 使用技巧。
那些比较大路货的经验,本专栏默认读者通过各种视频和文章已掌握,所以我对书写文档和论坛中都比较冷门的技巧会更有兴趣。如果对大家有帮助,欢迎持续关注!

文章作者: 溪夜
文章链接: http://xiye.art/2020/09/28/如何使用 ReaScript 进一步改善 Reaper 效率?(三)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 溪夜的音频博客