WebAudio中的波形整形器节点-如何模拟失真?

WebAudio中的波形整形器节点-如何模拟失真?,audio,web,web-audio-api,Audio,Web,Web Audio Api,使用WebAudio API并尝试让失真继续!问题是,我不知道如何进入波形发生器的“曲线”参数 简单地说,“oscidis”是一个在程序前面创建的波形整形器节点。OSCIDSV是我目前静态设置为0的值: var wsCurve = new Float32Array(); if ((oscidisv >= -1) && (oscidisv < 1)) { var k = 2 * oscidisv / (1 - oscidisv); console.lo

使用WebAudio API并尝试让失真继续!问题是,我不知道如何进入波形发生器的“曲线”参数

简单地说,“oscidis”是一个在程序前面创建的波形整形器节点。OSCIDSV是我目前静态设置为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;
var wsCurve=new Float32Array();
如果((oscidisv>=-1)和&(oscidisv<1)){
var k=2*oscidisv/(1-oscidisv);
console.log
对于(变量i=0;i<16;i+=1){
//线性插值:x:=(c-a)*(z-y)/(b-a)+y
//a=0,b=2048,z=1,y=1,c=i
VarX=(i-0)*(1-(-1))/(16-0)+(1);
wsCurve[i]=(1+k)*x/(1+k*Math.abs(x));
}
}
oscidis.curve.value=wsCurve;

问题是——无论我在这里说什么,我都听不到声音上的任何差异。我并没有注意到任何真正的失真,即使失真最大(1)。你们知道一个更明显的失真波整形函数吗?或者,如果我在WebAudio API中做得对的话?

这里有一个我使用过的,它基于我在白皮书中找到的一些不同的函数以及类似的东西:

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;
};
函数make扭曲曲线(数量){
变量k=金额类型=='数量'?金额:50,
n_样本=44100,
曲线=新阵列(n_个样本),
deg=数学PI/180,
i=0,
x;
对于(;i
如果我告诉你我知道
3+k
20
从哪里来,那我就是在撒谎——但它是有效的

amount
的值基本上可以是任何正数,但我发现0-100是一个非常好的范围,这取决于您需要的失真程度


如果您有兴趣了解这些函数的外观,我在这里构建了一个小工具来帮助我可视化它们:

我采纳了上面的一些建议,并对函数进行了重新分解。我还将类型化数组中的样本数从44K减少到256,这使浏览器更快乐:-()

让失真滤波器=audioCtx.createWaveShapper();
扭曲过滤器.curve=生成扭曲曲线();
函数make扭曲曲线(数量=20){
设n_样本=256,曲线=newfloat32array(n_样本);
对于(设i=0;i
喜欢transfergraph工具!你可能也想想象一下通过传递函数的正弦波是什么样子。你是上帝。这正是我要找的。我现在想知道的是,从哪里可以得到更多的畸变曲线方程?我想尝试一些不同的!他们肯定很难找到。大多数听起来效果很好的算法都是专有的。像Amplitube、Line6等公司在这方面投入了大量的时间和金钱,他们需要保持竞争优势,因此很难找到好的信息。当然,真正高端的东西是使用比简单的波形发生器复杂得多的技术。。。但仍然如此。我能推荐的最好方法就是搜索一些东西,比如“吉他放大器波形发生器”,看看会出现什么。我就是这么做的。如果你选择一个1弧度的角度(而不是20度),用
PI
而不是神奇的数字3,那么函数经过(-1,-1)和(1,1),函数简化为
(PI+k)*x/(PI+k*abs(x))
。角度实际上只是一个输出比例因子(也可以是1),而PI实际上只是一个输入比例因子,因此函数的神秘性有所降低。谢谢@Grumdrig。顺便说一句,另一件可能对人们有用的事情是——对于吉他失真,假设你试图模拟放大器的声音,在扬声器柜中添加一个带有脉冲响应的
convalvernode
,会有很大帮助。如果你在谷歌上搜索一下,找到一些并不难。否则,你会听到像将吉他插入失真踏板并直接进入控制台的声音,这通常有点糟糕。卷积器会产生这样的效果,你实际上是在移动一些空气。
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;
}