我的 FM 合成器实现有什么问题?

问题描述 投票:0回答:1

我正在尝试让 FM 合成器工作,该合成器使用波表振荡器,我正在调整 FM 合成的公式:

使用波表振荡器作为载波和调制器,所以我正在做类似这样的伪代码:

freq = 220;
osc1.set_frequency(freq)
signal1 = osc1.process()

osc2.set_frequency(freq + signal1 * freq * 12) // where 12 is the modulator index
signal2 = osc2.process()

output = signal2

结果有点有效,对于单链调制,例如A->B或A->B;C->B,结果与其他vsts相同。 然而,当进行链式调制 C->A->B 时,结果是意想不到的,而且反馈 B<->B 不起作用。

通过一些研究,我得到的印象是其他合成器(FM8、Sytrus、Toxic、Dexed、Exakt 等)可能实现 PM 而不是 FM,尽管如此,它们听起来都具有相同的调制,但我无法得到类似的使用我的方法发出声音(也尝试使用相同的方法设置相位,得到相同的结果)。

这是我正在使用的方法的有效 JSFX 演示,具有三个振荡器和 FM 控件。它可以在 Reaper DAW 中打开。 https://stash.reaper.fm/v/47880/FmTest.zip

signal-processing synthesis sound-synthesis
1个回答
0
投票

我想我已经找到了解决方案,我改用相位调制,技巧是使用 PhaseOffset 而不是直接调制相位。在此源代码上找到了窍门:https://github.com/victorzheleznov/p...on-synthesizer

在此示例中,我能够应用信号反馈,其结果与其他 vst 相同。

osc1.setfrequency(freq);
osc1.setphase(phase1 + signal * 0.25);
signal = osc1.process();
phase1 += freq / srate;
phase1 > 1 ? phase1 -= 1;

这是调制演示,其结果与其他 vst 非常接近。 https://stash.reaper.fm/v/47887/fmtest.zip

© www.soinside.com 2019 - 2024. All rights reserved.