rudimentary VU meters

This commit is contained in:
Andy Sloane 2015-10-26 10:53:23 -07:00
commit 10ea0b5f65
2 changed files with 17 additions and 1 deletions

View file

@ -11,9 +11,9 @@ todo:
- 8x
- others?
- various other XM effects are missing but nonessential
- vu meters
- oscilloscopes
</pre>
<canvas id='vu' width=300 height=64></canvas>
<pre id='debug'>
</pre>
<pre id='pattern'>

16
xm.js
View file

@ -268,6 +268,7 @@ function audio_cb(e) {
dataR.fill(0);
var offset = 0;
var ticklen = 0|(f_smp * 2.5 / bpm);
var VU = new Float32Array(nchan);
while(buflen > 0) {
if (cur_ticksamp >= ticklen) {
@ -303,6 +304,7 @@ function audio_cb(e) {
continue;
var k = ch.off;
var dk = ch.doff;
var Vrms = 0;
// console.log(j, offset, ch);
for (var i = offset; i < offset+tickduration; i++) {
if (ch.mute) break;
@ -324,6 +326,7 @@ function audio_cb(e) {
ch.vRprev = volR;
dataL[i] += ch.vL * si;
dataR[i] += ch.vR * si;
Vrms += ch.vL * ch.vR * si * si;
k += dk;
if (k >= sample_end) { // TODO: implement pingpong looping
if (loop) {
@ -353,11 +356,24 @@ function audio_cb(e) {
}
ch.off = k;
ch.doff = dk;
VU[j] += Vrms;
}
offset += tickduration;
cur_ticksamp += tickduration;
buflen -= tickduration;
}
// update VU meters
var canvas = document.getElementById("vu");
var ctx = canvas.getContext("2d");
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, 300, 64);
ctx.fillStyle = '#0f0';
for (var j = 0; j < nchan; j++) {
var rms = VU[j] / e.outputBuffer.length;
var y = -Math.log(rms)*10;
ctx.fillRect(j*16, y, 15, 64-y);
}
}
function eff_t0_0(ch, data) { // arpeggio