Yukitoha 站站站

v0.13 ... 能跑就行了吧?

记录 - 将 FL Studio DirectWave 采样转为 sfz

内容完全使用 AI 记录。

TODO: 第一部分各项均待核实


第一部分:FL Studio (DirectWave) 音频文件头底层发现

通过对 FL Studio 内置采样(WAV 格式)进行二进制分析,发现了以下关于其自定义包装格式的底层事实:

1. 嵌套的 Ogg-in-WAV 结构与非标准格式码

  • 格式编码:文件虽然采用 .wav 后缀,但其 fmt 块中的格式代码(Format Tag)为 0x674fWAVE_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