我尝试播放振荡器(缓冲器 - > FFT - > PeriodicWave - >振荡器)。
// PeriodicWave (-> Oscillator)
var wave = fft(buffer), periodicwave = ctx.createPeriodicWave(wave[0], wave[1]);
function fft(input) {
var n = input.length, theta = 2 * Math.PI / n,
ar = new Float32Array(n), ai = new Float32Array(n),
m, mh, i, j, k, irev,
wr, wi, xr, xi,
cos = Math.cos, sin = Math.sin;
for(i=0; i<n; ++i) {
ar[i] = input[i];
}
// scrambler
i=0;
for(j=1; j<n-1; ++j) {
for(k = n>>1; k>(i ^= k); k>>=1);
if(j<i) {
xr = ar[j];
xi = ai[j];
ar[j] = ar[i];
ai[j] = ai[i];
ar[i] = xr;
ai[i] = xi;
}
}
for(mh=1; (m = mh << 1) <= n; mh=m) {
irev = 0;
for(i=0; i<n; i+=m) {
wr = cos(theta * irev);
wi = sin(theta * irev);
for(k=n>>2; k > (irev ^= k); k>>=1);
for(j=i; j<mh+i; ++j) {
k = j + mh;
xr = ar[j] - ar[k];
xi = ai[j] - ai[k];
ar[j] += ar[k];
ai[j] += ai[k];
ar[k] = wr * xr - wi * xi;
ai[k] = wr * xi + wi * xr;
}
}
}
return [ar, ai];
}
此代码很好但是此振荡器的增益会自动标准化。我想将增益设置为与BufferSource(buffer - &gt; AudioBuffer - &gt; BufferSource)一样大,但它不起作用我尝试使用AudioGainNode,请参阅this test code。
答案 0 :(得分:1)
createPeriodicWave
自动缩放输出波形,使其最大振幅为1.这意味着音量低于您的预期。您必须对增益进行一些实验,以使振荡器输出与缓冲器输出音量匹配。缩放取决于createPeriodicWave
使用的波形。
但是,我认为Chrome的beta(或canary)版本支持最近为disableNormalization: true
引入的参数createPeriodicWave
以禁用规范化。然后振荡器音量应与缓冲器音量匹配。
答案 1 :(得分:0)
你可以增加振荡器的增益;但是,是的,PeriodicWave默认正常化。 createPeriodicWave现在接受一个约束对象,使您可以禁用该规范化。