要实现阶梯式随机调制,请按固定间隔选取一个新数值,并在两次更新之间保持该数值。此 REAPER 工作流程使用合成音和一个小型自定义 JSFX 增益效果,以明确的持续时间和范围创建随机音量阶梯。

任务范围刻意限定为:让一个持续音的音量不可预测地变化,但不在不同音量之间连续滑动。下面的自动化方法需要完整复制一次效果程序。后续章节会介绍如何使用 REAPER 原生自动化包络创建可编辑、可重复的阶梯形变化。

什么是阶梯式随机调制?

三个选择决定了最终效果:何时改变数值、选择哪个新数值,以及效果如何过渡到该数值。在此工作流程中,时间间隔固定,音量是伪随机的,过渡则是即时的。两次更新之间,增益保持不变。

例如,音量可以在 −15 dB 保持 250 毫秒,跳到 −9 dB 并保持下一个 250 毫秒,然后跳到 −18 dB。这些数值仅用于说明行为;它们不是测量结果,也不代表承诺会生成这样的输出序列。

REAPER 的参数调制系统提供带有 Speed、Strength、Phase 和方向控制的 LFO。它的自动化系统则另有 Square 包络点。这是两种不同的工具:LFO 速度控制调制速率,而方波包络片段会在各点之间定义保持不变的数值。请参阅 Up and Running: A REAPER User Guide 的第 18 和第 19 章。

下面的自定义效果通过代码明确实现保持行为。它直接处理立体声增益;它不会为其他所有插件参数配置通用的阶梯式随机源。

准备持续播放的合成音

从一个空白的 REAPER 工程和一条音轨开始。将 ReaSynth 添加到该音轨的 FX 链中。REAPER 文档说明 ReaSynth 是一种可通过 MIDI 条目演奏的合成器,因此不需要录音或外部音频文件。其控制项包括输出音量、延音和波形混合。The REAPER Cockos Effects Summary Guide, ReaSynth。

使用以下简单的音源设置:

  1. 将工程速度设为 120 BPM,并在 4/4 拍中使用一个四小节乐段。
  2. 选中该音轨,并创建覆盖这四小节的时间选区。
  3. 选择 Insert → New MIDI Item。
  4. 双击 MIDI 条目打开 MIDI 编辑器。绘制一个音符,并将其右边缘延伸至条目末尾。
  5. 在 ReaSynth 中,将 Volume 初始设为约 −12 dB,将 Sustain 设为 0 dB。将 Square mix、Sawtooth mix 和 Triangle mix 保持为零,以获得简单的音色。

MIDI 条目的创建和编辑流程见 REAPER User Guide 第 13 章。此处的速度、时长和音量均为示例设置,并非软件要求。

添加调制前先播放这段乐曲。确认音轨能持续发出声音。如果声音提前停止,请检查音符长度和延音设置。只有音源本身保持稳定音量,变化的增益才更容易判断。

添加能保持每个随机音量的效果

JSFX 是 REAPER 内置的文本程序效果系统。REAPER 会在加载时编译它们;此示例不需要外部编程库。其结构遵循官方 JSFX Programming reference。

打开 View → FX Browser。在浏览器的 FX 菜单中,选择 Create new JS FX,并为效果取一个容易辨认的名称,例如 Stepped Random Gain。使用 Edit JS FX 打开其源代码,将初始内容替换为下面的完整程序,然后保存。有关这些创建和编辑命令的说明,见 REAPER User Guide 第 16.16 节。

desc:Stepped Random Gain
slider1:250<20,2000,1>Step duration (ms)
slider2:-18<-60,0,0.1>Level endpoint A (dB)
slider3:-6<-60,0,0.1>Level endpoint B (dB)
in_pin:Left
in_pin:Right
out_pin:Left
out_pin:Right

@init
remaining = 0;
gain = 1;

@slider
interval_samples = max(1, floor(srate * slider1 / 1000 + 0.5));
low_db = min(slider2, slider3);
high_db = max(slider2, slider3);
remaining = 0;

@sample
remaining <= 0 ? (
  level_db = low_db + rand(1) * (high_db - low_db);
  gain = 10 ^ (level_db / 20);
  remaining = interval_samples;
);

spl0 *= gain;
spl1 *= gain;
remaining -= 1;

这是完整的立体声音频效果,不是代码片段。将它添加到音轨 FX 链中的 ReaSynth 后面。如果看不到其名称,请清除 FX 浏览器的搜索筛选条件。

程序使用 rand(1) 获取伪随机值,并将该值映射到两个 dB 端点之间。该语言的条件语法、指数运算符和随机函数见 JSFX Programming Reference — Language Essentials。

