记录 - 将 FL Studio DirectWave 采样转为 sfz
内容完全使用 AI 记录。
TODO: 第一部分各项均待核实
第一部分:FL Studio (DirectWave) 音频文件头底层发现
通过对 FL Studio 内置采样(WAV 格式)进行二进制分析,发现了以下关于其自定义包装格式的底层事实:
1. 嵌套的 Ogg-in-WAV 结构与非标准格式码
- 格式编码:文件虽然采用
.wav后缀,但其fmt块中的格式代码(Format Tag)为0x674f(WAVE_FORMAT_OGG_VORBIS_MODE_1)。这表明其外壳是 WAV 容器,内部实际封装了 Ogg Vorbis 编码。 - 非固定文件头偏移:
- 在普通的压缩包中,音频数据块
data(以OggS开头)位于偏移量 54 字节(0x36)处。 - 在特定的电声采样(如 Piano Electric)中,
fmt和data之间多出了一个 12 字节的fact块(标识符66 61 63 74),将data块和第一个OggS标志向后挤压至 66 字节(0x42)处。
- 在普通的压缩包中,音频数据块
2. 尾部元数据与 smpl 循环块
- 数据分离:WAV 容器的实际大小远大于其
data块声明的大小。在data块音频数据结束之后,紧接着存放了 DirectWave 专有的元数据。 - 精确循环点提取:在尾部的
smpl块中,包含cSampleLoops字段(偏移smpl块数据起 28 字节处)以及精确的dwStart(循环起点,偏移 44 字节)和dwEnd(循环终点,偏移 48 字节)。这些数值是用绝对 PCM 采样点(Sample)表示的,即便音频流被压缩,其采样点数值依然绝对精确。
第二部分:SFZ 规范与高级调制技术
SFZ 格式具有极强的可玩性与底层控制力,本次重点发掘了以下高级调制机制:
1. 跨平台自动声像摆动 (LFO Auto-Pan)
通过复刻 DirectWave 调制矩阵中(LFO 1 $\to$ Voice Pan,速率 2.520 Hz,深度约 45%)的连接,我们在 SFZ 中实现了完全一致的自动左右摇摆效果。为了保证在不同 SFZ 引擎中的兼容性,采用了双标准并写:
- 标准 SFZ v2 规范(适用于 sfizz):
使用核心的 LFO 模块控制声像(Pan)。
lfo1_freq=2.520 // 设置 LFO 1 频率为 2.520 Hz lfo1_pan=45 // 设置声像摇摆幅度为 45% - Aria / Sforzando 扩展规范:
panlfo_freq=2.520 // 调制速度 panlfo_depth=45 // 调制深度
2. 虚拟旋钮初始位置预设 (set_ccN)
在 SFZ 中,MIDI 调制通常是累加(Additive)的(实际值 = 基础值 + CC输入 * 范围)。
- 传统痛点:若要让旋钮支持正向控制(拧大则参数变大),基础值就必须设为最小(0),但这会导致加载乐器时默认没有效果。
- 解决方案:将参数的基础值设为最小(如
ampeg_sustain=0),将调制范围设为最大(ampeg_sustain_oncc75=100),然后通过set_ccN指令在加载时初始化旋钮的位置:<control> set_cc75=127 // 插件加载时,虚拟旋钮自动初始化在 127 位置(100% 音量)这样旋钮既能进行直观的正向拧动,又保证了加载时乐器有合理的默认听感。
以下 TODO:
3. 动态渐弱循环(Decay Loop)
对于具有无限循环(Sustain Loop)的乐器(如电钢、合成器 Pad),若想在按住琴键时让声音像真实物理乐器一样慢慢减弱并消失,可以通过 ADSR 巧妙实现:
- 原理:
ampeg_sustain=0 // 按住键时的保持音量为 0% ampeg_decay=0.1 // 基础衰减 ampeg_decay_oncc74=15.0 // 允许通过 CC74 调节衰减时间(最长可达 15 秒) - 行为:音符被触发后,采样在内部无限循环以保持声音的连贯性,但音量会根据
Decay设定的时间逐渐减弱至静音。
Written on July 1, 2026