diff --git a/test/helper/Meter.js b/test/helper/Meter.js new file mode 100644 index 00000000..e7913bab --- /dev/null +++ b/test/helper/Meter.js @@ -0,0 +1,55 @@ +define(["Tone/core/Tone"], function (Tone) { + + //hold onto the current context + var onlineContext = Tone.context; + + /** + * OFFLINE TESTING + */ + var Meter = function(duration){ + duration = duration || 1; + var sampleRate = 44100; + //dummy functions + this._before = Tone.noOp; + this._after = Tone.noOp; + this._test = Tone.noOp; + var rmsFrame = 256; + //offline rendering context + this.context = new OfflineAudioContext(1, sampleRate * duration, sampleRate); + this.context.oncomplete = function(e){ + var buffer = e.renderedBuffer.getChannelData(0); + for (var j = 0; j < buffer.length; j++){ + var sum = 0; + if (j >= rmsFrame){ + for (var k = j - rmsFrame; k < j; k++){ + sum += buffer[k] * buffer[k]; + } + this._test(Math.sqrt(sum / rmsFrame), j / sampleRate); + } + } + this._after(); + //reset the old context + Tone.setContext(onlineContext); + }.bind(this); + }; + + Meter.prototype.run = function(){ + Tone.setContext(this.context); + this._before(this.context.destination); + this.context.startRendering(); + }; + + Meter.prototype.before = function(cb){ + this._before = cb; + }; + + Meter.prototype.after = function(cb){ + this._after = cb; + }; + + Meter.prototype.test = function(cb){ + this._test = cb; + }; + + return Meter; +}); \ No newline at end of file