计数器使用 srate,即 REAPER 当前的采样率。计数器到期前,每个采样都会应用相同的已存储增益。两个声道使用相同的增益,因此该效果不会分别随机改变它们的音量。REAPER 在 JSFX Programming Reference — Special Variables 中说明了 srate、spl0 和 spl1。

已根据上述参考资料检查该程序。还分别在 44.1 和 48 kHz 下单独核对了计数器的运算;本文并未在 REAPER 中实际运行该 JSFX。

设置阶梯时长和音量范围

初始设置为:Step duration (ms) 设为 250,Level endpoint A (dB) 设为 −18,Level endpoint B (dB) 设为 −6。这些设置每秒选取四次新的衰减值。除非你更改控制项,否则每个选取的数值都会保持完整间隔。

端点指定的是应用于合成器输出之后的增益,并非目标输出电平表读数。例如,−6 dB 对应约 0.501 的采样乘数,−18 dB 对应约 0.126。音源信号和后续的音轨处理仍会决定最终输出。

期望效果 示例设置 变化内容
缓慢、清晰的平稳段 1,000 ms 每秒选取一个新音量
中等速度的阶梯变化 250 ms 每秒选取四个新音量
更快的阶梯变化 125 ms 每秒选取八个新音量
缩小音量差异 端点为 −9 和 −6 dB 缩小可选范围
设置固定衰减以作比较 两个端点均为 −6 dB 每次选取都会产生相同增益

在 120 BPM 下,一个八分音符时长为 250 毫秒:60 秒除以 120 拍,再除以 2。这是一个时间计算示例。此效果使用毫秒,不会跟随速度变化,也不会将阶梯与工程的音乐网格对齐。

端点可以按任意顺序输入,因为程序会对它们排序。更改任一滑块后,下一个处理的采样会开始一个新间隔。随机音量不会经过插值,而是保持不变,但连续两次选取的数值可能恰好相差很小。

改用可编辑的重复阶梯

如果你想在确切的时间线上位置设置确切数值,请使用自动化包络。这也是通过原生方式将保持变化应用于已公开效果参数的方法。REAPER 的 User Guide 第 18 章介绍了参数包络和 Square 点形状。

如果要创建固定音量模式,请先旁通自定义 JSFX。打开音轨的包络控制,并显示其 Volume 包络。手动编辑时,保持音轨处于 Trim/Read 模式。

使用 Shift-单击按 250 毫秒的间隔创建点,然后将它们移动到不规则的音量值。右键单击一个点,选择 Set Point Shape → Square。对于每个后续线段都应保持其数值的点,都应用这种形状。包络应显示水平平稳段和垂直变化。

如果要控制其他效果的参数,请触碰所需的控制项,然后选择 Param → Show track envelope。改为在该包络上添加点并设置形状。参数菜单的操作流程见 The REAPER Cockos Effects Summary Guide。

手动放置不规则数值会创建固定模式;它不会在每次播放时生成新的随机值。要重复使用该模式,请选中其时间范围,右键单击包络,然后选择 Automation items → Insert new automation item。REAPER 支持循环播放自动化条目,也支持池化副本,其编辑会同步到其他副本。REAPER User Guide, Automation Items。

排查平滑移动、变化缺失和可重复性问题

如果包络仍然呈斜坡,请检查后续点的形状。Linear 会创建渐变;Square 会创建此处所需的保持线段。方波 LFO 和手动绘制的多级阶梯也各有用途:仅仅在两个音量之间交替,并不能创建任意的音量序列。

如果自定义效果没有明显变化,请确认它位于 ReaSynth 之后、处于启用状态,并且两个端点数值不同。可以尝试 1,000 毫秒的阶梯时长,并将端点设为 −24 和 −6 dB,这样更容易看出变化结构。之后再恢复为工程所需的范围。

增益突变可能会引入咔嗒声,因为采样乘数会立即改变。此程序有意不进行平滑处理。缩小音量差异可以减轻这些不连续变化,但不能保证输出没有咔嗒声。添加过渡渐变会改变原本的即时阶梯行为。

此效果面向立体声音轨设计,只会修改前两个音频声道。它不会写入自动化点、保存选定的随机序列、将数值量化为少数几个音量等级,也不提供速度同步。通常情况下,REAPER 会在播放开始时运行 JSFX 的 @init 段;此程序会在那里重置计数器。不要指望重新开始播放后它会重复相同的随机序列。JSFX code-section reference。

如果你需要自动生成并保持音量值,请使用自定义增益效果。如果你想编辑、重复并保留特定变化,请使用方波自动化。两种方式都能让合成音呈现不同的平稳段;选择哪种方式取决于你更看重新生成数值,还是获得精确的时间线模式。

来源