1

F是载波,ED是调制器。

带一个调制器的 FM 合成

只有一个调制器的简单 FM 合成在网络音频中非常简单。

带一个调制器的 FM 合成

var ctx = new AudioContext || webkitAudioContext();
var out = ctx.destination;

// Instantiating
var E = ctx.createOscillator(); // Modulator
var F = ctx.createOscillator(); // Carrier

// Setting frequencies
E.frequency.value = 440;
F.frequency.value = 440;

// Modulation depth
var E_gain = ctx.createGain();
E_gain.gain.value = 3000;

// Wiring everything up
E.connect(E_gain);
E_gain.connect(F.frequency);
F.connect(out);

// Start making sound
E.start();
F.start();

但现在我想做这样的东西。

带有两个调制器的 FM 合成

两个调制器。这如何在 webaudio 中实现?

4

2 回答 2

1

您可以将两个节点连接到同一个输入。只需调用 connect() 方法两次。例如(使用您的图表和命名约定):

E.connect(E_gain);
D_gain.connect(E_gain);

每次 E_gain 产生一个输出样本时,其输入值将通过将来自 E 的一个样本与来自 D_gain 的一个样本相加来确定。

我认为您是要连接到频率参数还是失谐参数取决于您是要实现线性调频还是指数调频。频率参数以赫兹(线性标度)为单位测量,而失谐以分(指数)为单位测量。尽管如果您确实连接到频率,那么您很可能希望在每次载波频率发生变化时调整增益。例如,当 a 使用 440Hz 载波时,您可以将增益设置为 440 * d 以获得恒定调制深度 d,但是当您将音符弹奏低八度时,需要将增益更改为 220 * d。尽管保持增益不变也会产生一些有趣的不和谐效果。

于 2021-11-20T01:35:11.397 回答
0

响应:您需要连接到失谐而不是频率。

示例:嘿,我的网站上有一个示例供您参考:http: //gtube.de/

转到头部的发布区域并选择 FM 合成器。

在那里你可以看到连接,你可以现场试用(使用键盘 AL)!:-)

示例对象:

{"name":"connection","Name":"Connection at Pos6","ConnectFrom":"1_#_MOD 1_#_object","ConnectTo":"3_#_GAIN MOD1_#_object"},
{"name":"connection","Name":"Connection at Pos7","ConnectFrom":"3_#_GAIN MOD1_#_object","ConnectTo":"0_#_OSC_#_detune"},
{"name":"connection","Name":"Connection at Pos8","ConnectFrom":"2_#_MOD 2_#_object","ConnectTo":"4_#_GAIN MOD2_#_object"},
{"name":"connection","Name":"Connection at Pos9","ConnectFrom":"4_#_GAIN MOD2_#_object","ConnectTo":"0_#_OSC_#_detune"}
{"name":"connection","Name":"Connection at Pos10","ConnectFrom":"0_#_OSC_#_object","ConnectTo":"5_#_GAIN OSC_#_object"},
{"name":"connection","Name":"Connection at Pos11","ConnectFrom":"5_#_GAIN OSC_#_object","ConnectTo":"context.destination"}]
于 2016-04-21T07:46:46.693 回答