optimizing filters, work in progress
This commit is contained in:
parent
597d9cfc6e
commit
f8a278f456
1 changed files with 15 additions and 18 deletions
33
xm.js
33
xm.js
|
|
@ -74,6 +74,8 @@ function FilterCoeffs(f_c) {
|
||||||
return [gain, 2*c, -c*c - s*s];
|
return [gain, 2*c, -c*c - s*s];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
popfilter = FilterCoeffs(200.0 / 44100.0);
|
||||||
|
|
||||||
function Filter(x, coef, state) {
|
function Filter(x, coef, state) {
|
||||||
var y = coef[0] * (x + state[0]) + coef[1]*state[1] + coef[2]*state[2];
|
var y = coef[0] * (x + state[0]) + coef[1]*state[1] + coef[2]*state[2];
|
||||||
state[0] = x;
|
state[0] = x;
|
||||||
|
|
@ -290,20 +292,12 @@ function audio_cb(e) {
|
||||||
var dk = ch.doff;
|
var dk = ch.doff;
|
||||||
// console.log(j, offset, ch);
|
// console.log(j, offset, ch);
|
||||||
for (var i = offset; i < offset+tickduration; i++) {
|
for (var i = offset; i < offset+tickduration; i++) {
|
||||||
var kk = k|0;
|
var si = samp[k|0];
|
||||||
var si = samp[kk];
|
si = Filter(si, ch.filter, ch.filterstate);
|
||||||
/*
|
var vl = Filter(volL, popfilter, ch.popfilterstate[0]);
|
||||||
// bilinear filtering
|
var vr = Filter(volR, popfilter, ch.popfilterstate[1]);
|
||||||
var sj = si;
|
dataL[i] += vl * si;
|
||||||
if (kk < sample_end-1)
|
dataR[i] += vr * si;
|
||||||
sj = samp[kk+1];
|
|
||||||
var t = k - kk;
|
|
||||||
si = t * sj + (1 - t) * si;
|
|
||||||
*/
|
|
||||||
vl = Filter(volL, ch.popfilter, ch.popfilterstate[0]);
|
|
||||||
vr = Filter(volR, ch.popfilter, ch.popfilterstate[1]);
|
|
||||||
dataL[i] += Filter(vl * si, ch.filter, ch.filterstate[0]);
|
|
||||||
dataR[i] += Filter(vr * si, ch.filter, ch.filterstate[1]);
|
|
||||||
k += dk;
|
k += dk;
|
||||||
if (k >= sample_end) { // TODO: implement pingpong looping
|
if (k >= sample_end) { // TODO: implement pingpong looping
|
||||||
if (loop) {
|
if (loop) {
|
||||||
|
|
@ -311,10 +305,13 @@ function audio_cb(e) {
|
||||||
} else {
|
} else {
|
||||||
// kill sample
|
// kill sample
|
||||||
ch.inst = undefined;
|
ch.inst = undefined;
|
||||||
for (i++; i < offset+tickduration; i++) {
|
// ramp down with the pop filter
|
||||||
|
var rampend = Math.min(offset+tickduration, i+200);
|
||||||
|
for (i++; i < rampend; i++) {
|
||||||
// fill rest of buffer with filtered silence to avoid a pop
|
// fill rest of buffer with filtered silence to avoid a pop
|
||||||
dataL[i] += Filter(0, ch.popfilter, ch.filterstate[0]);
|
var s = Filter(0, popfilter, ch.filterstate);
|
||||||
dataR[i] += Filter(0, ch.popfilter, ch.filterstate[1]);
|
dataL[i] += vl * s;
|
||||||
|
dataR[i] += vr * s;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -370,7 +367,7 @@ function playXM(arrayBuf) {
|
||||||
bpm = dv.getUint16(0x4e, true);
|
bpm = dv.getUint16(0x4e, true);
|
||||||
for (var i = 0; i < nchan; i++) {
|
for (var i = 0; i < nchan; i++) {
|
||||||
channelinfo.push({
|
channelinfo.push({
|
||||||
filterstate: [new Float32Array(3), new Float32Array(3)],
|
filterstate: new Float32Array(3),
|
||||||
popfilter: FilterCoeffs(200.0 / 44100.0),
|
popfilter: FilterCoeffs(200.0 / 44100.0),
|
||||||
popfilterstate: [new Float32Array(3), new Float32Array(3)],
|
popfilterstate: [new Float32Array(3), new Float32Array(3)],
|
||||||
vol: 0,
|
vol: 0,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue