使用WebAudio API并试图让失真发生!问题是,我不确定如何进入WaveShaper的“曲线”参数。
简而言之,'oscidis'是该程序早期创建的WaveShaper节点。 Oscidisv是我现在静态设置为0的值。:
var wsCurve = new Float32Array();
if ((oscidisv >= -1) && (oscidisv < 1)) {
var k = 2 * oscidisv / (1 - oscidisv);
console.log
for (var i = 0; i < 16; i+=1) {
// LINEAR INTERPOLATION: x := (c - a) * (z - y) / (b - a) + y
// a = 0, b = 2048, z = 1, y = -1, c = i
var x = (i - 0) * (1 - (-1)) / (16 - 0) + (-1);
wsCurve[i] = (1 + k) * x / (1+ k * Math.abs(x));
}
}
oscidis.curve.value = wsCurve;
问题 - 无论我在这里放什么,我都听不到声音上的任何差异) - =。即使在max(1)处出现失真,我也没有注意到任何真正的失真。你们知道一个更明显的失真波形整形函数吗?或者,如果我在WebAudio API中正确地执行此操作?
答案 0 :(得分:28)
这是我用过的一个基于我在白皮书中发现的一些不同功能的东西:
function makeDistortionCurve( amount ) {
var k = typeof amount === 'number' ? amount : 50,
n_samples = 44100,
curve = new Float32Array(n_samples),
deg = Math.PI / 180,
i = 0,
x;
for ( ; i < n_samples; ++i ) {
x = i * 2 / n_samples - 1;
curve[i] = ( 3 + k ) * x * 20 * deg / ( Math.PI + k * Math.abs(x) );
}
return curve;
};
如果我告诉你我知道3 + k
或20
来自哪里 - 我会撒谎 - 但它确实有效。
amount
的值基本上可以是任何正数,但我发现0到100是一个非常好的范围,取决于你需要多少失真。
如果您有兴趣了解这些功能的外观,我建立了一个小工具来帮助我在这里看到它们:http://kevincennis.github.io/transfergraph/
答案 1 :(得分:2)
我接受了上面的一些建议,并对功能进行了重构。我还将类型数组中的样本数量从44K减少到256,这使浏览器更快乐:-()
let distortionFilter = audioCtx.createWaveShaper();
distortionFilter.curve = makeDistortionCurve();
function makeDistortionCurve(amount=20) {
let n_samples = 256, curve = new Float32Array(n_samples);
for (let i = 0 ; i < n_samples; ++i ) {
let x = i * 2 / n_samples - 1;
curve[i] = (Math.PI + amount) * x / (Math.PI + amount * Math.abs(x));
}
return curve;
}