【REAPER 脚本】midi_osc
dumb_cmd
编辑于 2025年07月17日 14:12
收录于文集
共2篇

前情提要

好久不见啦。之前有些忙碌,几乎一整个学期没碰 REAPER 和 Ae,自然手生;跟风用了《章鱼噼的原罪》的打击素材,水了 Beatboxer VS Trackmaker 的一小部分,就当是复健吧。

出现在视频第六秒和第十一秒的一小段bass

图中的这一小段旋律的音高是由高速重复打击音效得来的(可称“人工振荡器”)。当时我的做法是查阅 音高-音名-频率-周期速查表(例如,B1 对应的频率约为 61.735Hz,周期约为 16.198ms),然后在音频对象的属性里手动修改其时长,然后不断复制粘贴以得到对应音高的“振荡”。

媒体对象的属性窗口;以听感为准,最终将音高降了两个八度(B3 -> B1)

这种做法显然过于繁琐,而且精度也不高:以“时间”为单位时,可见输入的最小时间单位仅为 1ms(虽然也有以帧/采样为最小时间单位的选项,但是换算过程实在复杂);如果涉及弯音等事件,比如 death by amen 里的 Satisfaction 段,几乎就无从下手……

于是突然心血来潮,写了一个脚本……

midi_osc.lua 是一个简易的 REAPER 脚本,它能根据 MIDI 对象产生类似振荡器的脉冲序列,支持两种输出格式:MIDI 格式或空对象格式。


主要特性

  • 两种输出模式:可选择 MIDI 或空对象(Empty Item)格式

  • 音高调整:支持八度音程偏移

  • 支持弯音(Pitch Bend)事件:可调整弯音范围

  • 简单的 GUI 界面

系统要求

  • REAPER 6.0 或更高版本

  • 已安装 ReaImGui

下载

https://wwgj.lanzoum.com/b0138zromh 密码: 7qsq

包含内容:

  • midi_osc.lua

  • death by amen 的 REAPER 工程实例.zip

安装

如果你对 REAPER 的脚本功能尚不熟悉强烈建议先查看 REAPER 中文分享社区的这些文章并安装相关组件,同时也建议使用该社区提供的国内 ReaPack 镜像源:

  • ReaPack 用户手册(下载、安装与使用教程)https://club.reaget.com/t/topic/327

  • 方便国内用户的 ReaPack 下载地址与 ReaPack 第三方源(镜像)https://club.reaget.com/t/topic/219

  • 最常见的 REAPER 脚本运行出错解决方法https://club.reaget.com/t/topic/1795

  1. 将 midi_osc.lua 脚本文件复制到REAPER的脚本目录:Windows: C:\Users\[用户名]\AppData\Roaming\REAPER\ScriptsmacOS: ~/.config/REAPER/ScriptsLinux: ~/.config/REAPER/Scripts

  2. 在 REAPER 中,打开"Actions"菜单,选择"Show action list..."

  3. 点击"New action..."按钮,选择"Load ReaScript..."

  4. 找到并选择 Script: midi_osc.lua

  5. (建议)为 midi_osc.lua 分配一个快捷键或工具栏按钮(推荐)以便快速访问

打开"Actions"菜单,选择"Show action list..."

点击"New action..."按钮,选择"Load ReaScript...",找到并选择 midi_osc.lua 脚本

为脚本分配一个快捷键

为脚本设置一个工具栏按钮(推荐)

更多自定义选项,等你探索……

与 MIDI 相关的 REAPER 设置

1.何为 PPQ ?

PPQ(Pulses Per Quarter note),即每四分音符脉冲数,又称TPQN(Ticks Per Quarter Note)。PPQ 的数值表示每个四分音符被分成多少个时间单位(ticks),它决定了 MIDI 事件时序的分辨率(如音符、弯音的精确位置)和 MIDI 文件的内部时间坐标系

同一 BPM 情况下,一个 MIDI 对象的 PPQ 越高,这个 MIDI 对象在单位时间内能够承载的事件越多,自然,其振荡音高的精度就越高。

2.REAPER 中的两项 PPQ 设置

两个 PPQ 设置:a.事件 PPQ,b.CC 连段插值 PPQ;前者更重要

a.对于新生成的 MIDI 对象,REAPER 的 PPQ 默认为 960。在 120 BPM 情况下,这是部分 PPQ 值所对应的最高频率,请根据实际效果调高该值以提高精度。推荐用 3840 或 7680。

我在还原 death by amen 时,使用了 7680 PPQ

