wam-community
Version:
A collection of prebuilt Web Audio Modules ready for use
301 lines (259 loc) • 8.23 kB
JavaScript
export default function WaveShapersDisto() {
var distorsionCurves = {};
buildDistorsionFactories();
function buildDistorsionFactories() {
distorsionCurves.standard = function (distorsionValue) {
var k = distorsionValue;
var c = classicDistorsion(k);
return c;
};
distorsionCurves.standardLower = function (distorsionValue) {
var k = distorsionValue;
var c = classicDistorsion2(k);
return c;
};
distorsionCurves.smooth = function (distorsionValue) {
var c = new Float32Array(44100);
var kTuna = distorsionValue / 1500;
smooth(kTuna, 44100, c);
return c;
};
distorsionCurves.fuzz = function (distorsionValue) {
var c = new Float32Array(44100);
var kTuna = distorsionValue / 1500;
fuzz(kTuna, 44100, c);
return c;
};
distorsionCurves.clean = function (distorsionValue) {
var c = new Float32Array(44100);
var kTuna = distorsionValue / 1500;
clean(kTuna, 44100, c);
return c;
};
distorsionCurves.asymetric = function (distorsionValue) {
var c = new Float32Array(44100);
var kTuna = distorsionValue / 1500;
asymetric(kTuna, 44100, c);
return c;
};
distorsionCurves.bezier = function (distorsionValue) {
var k = distorsionValue;
var c = getBezierCurve();
return c;
};
distorsionCurves.notSoDistorded = function (distorsionValue) {
var k = distorsionValue / 150;
var c = notSoDistorded(k);
return c;
};
distorsionCurves.crunch = function (distorsionValue) {
var k = distorsionValue / 150;
var c = crunch(k);
return c;
};
distorsionCurves.ClassA = function (distorsionValue) {
var k = distorsionValue / 150;
var c = classA(k);
return c;
};
distorsionCurves.superClean = function (distorsionValue) {
var k = distorsionValue / 150;
var c = superClean(k);
return c;
};
distorsionCurves.vertical = function (distorsionValue) {
var k = distorsionValue / 150;
var c = vertical(k);
return c;
};
distorsionCurves.superFuzz = function (distorsionValue) {
var k = distorsionValue / 150;
var c = superFuzz(k);
return c;
};
distorsionCurves.NoisyHiGain = function (distorsionValue) {
var k = distorsionValue / 10;
var c = NoisyHiGain(k);
return c;
};
distorsionCurves.HiGainModern = function (distorsionValue) {
var k = distorsionValue / 2;
var c = HiGainModern(k);
return c;
};
}
function classicDistorsion(k) {
var 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 * 57 * deg) / (Math.PI + k * Math.abs(x));
}
return curve;
}
function classicDistorsion2(k) {
var 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;
}
function smooth(amount, n_samples, ws_table) {
amount = Math.min(amount, 0.9);
var k = (2 * amount) / (1 - amount),
i,
x;
for (i = 0; i < n_samples; i++) {
x = (i * 2) / n_samples - 1;
ws_table[i] = ((1 + k) * x) / (1 + k * Math.abs(x));
}
}
function fuzz(amount, n_samples, ws_table) {
var i,
x,
y,
a = 1 - amount;
for (i = 0; i < n_samples; i++) {
x = (i * 2) / n_samples - 1;
y = x < 0 ? -Math.pow(Math.abs(x), a + 0.04) : Math.pow(x, a);
ws_table[i] = tanh(y * 2);
}
}
function clean(amount, n_samples, ws_table) {
var i,
x,
y,
abx,
a = 1 - amount > 0.99 ? 0.99 : 1 - amount;
for (i = 0; i < n_samples; i++) {
x = (i * 2) / n_samples - 1;
abx = Math.abs(x);
if (abx < a) y = abx;
else if (abx > a)
y = a + (abx - a) / (1 + Math.pow((abx - a) / (1 - a), 2));
else if (abx > 1) y = abx;
ws_table[i] = sign(x) * y * (1 / ((a + 1) / 2));
}
}
function asymetric(amount, n_samples, ws_table) {
var i, x;
for (i = 0; i < n_samples; i++) {
x = (i * 2) / n_samples - 1;
if (x < -0.08905) {
ws_table[i] =
(-3 / 4) *
(1 -
Math.pow(1 - (Math.abs(x) - 0.032857), 12) +
(1 / 3) * (Math.abs(x) - 0.032847)) +
0.01;
} else if (x >= -0.08905 && x < 0.320018) {
ws_table[i] = -6.153 * (x * x) + 3.9375 * x;
} else {
ws_table[i] = 0.630035;
}
}
}
function notSoDistorded(a) {
a = Math.pow(a + 2, 3);
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var f = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * f) / (1 + a * Math.abs(f));
}
return c;
}
function crunch(a) {
a = Math.pow(a, 2);
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var f = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * f) / (1 + a * Math.abs(f));
}
return c;
}
function classA(a) {
var c = new Float32Array(22050);
a = 10 + 3 * a;
for (var d = 0; 22050 > d; d += 1) {
var e = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * e) / (1 + a * Math.abs(e));
}
return c;
}
function superClean(a) {
a = (a + 6) / 4;
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var e = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * e) / (1 + a * Math.abs(e));
}
return c;
}
function vertical(a) {
a = Math.pow(a + 2, 3);
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var e = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * e) / (1 + a * Math.abs(e));
}
return c;
}
function superFuzz(a) {
a = Math.pow(a, 3);
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var e = (2 * d) / 22050 - 1;
c[d] = ((1 + a) * e) / (1 + a * Math.abs(e));
}
return c;
}
function NoisyHiGain(a) {
a /= 153;
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1)
c[d] = (0 > (2 * d) / 22050 - 1 ? -1 : 1) * a;
return c;
}
function HiGainModern(a) {
a = 1 / (1 + Math.pow(a, 4));
for (var c = new Float32Array(22050), d = 0; 22050 > d; d += 1) {
var e = (2 * d) / 22050 - 1;
c[d] = e / (Math.abs(e) + a);
}
return c;
}
function bezier(t, p0, p1, p2, p3) {
var cX = 3 * (p1.x - p0.x),
bX = 3 * (p2.x - p1.x) - cX,
aX = p3.x - p0.x - cX - bX;
var cY = 3 * (p1.y - p0.y),
bY = 3 * (p2.y - p1.y) - cY,
aY = p3.y - p0.y - cY - bY;
var x = aX * Math.pow(t, 3) + bX * Math.pow(t, 2) + cX * t + p0.x;
var y = aY * Math.pow(t, 3) + bY * Math.pow(t, 2) + cY * t + p0.y;
return { x: x, y: y };
}
function getBezierCurve() {
var p0 = { x: 0, y: 100 };
var p1 = { x: 10, y: 50 };
var p2 = { x: 0, y: 50 };
var p3 = { x: 100, y: 0 };
var n_samples = 44100,
accuracy = 1 / n_samples,
curve = new Float32Array(n_samples),
index = 0;
curve[index++] = map(p0.y, 0, 100, 1, -1);
//
for (var i = 0; i < 1; i += accuracy) {
var p = bezier(i, p0, p1, p2, p3);
curve[index++] = map(p.y, 0, 100, 1, -1);
}
return curve;
}
return {
buildDistorsionFactories: buildDistorsionFactories,
distorsionCurves: distorsionCurves,
};
}