var ctx = new webkitAudioContext();
pw = ctx.createWaveshaper();
每次我在Google Chrome中使用CreatePeriodicWave()时,我都会
SyntaxError: Failed to construct 'PeriodicWave': invalid real array
我应该在函数中添加什么来避免此错误?
答案 0 :(得分:14)
要获得PeriodicWave,代码如下:
var context = new webkitAudioContext();
var realCoeffs = new Float32Array([0,0]); // No DC offset or cosine fundamental freq
var imagCoeffs = new Float32Array([0,1]); // sine of amplitude 1 at fundamental freq (First imaginary coeff is ignored)
var wave = context.createPeriodicWave(realCoeffs, imagCoeffs); // will be a simple sine wave
然后,您可以在wave
中使用PeriodicWaveform OscillatorNode
:
var osc = context.createOscillator();
osc.setPeriodicWave(wave);
osc.frequency.value = 440;
osc.connect(context.destination);
osc.start(0);
您可以通过查找“傅里叶级数”来了解有关系数的更多信息。缺点是:
我们说 f
是您的基本频率(相当于osc.frequency.value
)
对于实系数,Kr
:
Kr[0]
是DC偏移(由cos创建的“wave”的幅度(0 f
t))Kr[1]
是基频处余弦波的幅度(cos(1 f
t))Kr[2]
是2 nd 谐波的余弦波幅度(cos(2 f
t))对于虚数系数它是相同的,除了它们是正弦波,并忽略0 th 系数,因为它将是波sin(0*t)
的振幅,这是0表示所有t。
注意:如果你真的只想要一个锯齿,你可以通过将振荡器节点中的type
属性设置为“锯齿”来生成它,但是如果该选项假设不可用,那么你可以这样做做到这一点。
对于锯齿波,您可以在此处查看系数:http://mathworld.wolfram.com/FourierSeriesSawtoothWave.html
锯齿具有1/2的DC偏移(即第一实系数) - 实数系数的其余部分为0 - 和形式1 /(nπ)的虚系数。因此,为了产生锯齿,你将替换线
var realCoeffs = new Float32Array([0,0]);
var imagCoeffs = new Float32Array([0,1]);
以上,具有以下内容:
var numCoeffs = 64; // The more coefficients you use, the better the approximation
var realCoeffs = new Float32Array(numCoeffs);
var imagCoeffs = new Float32Array(numCoeffs);
realCoeffs[0] = 0.5;
for (var i = 1; i < numCoeffs; i++) { // note i starts at 1
imagCoeffs[i] = 1 / (i * Math.PI);
}
答案 1 :(得分:3)
createPeriodicWave
期望两个参数 - 都是Float32Array
个实例 - 指定傅立叶级数的系数。第一个是real
部分,它是余弦项的数组。第二个imag
代表正弦术语。
但是你有什么特别的问题需要解决吗?我有一种感觉,只知道arg Float32Array
可能不会有那么大的帮助。