对于已有的 MIDI 对象,你可以通过查看其属性来获取其 PPQ 信息:

最右侧窗口的 Ticks Per Quarter Note 就是 PPQ

不过,已有 MIDI 对象的 PPQ 似乎是不可更改的。简单粗暴的一种做法是,直接胶合(glue)这个 MIDI 对象,使得 glued MIDI 对象的 PPQ 与设置一致。

b.新生成 MIDI 对象的 CC 连段插值 (Default shape for CC segments)。这是指 REAPER 在 MIDI 事件中插入的私有数据,最典型的就是 LFO、曲线形状、速率、深度这些参数。这种插值被储存在“REAPER Data”之中。

以下是“钢琴卷帘”视图和“事件列表”视图中的弯音信息:

“钢琴卷帘”视图的下方CC Lane,带有特殊插值的弯音看起来很“平滑”

“事件属性”视图,我们可以看见 REAPER 有 6 种 CC Shape

其中“矩形”与标准 MIDI 文件一致,不含私有信息(即 REAPER Data),而其他的选项都是 REAPER 私有的插值模式。如果将该 MIDI 对象导出为标准 MIDI 文件,REAPER 会把这段 REAPER Data 剥离掉,只留下展开后的 Pitch Bend 序列,确保兼容性,如下图:

使用 Ctrl+Alt 拖拽得到的MIDI 对象,原本平滑的弯音被展开成了矩形

可见,展开后弯音事件的最小时间单位成了 1/128 网格,与 CC 连段插值默认设置的 32 PPQ 分辨率一致;该数值越高,展开得到的弯音事件精度越高。

由于 midi_osc 只支持矩形 CC Shape,所以在使用该脚本处理含有上述私有插值模式的 MIDI 对象之前,请先用 Ctrl+Alt+拖拽(不是胶合!)渲染为只含矩形 CC 的标准 MIDI 事件。

注意:过高的 PPQ 会增加文件体积和计算复杂度,实际场景中需权衡精度与效率。

使用教程

如果你没有安装 ReaImGui,启动脚本只会弹出这样的窗口,将你引导至 REAPER 中文分享社区里的安装教程(见上文“最常见的 REAPER 脚本运行出错解决方法”)。

若点击"是",浏览器会打开相应的网址

如果你正确地安装了 ReaImGui,midi_osc 将会正常显示窗口:

简单的GUI界面

  • 窗口操作:左上角按钮可折叠窗口,右上角按钮可关闭窗口

  • Mode: 选择“MIDI”或“空对象”输出格式

  • Transpose: 使用滑块设置八度偏移(默认值 0,默认范围 -6 ~ +4)

  • Pitch Bend Range: 使用滑块设置弯音影响的范围大小(默认值 2,默认范围 1 ~ 24)

  • 直接输入数值:Ctrl/Command + 左键点击滑块,可以直接输入超出默认范围的整数值;Pitch Bend Range 小于 0 意味着弯音的变化方向与原本相反

  • Generate: 点击按钮,生成振荡

  • 警告信息:音高越高,脚本产生单位时间内的 MIDI Note(或空对象)越多,故极高的音高有可能会造成各类性能问题与异常。当滑块设置的数值有可能使音高超过安全范围时,Generate 按钮下方会立即显示警告:"Please avoid frequencies above C8",仅提醒用户检查自己的设置,不会影响生成过程

首先在 REAPER 选中一个或多个 MIDI 对象,再设置好脚本,最后点击 Generate 按钮即可。

MIDI 模式下,生成的结果会出现在与原对象所在轨道并列的轨道。

空对象模式下,生成的结果会出现在原对象所在轨道的子轨道(与 midi2item 相类似)。

轨道2 - MIDI 模式;轨道4 - 空对象模式

利用空对象的方法也与 midi2item 一致,详见视频 网页链接​

注意:涉及的音高越高,生成的速度越慢,期间甚至可能出现“程序未响应”,系正常现象。

附件:

MIDI 模式下,新对象的命名规则

操作记录中显示的内容,命名方式与上一图相似

参考

REAPER API functions - https://www.reaper.fm/sdk/reascript/reascripthelp.html

REAPER User Guide - https://www.reaper.fm/userguide.php

REAPER中文分享社区 - https://club.reaget.com/


杂项

  • ↑ 这就是那个工程实例的演示视频

  • 建议学习 MIDI 编辑器相关快捷键以加速制作过程,如 Ctrl + F2,Ctrl + ↑/↓ 等……

  • 这真的不是 Speedcore 用脚本吗。。。

  • @zzzzzz9125 废话少说 上号!