帮助使用 LFO 调制振荡器音高的算法

信息处理 声音的 算法 软件实现 调制
2022-01-13 21:16:44

我正在开发模拟合成器的软件仿真。我正在尝试使用 LFO 调制振荡器的音高。对于输入到计算机音响系统的每个样本,我正在计算要输入到主振荡器的频率,如下所示(伪代码):

osc_frequency = note_frequency * (1 + tuning) * (1 + lfo_y * lfo_mod_depth)

该语句中的变量描述如下:

  • note_frequency = 要播放的音符频率,单位为 Hz
  • 调音 = 以播放音高百分比表示的振荡器微调(例如:-0.02 = 失谐 2%)
  • lfo_y = lfo 波形的当前 y 值(范围从 -1 到 1)
  • lfo_mod_depth = 应用到振荡器的效果的深度/强度百分比

但是,这种计算不会产生预期的结果。我希望听到音高上下调制,锁定在中心频率附近(正在播放的音符)。我得到的是一种调制效果,它会导致音高“失控”;我无法确切地说出发生了什么,但听起来像是其中之一:

  1. 调制强度随着时间的推移而增加(调制达到的高/低频标记越长/越低,音符保持的时间越长)
  2. 虽然调制强度随时间保持恒定,但中心频率增加,而调制围绕它振荡

我是否使用正确的方法?如果不是,正确的方法应该是什么?对此的任何帮助都非常感谢。

1个回答

正如 Jason 所说,这可能只是因为您没有正确实现振荡器 - 例如将频率乘以时间而不是积分。

另请注意 - 这与您的主题无关,但确实值得观察 - 您的频率调制公式实现的行为与大多数合成器的行为非常不同,并且对音乐家来说听起来很不可思议。

例如,如果lfo_y在 -1 和 1 之间波动;lfo_mod_depth为 0.5 ;如果note_frequency等于 220 Hz,osc_frequency将在 110 到 330 之间扫描 - 也就是说,在音符周围 -1 八度和 +1 五度之间。因此,音高调制看起来会以赫兹音阶为中心,但不会以感知音阶为中心。

正确的行为是有类似的东西:

osc_frequency = note_frequency * 2 ** (tuning / 1200.0 + lfo_y * lfo_mod_depth)

然后:

  • 调音以音分表示,音分是一个与音乐相关的单位(100 音分 = 1 个半音)。
  • 您的音高调制是“以音乐为中心的”,并且 lfo_mod_depth 以 octaves表示

这被称为“指数调频”,这是合成器的标准。在模拟合成器上,这是通过将 LFO 信号与命中 VCO 指数转换器的 CV 相加来实现的。在数字合成器上,这是通过在仍处于音阶上的高分辨率内部表示上应用调制来实现的 - 在转换为频率或相位增量之前。