OP、ここにいくつかの擬似コードがあります。参考までに、これは Web オーディオに関する質問ではなく、アニメーションに関する質問です。
キャンバスの再描画を何秒遅らせるかを追跡するビジュアライザーのプロトタイプ関数に変数/フィールドを保存し、 requestAnimFrame(...) が描画されるたびにインクリメントする別のカウンターを保持します。カウンターが遅延量に達したら、キャンバスを再描画します。
編集
今考えてみると...解決策は非常に単純なはずです。間違っている場合は訂正してください。ただし、この大まかな解決策は、アニメーション ループ内から MicrophoneSample.visualize() を呼び出していることを前提としているため、コードは毎秒実行されます。MicrophoneSample オブジェクト コード、または少なくともアニメーション ループも投稿していただければ、さらにお役に立ちます。
/* NOTE!
*
*/
// Find a way to put these into your PARENT MicrophoneSample object
var delay = 5;
// Note that I am setting delayCount initially to zero - during the loop
// the delayCount will actually get reset to 1 from thereafter (not 0)...
// this gives us a way to initially draw your visualization on the first frame.
var delayCount = 0;
// Pull var times out so it doesn't get calculated each time.
var times = new Uint8Array(MicrophoneSample.analyser.frequencyBinCount);
// Same goes for the canvas...
// I would set these values inside of the PARENT MicrophoneSample object
MicrophoneSample.canvas.width = this.WIDTH;
MicrophoneSample.canvas.height = this.HEIGHT;
// you only need to establish the drawing context once. Do it in the PARENT
// MicrophoneSample object
var drawContext = this.canvas.getContext('2d');
MicrophoneSample.prototype.visualize = function() {
/*
* NOTE!
*/
// Here's the juicy meat & potatoes:
// only if the delayCount reaches the delay amount, should you UPDATE THE
// TIME DOMAIN DATA ARRAY (times)
// if your loop runs every second, then delayCount increments each second
// and after 5 seconds will reach your designated delay amount and update your
// times array.
if(delayCount == 0 || delayCount == delay) {
this.analyser.getByteTimeDomainData(times);
// Now, it would be redundant (and totally noob-programmer of you) to
// redraw the same visualization onto the canvas 5 times in a row, so
// only draw the visualization after the first pass through the loop and then
// every 5th pass after that :]
for (var i = 0; i < times.length; i++) {
var value = times[i];
var percent = value / 256;
var height = this.HEIGHT * percent;
var offset = this.HEIGHT - height - 1;
var barWidth = this.WIDTH/times.length;
drawContext.fillStyle = 'purple';
drawContext.fillRect(i * barWidth, offset, 1, 1);
}
// Note: 1, not 0!
delayCount = 1;
}
else {
delayCount++;
}
requestAnimFrame(this.visualize.bind(this));
}
そして、私は実際にこれをテストしていないことに注意してください. しかし、少なくとも正しい方向に向ける必要があります。