diff options
| author | Jules Laplace <jules@okfoc.us> | 2012-09-24 17:54:41 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2012-09-24 17:54:41 -0400 |
| commit | c3c112aee29a0358e628ba4434592fcbc56135ea (patch) | |
| tree | 5bc4385b0d0123dc6da219585a7ffd14851c4420 | |
| parent | e8db5488d2be5af228c45f9eb13c884e365ed2c2 (diff) | |
too-large buffer was the issue
| -rw-r--r-- | public/js/grid.js | 18 | ||||
| -rw-r--r-- | public/js/vendor/Audiolet.js | 680 | ||||
| -rw-r--r-- | public/js/vendor/Audiolet.min.js | 252 |
3 files changed, 507 insertions, 443 deletions
diff --git a/public/js/grid.js b/public/js/grid.js index eeae315..0a4aece 100644 --- a/public/js/grid.js +++ b/public/js/grid.js @@ -1,6 +1,6 @@ -var bufferSize = 65536 / 2; +var bufferSize = 4096; // 65536 / 2; var sampleRate = 44100; var latency = 1000 * bufferSize / sampleRate; var audioletReady = false; @@ -17,7 +17,7 @@ function Sampler (audiolet, url) { // first get the sample and load it into a buffer var buffer = new AudioletBuffer(1, 0); - buffer.load(sample, false); + buffer.load(url, false); // connect the buffer to a player and set up the objects we need this.trigger = new TriggerControl(this.audiolet); @@ -25,9 +25,9 @@ function Sampler (audiolet, url) { this.gain = new Gain(this.audiolet, 0.80); // trigger -> player -> gain -> OUTPUT - trigger.connect(player, 0, 1); - player.connect(gain); - gain.connect(this.audiolet.output); + this.trigger.connect(this.player, 0, 1); + this.player.connect(this.gain); + this.gain.connect(this.audiolet.output); this.mute = function(){ base.gain.setValue(0); @@ -39,6 +39,7 @@ function Sampler (audiolet, url) { function Sequencer (audiolet, instrument) { var base = this; + this.audiolet = audiolet; this.instrument = instrument; this.pattern = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; @@ -68,7 +69,8 @@ function AudioletApp () { this.sequencers.push(sequencer); } } - + +var Audio = new AudioletApp(); function Grid (app){ var base = this; @@ -84,9 +86,7 @@ function Grid (app){ tick = tempo; } base.toggle = toggle; - - - var Audio = new AudioletApp(); + var tog = 0; var playing = false; diff --git a/public/js/vendor/Audiolet.js b/public/js/vendor/Audiolet.js index b7be12e..66dc9e8 100644 --- a/public/js/vendor/Audiolet.js +++ b/public/js/vendor/Audiolet.js @@ -1,4 +1,19 @@ /** + * The base audiolet object. Contains an output node which pulls data from + * connected nodes. + * + * @constructor + * @param {Number} [sampleRate=44100] The sample rate to run at. + * @param {Number} [numberOfChannels=2] The number of output channels. + * @param {Number} [bufferSize] Block size. If undefined uses a sane default. + */ +var Audiolet = function(sampleRate, numberOfChannels, bufferSize) { + this.output = new AudioletDestination(this, sampleRate, + numberOfChannels, bufferSize); +}; + + +/** * A variable size multi-channel audio buffer. * * @constructor @@ -836,21 +851,6 @@ AudioletInput.prototype.toString = function() { /** - * The base audiolet object. Contains an output node which pulls data from - * connected nodes. - * - * @constructor - * @param {Number} [sampleRate=44100] The sample rate to run at. - * @param {Number} [numberOfChannels=2] The number of output channels. - * @param {Number} [bufferSize] Block size. If undefined uses a sane default. - */ -var Audiolet = function(sampleRate, numberOfChannels, bufferSize) { - this.output = new AudioletDestination(this, sampleRate, - numberOfChannels, bufferSize); -}; - - -/** * Class representing a single output of an AudioletNode * * @constructor @@ -2604,6 +2604,80 @@ CrossFade.prototype.toString = function() { */ /** + * Filter for leaking DC offset. Maths is taken from + * https://ccrma.stanford.edu/~jos/filters/DC_Blocker.html + * + * **Inputs** + * + * - Audio + * - Filter coefficient + * + * **Outputs** + * + * - Filtered audio + * + * **Parameters** + * + * - coefficient The filter coefficient. Linked to input 1. + * + * @constructor + * @extends AudioletNode + * @param {Audiolet} audiolet The audiolet object. + * @param {Number} [coefficient=0.995] The initial coefficient. + */ +var DCFilter = function(audiolet, coefficient) { + AudioletNode.call(this, audiolet, 2, 1); + + // Same number of output channels as input channels + this.linkNumberOfOutputChannels(0, 0); + + this.coefficient = new AudioletParameter(this, 1, coefficient || 0.995); + + // Delayed values + this.xValues = []; + this.yValues = []; +}; +extend(DCFilter, AudioletNode); + +/** + * Process samples + */ +DCFilter.prototype.generate = function() { + var coefficient = this.coefficient.getValue(); + var input = this.inputs[0]; + var numberOfChannels = input.samples.length; + for (var i = 0; i < numberOfChannels; i++) { + if (i >= this.xValues.length) { + this.xValues.push(0); + } + if (i >= this.yValues.length) { + this.yValues.push(0); + } + + var x0 = input.samples[i]; + var y0 = x0 - this.xValues[i] + coefficient * this.yValues[i]; + + this.outputs[0].samples[i] = y0; + + this.xValues[i] = x0; + this.yValues[i] = y0; + } +}; + +/** + * toString + * + * @return {String} String representation. + */ +DCFilter.prototype.toString = function() { + return 'DC Filter'; +}; + +/*! + * @depends ../core/AudioletNode.js + */ + +/** * Damped comb filter * * **Inputs** @@ -2704,80 +2778,6 @@ DampedCombFilter.prototype.toString = function() { */ /** - * Filter for leaking DC offset. Maths is taken from - * https://ccrma.stanford.edu/~jos/filters/DC_Blocker.html - * - * **Inputs** - * - * - Audio - * - Filter coefficient - * - * **Outputs** - * - * - Filtered audio - * - * **Parameters** - * - * - coefficient The filter coefficient. Linked to input 1. - * - * @constructor - * @extends AudioletNode - * @param {Audiolet} audiolet The audiolet object. - * @param {Number} [coefficient=0.995] The initial coefficient. - */ -var DCFilter = function(audiolet, coefficient) { - AudioletNode.call(this, audiolet, 2, 1); - - // Same number of output channels as input channels - this.linkNumberOfOutputChannels(0, 0); - - this.coefficient = new AudioletParameter(this, 1, coefficient || 0.995); - - // Delayed values - this.xValues = []; - this.yValues = []; -}; -extend(DCFilter, AudioletNode); - -/** - * Process samples - */ -DCFilter.prototype.generate = function() { - var coefficient = this.coefficient.getValue(); - var input = this.inputs[0]; - var numberOfChannels = input.samples.length; - for (var i = 0; i < numberOfChannels; i++) { - if (i >= this.xValues.length) { - this.xValues.push(0); - } - if (i >= this.yValues.length) { - this.yValues.push(0); - } - - var x0 = input.samples[i]; - var y0 = x0 - this.xValues[i] + coefficient * this.yValues[i]; - - this.outputs[0].samples[i] = y0; - - this.xValues[i] = x0; - this.yValues[i] = y0; - } -}; - -/** - * toString - * - * @return {String} String representation. - */ -DCFilter.prototype.toString = function() { - return 'DC Filter'; -}; - -/*! - * @depends ../core/AudioletNode.js - */ - -/** * A simple delay line. * * **Inputs** @@ -2934,98 +2934,6 @@ DiscontinuityDetector.prototype.toString = function() { */ /** - * Delay line with feedback - * - * **Inputs** - * - * - Audio - * - Delay Time - * - Feedback - * - Mix - * - * **Outputs** - * - * - Delayed audio - * - * **Parameters** - * - * - delayTime The delay time in seconds. Linked to input 1. - * - feedback The amount of feedback. Linked to input 2. - * - mix The amount of delay to mix into the dry signal. Linked to input 3. - * - * @constructor - * @extends AudioletNode - * @param {Audiolet} audiolet The audiolet object. - * @param {Number} maximumDelayTime The largest allowable delay time. - * @param {Number} delayTime The initial delay time. - * @param {Number} feedabck The initial feedback amount. - * @param {Number} mix The initial mix amount. - */ -var FeedbackDelay = function(audiolet, maximumDelayTime, delayTime, feedback, - mix) { - AudioletNode.call(this, audiolet, 4, 1); - this.linkNumberOfOutputChannels(0, 0); - this.maximumDelayTime = maximumDelayTime; - this.delayTime = new AudioletParameter(this, 1, delayTime || 1); - this.feedback = new AudioletParameter(this, 2, feedback || 0.5); - this.mix = new AudioletParameter(this, 3, mix || 1); - var bufferSize = maximumDelayTime * this.audiolet.device.sampleRate; - this.buffers = []; - this.readWriteIndex = 0; -}; -extend(FeedbackDelay, AudioletNode); - -/** - * Process samples - */ -FeedbackDelay.prototype.generate = function() { - var input = this.inputs[0]; - var output = this.outputs[0]; - - var sampleRate = this.audiolet.output.device.sampleRate; - - var delayTime = this.delayTime.getValue() * sampleRate; - var feedback = this.feedback.getValue(); - var mix = this.mix.getValue(); - - var numberOfChannels = input.samples.length; - var numberOfBuffers = this.buffers.length; - for (var i = 0; i < numberOfChannels; i++) { - if (i >= numberOfBuffers) { - // Create buffer for channel if it doesn't already exist - var bufferSize = this.maximumDelayTime * sampleRate; - this.buffers.push(new Float32Array(bufferSize)); - } - - var buffer = this.buffers[i]; - - var inputSample = input.samples[i]; - var bufferSample = buffer[this.readWriteIndex]; - - output.samples[i] = mix * bufferSample + (1 - mix) * inputSample; - buffer[this.readWriteIndex] = inputSample + feedback * bufferSample; - } - - this.readWriteIndex += 1; - if (this.readWriteIndex >= delayTime) { - this.readWriteIndex = 0; - } -}; - -/** - * toString - * - * @return {String} String representation. - */ -FeedbackDelay.prototype.toString = function() { - return 'Feedback Delay'; -}; - -/*! - * @depends ../core/AudioletNode.js - */ - -/** * Fast Fourier Transform * * **Inputs** @@ -3161,6 +3069,98 @@ FFT.prototype.toString = function() { * @depends ../core/AudioletNode.js */ +/** + * Delay line with feedback + * + * **Inputs** + * + * - Audio + * - Delay Time + * - Feedback + * - Mix + * + * **Outputs** + * + * - Delayed audio + * + * **Parameters** + * + * - delayTime The delay time in seconds. Linked to input 1. + * - feedback The amount of feedback. Linked to input 2. + * - mix The amount of delay to mix into the dry signal. Linked to input 3. + * + * @constructor + * @extends AudioletNode + * @param {Audiolet} audiolet The audiolet object. + * @param {Number} maximumDelayTime The largest allowable delay time. + * @param {Number} delayTime The initial delay time. + * @param {Number} feedabck The initial feedback amount. + * @param {Number} mix The initial mix amount. + */ +var FeedbackDelay = function(audiolet, maximumDelayTime, delayTime, feedback, + mix) { + AudioletNode.call(this, audiolet, 4, 1); + this.linkNumberOfOutputChannels(0, 0); + this.maximumDelayTime = maximumDelayTime; + this.delayTime = new AudioletParameter(this, 1, delayTime || 1); + this.feedback = new AudioletParameter(this, 2, feedback || 0.5); + this.mix = new AudioletParameter(this, 3, mix || 1); + var bufferSize = maximumDelayTime * this.audiolet.device.sampleRate; + this.buffers = []; + this.readWriteIndex = 0; +}; +extend(FeedbackDelay, AudioletNode); + +/** + * Process samples + */ +FeedbackDelay.prototype.generate = function() { + var input = this.inputs[0]; + var output = this.outputs[0]; + + var sampleRate = this.audiolet.output.device.sampleRate; + + var delayTime = this.delayTime.getValue() * sampleRate; + var feedback = this.feedback.getValue(); + var mix = this.mix.getValue(); + + var numberOfChannels = input.samples.length; + var numberOfBuffers = this.buffers.length; + for (var i = 0; i < numberOfChannels; i++) { + if (i >= numberOfBuffers) { + // Create buffer for channel if it doesn't already exist + var bufferSize = this.maximumDelayTime * sampleRate; + this.buffers.push(new Float32Array(bufferSize)); + } + + var buffer = this.buffers[i]; + + var inputSample = input.samples[i]; + var bufferSample = buffer[this.readWriteIndex]; + + output.samples[i] = mix * bufferSample + (1 - mix) * inputSample; + buffer[this.readWriteIndex] = inputSample + feedback * bufferSample; + } + + this.readWriteIndex += 1; + if (this.readWriteIndex >= delayTime) { + this.readWriteIndex = 0; + } +}; + +/** + * toString + * + * @return {String} String representation. + */ +FeedbackDelay.prototype.toString = function() { + return 'Feedback Delay'; +}; + +/*! + * @depends ../core/AudioletNode.js + */ + /* * Multiply values * @@ -5634,6 +5634,322 @@ var EqualTemperamentTuning = function(pitchesPerOctave) { }; extend(EqualTemperamentTuning, Tuning); +function AudioFileRequest(url, async) { + this.url = url; + if (typeof async == 'undefined' || async == null) { + async = true; + } + this.async = async; + var splitURL = url.split('.'); + this.extension = splitURL[splitURL.length - 1].toLowerCase(); +} + +AudioFileRequest.prototype.onSuccess = function(decoded) { +}; + +AudioFileRequest.prototype.onFailure = function(decoded) { +}; + + +AudioFileRequest.prototype.send = function() { + if (this.extension != 'wav' && + this.extension != 'aiff' && + this.extension != 'aif') { + this.onFailure(); + return; + } + + var request = new XMLHttpRequest(); + request.open('GET', this.url, this.async); + request.overrideMimeType('text/plain; charset=x-user-defined'); + request.onreadystatechange = function(event) { + if (request.readyState == 4) { + if (request.status == 200 || request.status == 0) { + this.handleResponse(request.responseText); + } + else { + this.onFailure(); + } + } + }.bind(this); + request.send(null); +}; + +AudioFileRequest.prototype.handleResponse = function(data) { + var decoder, decoded; + if (this.extension == 'wav') { + decoder = new WAVDecoder(); + decoded = decoder.decode(data); + } + else if (this.extension == 'aiff' || this.extension == 'aif') { + decoder = new AIFFDecoder(); + decoded = decoder.decode(data); + } + this.onSuccess(decoded); +}; + + +function Decoder() { +} + +Decoder.prototype.readString = function(data, offset, length) { + return data.slice(offset, offset + length); +}; + +Decoder.prototype.readIntL = function(data, offset, length) { + var value = 0; + for (var i = 0; i < length; i++) { + value = value + ((data.charCodeAt(offset + i) & 0xFF) * + Math.pow(2, 8 * i)); + } + return value; +}; + +Decoder.prototype.readChunkHeaderL = function(data, offset) { + var chunk = {}; + chunk.name = this.readString(data, offset, 4); + chunk.length = this.readIntL(data, offset + 4, 4); + return chunk; +}; + +Decoder.prototype.readIntB = function(data, offset, length) { + var value = 0; + for (var i = 0; i < length; i++) { + value = value + ((data.charCodeAt(offset + i) & 0xFF) * + Math.pow(2, 8 * (length - i - 1))); + } + return value; +}; + +Decoder.prototype.readChunkHeaderB = function(data, offset) { + var chunk = {}; + chunk.name = this.readString(data, offset, 4); + chunk.length = this.readIntB(data, offset + 4, 4); + return chunk; +}; + +Decoder.prototype.readFloatB = function(data, offset) { + var expon = this.readIntB(data, offset, 2); + var range = 1 << 16 - 1; + if (expon >= range) { + expon |= ~(range - 1); + } + + var sign = 1; + if (expon < 0) { + sign = -1; + expon += range; + } + + var himant = this.readIntB(data, offset + 2, 4); + var lomant = this.readIntB(data, offset + 6, 4); + var value; + if (expon == himant == lomant == 0) { + value = 0; + } + else if (expon == 0x7FFF) { + value = Number.MAX_VALUE; + } + else { + expon -= 16383; + value = (himant * 0x100000000 + lomant) * Math.pow(2, expon - 63); + } + return sign * value; +}; + +function WAVDecoder(data) { +} + +WAVDecoder.prototype.__proto__ = Decoder.prototype; + +WAVDecoder.prototype.decode = function(data) { + var decoded = {}; + var offset = 0; + // Header + var chunk = this.readChunkHeaderL(data, offset); + offset += 8; + if (chunk.name != 'RIFF') { + console.error('File is not a WAV'); + return null; + } + + var fileLength = chunk.length; + fileLength += 8; + + var wave = this.readString(data, offset, 4); + offset += 4; + if (wave != 'WAVE') { + console.error('File is not a WAV'); + return null; + } + + while (offset < fileLength) { + var chunk = this.readChunkHeaderL(data, offset); + offset += 8; + if (chunk.name == 'fmt ') { + // File encoding + var encoding = this.readIntL(data, offset, 2); + offset += 2; + + if (encoding != 0x0001) { + // Only support PCM + console.error('Cannot decode non-PCM encoded WAV file'); + return null; + } + + // Number of channels + var numberOfChannels = this.readIntL(data, offset, 2); + offset += 2; + + // Sample rate + var sampleRate = this.readIntL(data, offset, 4); + offset += 4; + + // Ignore bytes/sec - 4 bytes + offset += 4; + + // Ignore block align - 2 bytes + offset += 2; + + // Bit depth + var bitDepth = this.readIntL(data, offset, 2); + var bytesPerSample = bitDepth / 8; + offset += 2; + } + + else if (chunk.name == 'data') { + // Data must come after fmt, so we are okay to use it's variables + // here + var length = chunk.length / (bytesPerSample * numberOfChannels); + var channels = []; + for (var i = 0; i < numberOfChannels; i++) { + channels.push(new Float32Array(length)); + } + + for (var i = 0; i < numberOfChannels; i++) { + var channel = channels[i]; + for (var j = 0; j < length; j++) { + var index = offset; + index += (j * numberOfChannels + i) * bytesPerSample; + // Sample + var value = this.readIntL(data, index, bytesPerSample); + // Scale range from 0 to 2**bitDepth -> -2**(bitDepth-1) to + // 2**(bitDepth-1) + var range = 1 << bitDepth - 1; + if (value >= range) { + value |= ~(range - 1); + } + // Scale range to -1 to 1 + channel[j] = value / range; + } + } + offset += chunk.length; + } + else { + offset += chunk.length; + } + } + decoded.sampleRate = sampleRate; + decoded.bitDepth = bitDepth; + decoded.channels = channels; + decoded.length = length; + return decoded; +}; + + +function AIFFDecoder() { +} + +AIFFDecoder.prototype.__proto__ = Decoder.prototype; + +AIFFDecoder.prototype.decode = function(data) { + var decoded = {}; + var offset = 0; + // Header + var chunk = this.readChunkHeaderB(data, offset); + offset += 8; + if (chunk.name != 'FORM') { + console.error('File is not an AIFF'); + return null; + } + + var fileLength = chunk.length; + fileLength += 8; + + var aiff = this.readString(data, offset, 4); + offset += 4; + if (aiff != 'AIFF') { + console.error('File is not an AIFF'); + return null; + } + + while (offset < fileLength) { + var chunk = this.readChunkHeaderB(data, offset); + offset += 8; + if (chunk.name == 'COMM') { + // Number of channels + var numberOfChannels = this.readIntB(data, offset, 2); + offset += 2; + + // Number of samples + var length = this.readIntB(data, offset, 4); + offset += 4; + + var channels = []; + for (var i = 0; i < numberOfChannels; i++) { + channels.push(new Float32Array(length)); + } + + // Bit depth + var bitDepth = this.readIntB(data, offset, 2); + var bytesPerSample = bitDepth / 8; + offset += 2; + + // Sample rate + var sampleRate = this.readFloatB(data, offset); + offset += 10; + } + else if (chunk.name == 'SSND') { + // Data offset + var dataOffset = this.readIntB(data, offset, 4); + offset += 4; + + // Ignore block size + offset += 4; + + // Skip over data offset + offset += dataOffset; + + for (var i = 0; i < numberOfChannels; i++) { + var channel = channels[i]; + for (var j = 0; j < length; j++) { + var index = offset; + index += (j * numberOfChannels + i) * bytesPerSample; + // Sample + var value = this.readIntB(data, index, bytesPerSample); + // Scale range from 0 to 2**bitDepth -> -2**(bitDepth-1) to + // 2**(bitDepth-1) + var range = 1 << bitDepth - 1; + if (value >= range) { + value |= ~(range - 1); + } + // Scale range to -1 to 1 + channel[j] = value / range; + } + } + offset += chunk.length - dataOffset - 8; + } + else { + offset += chunk.length; + } + } + decoded.sampleRate = sampleRate; + decoded.bitDepth = bitDepth; + decoded.channels = channels; + decoded.length = length; + return decoded; +}; + var Sink = this.Sink = function (global) { /** @@ -6431,7 +6747,7 @@ sinks('webaudio', function (readFn, channelCount, bufferSize, sampleRate) { soundData = null, zeroBuffer = null; self.start.apply(self, arguments); - node = context.createJavaScriptNode(self.bufferSize, 0, self.channelCount); + node = context.createJavaScriptNode(self.bufferSize, self.channelCount, self.channelCount); function bufferFill(e) { var outputBuffer = e.outputBuffer, diff --git a/public/js/vendor/Audiolet.min.js b/public/js/vendor/Audiolet.min.js deleted file mode 100644 index 388c5c5..0000000 --- a/public/js/vendor/Audiolet.min.js +++ /dev/null @@ -1,252 +0,0 @@ -var AudioletBuffer=function(a,c){this.numberOfChannels=a;this.length=c;this.channels=[];for(var b=0;b<this.numberOfChannels;b++){this.channels.push(new Float32Array(c))}this.unslicedChannels=[];for(var b=0;b<this.numberOfChannels;b++){this.unslicedChannels.push(this.channels[b])}this.isEmpty=false;this.channelOffset=0};AudioletBuffer.prototype.getChannelData=function(a){return(this.channels[a])};AudioletBuffer.prototype.set=function(a){var b=a.numberOfChannels;for(var c=0;c<b;c++){this.channels[c].set(a.getChannelData(c))}};AudioletBuffer.prototype.setSection=function(c,g,f,b){f=f||0;b=b||0;var d=c.numberOfChannels;for(var e=0;e<d;e++){f+=c.channelOffset;b+=this.channelOffset;var a=this.unslicedChannels[e].subarray(b,b+g);var h=c.unslicedChannels[e].subarray(f,f+g); -/*! - var channel1 = this.getChannelData(i).subarray(outputOffset, - outputOffset + - length); - var channel2 = buffer.getChannelData(i).subarray(inputOffset, - inputOffset + - length); - */ -a.set(h)}};AudioletBuffer.prototype.add=function(b){var f=this.length;var d=b.numberOfChannels;for(var e=0;e<d;e++){var a=this.getChannelData(e);var g=b.getChannelData(e);for(var c=0;c<f;c++){a[c]+=g[c]}}};AudioletBuffer.prototype.addSection=function(f,b,h,a){h=h||0;a=a||0;var k=f.numberOfChannels;for(var g=0;g<k;g++){var d=this.getChannelData(g);var c=f.getChannelData(g);for(var e=0;e<b;e++){d[e+a]+=c[e+h]}}};AudioletBuffer.prototype.resize=function(n,c,e,g){g=g||0;var j=this.channels;var b=this.unslicedChannels;var d=this.length;var f=this.channelOffset+g;for(var h=0;h<n;h++){var k=j[h];var m=b[h];if(c>d){var l=k;if(!e||!m||m.length<c){m=new Float32Array(c)}k=m.subarray(0,c);if(!e&&l){k.set(l,g)}f=0}else{if(!m){var a=b[0].length;m=new Float32Array(a)}g=f;k=m.subarray(g,g+c)}j[h]=k;b[h]=m}this.channels=j.slice(0,n);this.unslicedChannels=b.slice(0,n);this.length=c;this.numberOfChannels=n;this.channelOffset=f};AudioletBuffer.prototype.push=function(a){var b=a.length;this.resize(this.numberOfChannels,this.length+b);this.setSection(a,b,0,this.length-b)};AudioletBuffer.prototype.pop=function(a){var b=a.length;var c=this.length-b;a.setSection(this,b,c,0);this.resize(this.numberOfChannels,c)};AudioletBuffer.prototype.unshift=function(a){var b=a.length;this.resize(this.numberOfChannels,this.length+b,false,b);this.setSection(a,b,0,0)};AudioletBuffer.prototype.shift=function(a){var b=a.length;a.setSection(this,b,0,0);this.resize(this.numberOfChannels,this.length-b,false,b)};AudioletBuffer.prototype.zero=function(){var b=this.numberOfChannels;for(var c=0;c<b;c++){var e=this.getChannelData(c);var d=this.length;for(var a=0;a<d;a++){e[a]=0}}};AudioletBuffer.prototype.combined=function(){var a=this.channels;var b=this.numberOfChannels;var e=this.length;var d=new Float32Array(b*e);for(var c=0;c<b;c++){d.set(a[c],c*e)}return d};AudioletBuffer.prototype.interleaved=function(){var a=this.channels;var c=this.numberOfChannels;var e=this.length;var f=new Float32Array(c*e);for(var d=0;d<e;d++){for(var b=0;b<c;b++){f[c*d+b]=a[b][d]}}return f};AudioletBuffer.prototype.copy=function(){var a=new AudioletBuffer(this.numberOfChannels,this.length);a.set(this);return a};AudioletBuffer.prototype.load=function(c,a,d){var b=new AudioFileRequest(c,a);b.onSuccess=function(e){this.length=e.length;this.numberOfChannels=e.channels.length;this.unslicedChannels=e.channels;this.channels=e.channels;this.channelOffset=0;if(d){d()}}.bind(this);b.onFailure=function(){console.error("Could not load",c)}.bind(this);b.send()};var AudioletGroup=function(b,a,d){this.audiolet=b;this.inputs=[];for(var c=0;c<a;c++){this.inputs.push(new PassThroughNode(this.audiolet,1,1))}this.outputs=[];for(var c=0;c<d;c++){this.outputs.push(new PassThroughNode(this.audiolet,1,1))}};AudioletGroup.prototype.connect=function(c,b,a){this.outputs[b||0].connect(c,0,a)};AudioletGroup.prototype.disconnect=function(c,b,a){this.outputs[b||0].disconnect(c,0,a)};AudioletGroup.prototype.remove=function(){var a=this.inputs.length;for(var b=0;b<a;b++){this.inputs[b].remove()}var c=this.outputs.length;for(var b=0;b<c;b++){this.outputs[b].remove()}}; -/*! - * @depends AudioletGroup.js - */ -var AudioletDestination=function(c,b,a,d){AudioletGroup.call(this,c,1,0);this.device=new AudioletDevice(c,b,a,d);c.device=this.device;this.scheduler=new Scheduler(c);c.scheduler=this.scheduler;this.upMixer=new UpMixer(c,this.device.numberOfChannels);this.inputs[0].connect(this.scheduler);this.scheduler.connect(this.upMixer);this.upMixer.connect(this.device)};extend(AudioletDestination,AudioletGroup);AudioletDestination.prototype.toString=function(){return"Destination"};var AudioletNode=function(c,b,e,a){this.audiolet=c;this.inputs=[];for(var d=0;d<b;d++){this.inputs.push(new AudioletInput(this,d))}this.outputs=[];for(var d=0;d<e;d++){this.outputs.push(new AudioletOutput(this,d))}if(a){this.generate=a}};AudioletNode.prototype.connect=function(d,c,b){if(d instanceof AudioletGroup){d=d.inputs[b||0];b=0}var a=this.outputs[c||0];var e=d.inputs[b||0];a.connect(e);e.connect(a);this.audiolet.device.needTraverse=true};AudioletNode.prototype.disconnect=function(d,c,b){if(d instanceof AudioletGroup){d=d.inputs[b||0];b=0}var a=this.outputs[c||0];var e=d.inputs[b||0];e.disconnect(a);a.disconnect(e);this.audiolet.device.needTraverse=true};AudioletNode.prototype.setNumberOfOutputChannels=function(a,b){this.outputs[a].numberOfChannels=b};AudioletNode.prototype.linkNumberOfOutputChannels=function(b,a){this.outputs[b].linkNumberOfChannels(this.inputs[a])};AudioletNode.prototype.tick=function(){this.createInputSamples();this.createOutputSamples();this.generate()};AudioletNode.prototype.traverse=function(a){if(a.indexOf(this)==-1){a.push(this);a=this.traverseParents(a)}return a};AudioletNode.prototype.traverseParents=function(c){var a=this.inputs.length;for(var e=0;e<a;e++){var b=this.inputs[e];var f=b.connectedFrom.length;for(var d=0;d<f;d++){c=b.connectedFrom[d].node.traverse(c)}}return c};AudioletNode.prototype.generate=function(){};AudioletNode.prototype.createInputSamples=function(){var a=this.inputs.length;for(var f=0;f<a;f++){var d=this.inputs[f];var h=0;for(var e=0;e<d.connectedFrom.length;e++){var c=d.connectedFrom[e];for(var b=0;b<c.samples.length;b++){var g=c.samples[b];if(b<h){d.samples[b]+=g}else{d.samples[b]=g;h+=1}}}if(d.samples.length>h){d.samples=d.samples.slice(0,h)}}};AudioletNode.prototype.createOutputSamples=function(){var e=this.outputs.length;for(var d=0;d<e;d++){var a=this.outputs[d];var c=a.getNumberOfChannels();if(a.samples.length==c){continue}else{if(a.samples.length>c){a.samples=a.samples.slice(0,c);continue}}for(var b=a.samples.length;b<c;b++){a.samples[b]=0}}};AudioletNode.prototype.remove=function(){var g=this.inputs.length;for(var e=0;e<g;e++){var h=this.inputs[e];var c=h.connectedFrom.length;for(var d=0;d<c;d++){var a=h.connectedFrom[d];var b=a.node;b.disconnect(this,a.index,e)}}var f=this.outputs.length;for(var e=0;e<f;e++){var b=this.outputs[e];var c=b.connectedTo.length;for(var d=0;d<c;d++){var k=b.connectedTo[d];var h=k.node;this.disconnect(h,e,k.index)}}}; -/*! - * @depends AudioletNode.js - */ -function AudioletDevice(c,b,a,d){AudioletNode.call(this,c,1,0);this.sink=Sink(this.tick.bind(this),a,d,b);this.sampleRate=this.sink.sampleRate;this.numberOfChannels=this.sink.channelCount;this.bufferSize=this.sink.preBufferSize;this.writePosition=0;this.buffer=null;this.paused=false;this.needTraverse=true;this.nodes=[]}extend(AudioletDevice,AudioletNode);AudioletDevice.prototype.tick=function(a,d){if(!this.paused){var b=this.inputs[0];var f=a.length/d;for(var e=0;e<f;e++){if(this.needTraverse){this.nodes=this.traverse([]);this.needTraverse=false}for(var c=this.nodes.length-1;c>0;c--){this.nodes[c].tick()}this.createInputSamples();for(var c=0;c<d;c++){a[e*d+c]=b.samples[c]}this.writePosition+=1}}};AudioletDevice.prototype.getPlaybackTime=function(){return this.sink.getPlaybackTime()};AudioletDevice.prototype.getWriteTime=function(){return this.writePosition};AudioletDevice.prototype.pause=function(){this.paused=true};AudioletDevice.prototype.play=function(){this.paused=false};AudioletDevice.prototype.toString=function(){return"Audio Output Device"};var AudioletInput=function(b,a){this.node=b;this.index=a;this.connectedFrom=[];this.samples=[]};AudioletInput.prototype.connect=function(a){this.connectedFrom.push(a)};AudioletInput.prototype.disconnect=function(a){var c=this.connectedFrom.length;for(var b=0;b<c;b++){if(a==this.connectedFrom[b]){this.connectedFrom.splice(b,1);break}}if(this.connectedFrom.length==0){this.samples=[]}};AudioletInput.prototype.toString=function(){return this.node.toString()+"Input #"+this.index};var Audiolet=function(b,a,c){this.output=new AudioletDestination(this,b,a,c)};var AudioletOutput=function(b,a){this.node=b;this.index=a;this.connectedTo=[];this.samples=[];this.linkedInput=null;this.numberOfChannels=1};AudioletOutput.prototype.connect=function(a){this.connectedTo.push(a)};AudioletOutput.prototype.disconnect=function(a){var c=this.connectedTo.length;for(var b=0;b<c;b++){if(a==this.connectedTo[b]){this.connectedTo.splice(b,1);break}}};AudioletOutput.prototype.linkNumberOfChannels=function(a){this.linkedInput=a};AudioletOutput.prototype.unlinkNumberOfChannels=function(){this.linkedInput=null};AudioletOutput.prototype.getNumberOfChannels=function(){if(this.linkedInput&&this.linkedInput.connectedFrom.length){return(this.linkedInput.samples.length)}return(this.numberOfChannels)};AudioletOutput.prototype.toString=function(){return this.node.toString()+"Output #"+this.index+" - "};var AudioletParameter=function(a,c,b){this.node=a;if(typeof c!="undefined"&&c!=null){this.input=a.inputs[c]}else{this.input=null}this.value=b||0};AudioletParameter.prototype.isStatic=function(){return(this.input.samples.length==0)};AudioletParameter.prototype.isDynamic=function(){return(this.input.samples.length>0)};AudioletParameter.prototype.setValue=function(a){this.value=a};AudioletParameter.prototype.getValue=function(){if(this.input!=null&&this.input.samples.length>0){return this.input.samples[0]}else{return this.value}};function extend(a,c){function b(){}b.prototype=c.prototype;a.prototype=new b();a.prototype.constructor=a} -/*! - * @depends ../core/AudioletNode.js - */ -var ParameterNode=function(a,b){AudioletNode.call(this,a,1,1);this.parameter=new AudioletParameter(this,0,b)};extend(ParameterNode,AudioletNode);ParameterNode.prototype.generate=function(){this.outputs[0].samples[0]=this.parameter.getValue()};ParameterNode.prototype.toString=function(){return"Parameter Node"}; -/*! - * @depends AudioletNode.js - */ -var PassThroughNode=function(b,a,c){AudioletNode.call(this,b,a,c)};extend(PassThroughNode,AudioletNode);PassThroughNode.prototype.createOutputSamples=function(){var f=this.outputs.length;for(var e=0;e<f;e++){var b=this.inputs[e];var a=this.outputs[e];if(b&&b.samples.length!=0){a.samples=b.samples}else{var d=a.getNumberOfChannels();if(a.samples.length==d){continue}else{if(a.samples.length>d){a.samples=a.samples.slice(0,d);continue}}for(var c=a.samples.length;c<d;c++){a.samples[c]=0}}}};PassThroughNode.prototype.toString=function(){return"Pass Through Node"};var PriorityQueue=function(c,b){if(b){this.compare=b}if(c){this.heap=c;for(var a=0;a<Math.floor(this.heap.length/2);a++){this.siftUp(a)}}else{this.heap=[]}};PriorityQueue.prototype.push=function(a){this.heap.push(a);this.siftDown(0,this.heap.length-1)};PriorityQueue.prototype.pop=function(){var b,a;b=this.heap.pop();if(this.heap.length){var a=this.heap[0];this.heap[0]=b;this.siftUp(0)}else{a=b}return(a)};PriorityQueue.prototype.peek=function(){return(this.heap[0])};PriorityQueue.prototype.isEmpty=function(){return(this.heap.length==0)};PriorityQueue.prototype.siftDown=function(d,a){var b=this.heap[a];while(a>d){var e=(a-1)>>1;var c=this.heap[e];if(this.compare(b,c)){this.heap[a]=c;a=e;continue}break}this.heap[a]=b};PriorityQueue.prototype.siftUp=function(a){var e=this.heap.length;var d=a;var c=this.heap[a];var b=2*a+1;while(b<e){var f=b+1;if(f<e&&!this.compare(this.heap[b],this.heap[f])){b=f}this.heap[a]=this.heap[b];a=b;b=2*a+1}this.heap[a]=c;this.siftDown(d,a)};PriorityQueue.prototype.compare=function(d,c){return(d<c)}; -/*! - * @depends PassThroughNode.js - */ -var Scheduler=function(a,b){PassThroughNode.call(this,a,1,1);this.linkNumberOfOutputChannels(0,0);this.bpm=b||120;this.queue=new PriorityQueue(null,function(d,c){return(d.time<c.time)});this.time=0;this.beat=0;this.beatInBar=0;this.bar=0;this.seconds=0;this.beatsPerBar=0;this.lastBeatTime=0;this.beatLength=60/this.bpm*this.audiolet.device.sampleRate};extend(Scheduler,PassThroughNode);Scheduler.prototype.setTempo=function(a){this.bpm=a;this.beatLength=60/this.bpm*this.audiolet.device.sampleRate};Scheduler.prototype.addRelative=function(a,c){var b={};b.callback=c;b.time=this.time+a*this.beatLength;this.queue.push(b);return b};Scheduler.prototype.addAbsolute=function(b,c){if(b<this.beat||b==this.beat&&this.time>this.lastBeatTime){return null}var a={};a.callback=c;a.time=this.lastBeatTime+(b-this.beat)*this.beatLength;this.queue.push(a);return a};Scheduler.prototype.play=function(b,a,d){var c={};c.patterns=b;c.durationPattern=a;c.callback=d;c.time=this.audiolet.device.getWriteTime();this.queue.push(c);return c};Scheduler.prototype.playAbsolute=function(d,b,a,e){if(d<this.beat||d==this.beat&&this.time>this.lastBeatTime){return null}var c={};c.patterns=b;c.durationPattern=a;c.callback=e;c.time=this.lastBeatTime+(d-this.beat)*this.beatLength;this.queue.push(c);return c};Scheduler.prototype.remove=function(b){var a=this.queue.heap.indexOf(b);if(a!=-1){this.queue.heap.splice(a,1);this.queue=new PriorityQueue(this.queue.heap,function(d,c){return(d.time<c.time)})}};Scheduler.prototype.stop=function(a){this.remove(a)};Scheduler.prototype.tick=function(){PassThroughNode.prototype.tick.call(this);this.tickClock();while(!this.queue.isEmpty()&&this.queue.peek().time<=this.time){var a=this.queue.pop();this.processEvent(a)}};Scheduler.prototype.tickClock=function(){this.time+=1;this.seconds=this.time/this.audiolet.device.sampleRate;if(this.time>=this.lastBeatTime+this.beatLength){this.beat+=1;this.beatInBar+=1;if(this.beatInBar==this.beatsPerBar){this.bar+=1;this.beatInBar=0}this.lastBeatTime+=this.beatLength}};Scheduler.prototype.processEvent=function(a){var h=a.durationPattern;if(h){var g=[];var b=a.patterns;var e=b.length;for(var d=0;d<e;d++){var f=b[d];var j=f.next();if(j!=null){g.push(j)}else{return}}a.callback.apply(null,g);var c;if(h instanceof Pattern){c=h.next()}else{c=h}if(c){a.time+=c*this.beatLength;this.queue.push(a)}}else{a.callback()}};Scheduler.prototype.toString=function(){return"Scheduler"};var Int8Array,Uint8Array,Int16Array,Uint16Array;var Int32Array,Uint32Array,Float32Array,Float64Array;var types=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var original,shim;for(var i=0;i<types.length;++i){if(types[i]){if(types[i].prototype.slice===undefined){original="subarray";shim="slice"}else{if(types[i].prototype.subarray===undefined){original="slice";shim="subarray"}}Object.defineProperty(types[i].prototype,shim,{value:types[i].prototype[original],enumerable:false})}} -/*! - * @depends ../core/AudioletNode.js - */ -var Add=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.value=new AudioletParameter(this,1,b||0)};extend(Add,AudioletNode);Add.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var e=this.value.getValue();var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=b.samples[d]+e}};Add.prototype.toString=function(){return"Add"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Divide=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.value=new AudioletParameter(this,1,b||1)};extend(Divide,AudioletNode);Divide.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var e=this.value.getValue();var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=b.samples[d]/e}};Divide.prototype.toString=function(){return"Divide"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Modulo=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.value=new AudioletParameter(this,1,b||1)};extend(Modulo,AudioletNode);Modulo.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var e=this.value.getValue();var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=b.samples[d]%e}};Modulo.prototype.toString=function(){return"Modulo"}; -/*! - * @depends ../core/AudioletNode.js - */ -var MulAdd=function(a,c,b){AudioletNode.call(this,a,3,1);this.linkNumberOfOutputChannels(0,0);this.mul=new AudioletParameter(this,1,c||1);this.add=new AudioletParameter(this,2,b||0)};extend(MulAdd,AudioletNode);MulAdd.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var f=this.mul.getValue();var e=this.add.getValue();var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=b.samples[d]*f+e}};MulAdd.prototype.toString=function(){return"Multiplier/Adder"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Multiply=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.value=new AudioletParameter(this,1,b||1)};extend(Multiply,AudioletNode);Multiply.prototype.generate=function(){var d=this.value.getValue();var a=this.inputs[0];var b=a.samples.length;for(var c=0;c<b;c++){this.outputs[0].samples[c]=a.samples[c]*d}};Multiply.prototype.toString=function(){return"Multiply"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Reciprocal=function(a){AudioletNode.call(this,a,1,1);this.linkNumberOfOutputChannels(0,0)};extend(Reciprocal,AudioletNode);Reciprocal.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=1/b.samples[d]}};Reciprocal.prototype.toString=function(){return"Reciprocal"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Subtract=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.value=new AudioletParameter(this,1,b||0)};extend(Subtract,AudioletNode);Subtract.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var e=this.value.getValue();var c=b.samples.length;for(var d=0;d<c;d++){a.samples[d]=b.samples[d]-e}};Subtract.prototype.toString=function(){return"Subtract"};var Tanh=function(a){AudioletNode.call(this,a,1,1);this.linkNumberOfOutputChannels(0,0)};extend(Tanh,AudioletNode);Tanh.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var c=b.samples.length;for(var d=0;d<c;d++){var e=b.samples[d];a.samples[d]=(Math.exp(e)-Math.exp(-e))/(Math.exp(e)+Math.exp(-e))}};Tanh.prototype.toString=function(){return("Tanh")}; -/*! - * @depends ../core/AudioletNode.js - */ -var Envelope=function(b,d,e,g,a,f){AudioletNode.call(this,b,1,1);this.gate=new AudioletParameter(this,0,d||1);this.levels=[];for(var c=0;c<e.length;c++){this.levels.push(new AudioletParameter(this,null,e[c]))}this.times=[];for(var c=0;c<g.length;c++){this.times.push(new AudioletParameter(this,null,g[c]))}this.releaseStage=a;this.onComplete=f;this.stage=null;this.time=null;this.changeTime=null;this.level=this.levels[0].getValue();this.delta=0;this.gateOn=false};extend(Envelope,AudioletNode);Envelope.prototype.generate=function(){var b=this.gate.getValue();var a=false;if(b&&!this.gateOn){this.gateOn=true;this.stage=0;this.time=0;this.delta=0;this.level=this.levels[0].getValue();if(this.stage!=this.releaseStage){a=true}}if(this.gateOn&&!b){this.gateOn=false;if(this.releaseStage!=null){this.stage=this.releaseStage;a=true}}if(this.changeTime){this.time+=1;if(this.time>=this.changeTime){this.stage+=1;if(this.stage!=this.releaseStage){a=true}else{this.changeTime=null;this.delta=0}}}if(a){if(this.stage!=this.times.length){this.delta=this.calculateDelta(this.stage,this.level);this.changeTime=this.calculateChangeTime(this.stage,this.time)}else{if(this.onComplete){this.onComplete()}this.stage=null;this.time=null;this.changeTime=null;this.delta=0}}this.level+=this.delta;this.outputs[0].samples[0]=this.level};Envelope.prototype.calculateDelta=function(b,d){var c=this.levels[b+1].getValue()-d;var a=this.times[b].getValue()*this.audiolet.device.sampleRate;return(c/a)};Envelope.prototype.calculateChangeTime=function(b,c){var a=this.times[b].getValue()*this.audiolet.device.sampleRate;return(c+a)};Envelope.prototype.toString=function(){return"Envelope"}; -/*! - * @depends Envelope.js - */ -var ADSREnvelope=function(j,e,c,d,g,f,b){var h=[0,1,g,0];var a=[c,d,f];Envelope.call(this,j,e,h,a,2,b);this.attack=this.times[0];this.decay=this.times[1];this.sustain=this.levels[2];this.release=this.levels[2]};extend(ADSREnvelope,Envelope);ADSREnvelope.prototype.toString=function(){return"ADSR Envelope"}; -/*! - * @depends ../core/AudioletNode.js - */ -var BiquadFilter=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.frequency=new AudioletParameter(this,1,b||22100);this.lastFrequency=null;this.xValues=[];this.yValues=[];this.b0=0;this.b1=0;this.b2=0;this.a0=0;this.a1=0;this.a2=0};extend(BiquadFilter,AudioletNode);BiquadFilter.prototype.calculateCoefficients=function(a){};BiquadFilter.prototype.generate=function(){var k=this.inputs[0];var j=this.outputs[0];var m=this.xValues;var p=this.yValues;var l=this.frequency.getValue();if(l!=this.lastFrequency){this.calculateCoefficients(l);this.lastFrequency=l}var v=this.a0;var u=this.a1;var t=this.a2;var h=this.b0;var g=this.b1;var f=this.b2;var d=k.samples.length;for(var n=0;n<d;n++){if(n>=m.length){m.push([0,0]);p.push([0,0])}var r=m[n];var q=r[0];var o=r[1];var e=p[n];var b=e[0];var a=e[1];var s=k.samples[n];var c=(h/v)*s+(g/v)*q+(f/v)*o-(u/v)*b-(t/v)*a;j.samples[n]=c;r[0]=s;r[1]=q;e[0]=c;e[1]=b}};BiquadFilter.prototype.toString=function(){return"Biquad Filter"}; -/*! - * @depends BiquadFilter.js - */ -var AllPassFilter=function(a,b){BiquadFilter.call(this,a,b)};extend(AllPassFilter,BiquadFilter);AllPassFilter.prototype.calculateCoefficients=function(e){var b=2*Math.PI*e/this.audiolet.device.sampleRate;var a=Math.cos(b);var c=Math.sin(b);var d=c/(2/Math.sqrt(2));this.b0=1-d;this.b1=-2*a;this.b2=1+d;this.a0=1+d;this.a1=-2*a;this.a2=1-d};AllPassFilter.prototype.toString=function(){return"All Pass Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Amplitude=function(b,c,a){AudioletNode.call(this,b,3,1);this.linkNumberOfOutputChannels(0,0);this.followers=[];this.attack=new AudioletParameter(this,1,c||0.01);this.release=new AudioletParameter(this,2,a||0.01)};extend(Amplitude,AudioletNode);Amplitude.prototype.generate=function(){var h=this.inputs[0];var a=this.outputs[0];var f=this.followers;var b=f.length;var l=this.audiolet.device.sampleRate;var d=this.attack.getValue();d=Math.pow(0.01,1/(d*l));var j=this.release.getValue();j=Math.pow(0.01,1/(j*l));var g=h.samples.length;for(var c=0;c<g;c++){if(c>=b){f.push(0)}var e=f[c];var k=Math.abs(h.samples[c]);if(k>e){e=d*(e-k)+k}else{e=j*(e-k)+k}a.samples[c]=e;f[c]=e}};Amplitude.prototype.toString=function(){return("Amplitude")}; -/*! - * @depends ../core/PassThroughNode.js - */ -var BadValueDetector=function(a,b){PassThroughNode.call(this,a,1,1);this.linkNumberOfOutputChannels(0,0);if(b){this.callback=b}};extend(BadValueDetector,PassThroughNode);BadValueDetector.prototype.callback=function(b,a){console.error(b+" detected at channel "+a)};BadValueDetector.prototype.generate=function(){var a=this.inputs[0];var b=a.samples.length;for(var c=0;c<b;c++){var d=a.samples[c];if(typeof d=="undefined"||d==null||isNaN(d)||d==Infinity||d==-Infinity){this.callback(d,c)}}};BadValueDetector.prototype.toString=function(){return"Bad Value Detector"}; -/*! - * @depends BiquadFilter.js - */ -var BandPassFilter=function(a,b){BiquadFilter.call(this,a,b)};extend(BandPassFilter,BiquadFilter);BandPassFilter.prototype.calculateCoefficients=function(e){var b=2*Math.PI*e/this.audiolet.device.sampleRate;var a=Math.cos(b);var c=Math.sin(b);var d=c/(2/Math.sqrt(2));this.b0=d;this.b1=0;this.b2=-d;this.a0=1+d;this.a1=-2*a;this.a2=1-d};BandPassFilter.prototype.toString=function(){return"Band Pass Filter"}; -/*! - * @depends BiquadFilter.js - */ -var BandRejectFilter=function(a,b){BiquadFilter.call(this,a,b)};extend(BandRejectFilter,BiquadFilter);BandRejectFilter.prototype.calculateCoefficients=function(e){var b=2*Math.PI*e/this.audiolet.device.sampleRate;var a=Math.cos(b);var c=Math.sin(b);var d=c/(2/Math.sqrt(2));this.b0=1;this.b1=-2*a;this.b2=1;this.a0=1+d;this.a1=-2*a;this.a2=1-d};BandRejectFilter.prototype.toString=function(){return"Band Reject Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var BitCrusher=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.bits=new AudioletParameter(this,1,b)};extend(BitCrusher,AudioletNode);BitCrusher.prototype.generate=function(){var a=this.inputs[0];var d=Math.pow(2,this.bits.getValue())-1;var b=a.samples.length;for(var c=0;c<b;c++){this.outputs[0].samples[c]=Math.floor(a.samples[c]*d)/d}};BitCrusher.prototype.toString=function(){return"BitCrusher"}; -/*! - * @depends ../core/AudioletNode.js - */ -var BufferPlayer=function(c,b,e,d,a,f){AudioletNode.call(this,c,3,1);this.buffer=b;this.setNumberOfOutputChannels(0,this.buffer.numberOfChannels);this.position=d||0;this.playbackRate=new AudioletParameter(this,0,e||1);this.restartTrigger=new AudioletParameter(this,1,0);this.startPosition=new AudioletParameter(this,2,d||0);this.loop=new AudioletParameter(this,3,a||0);this.onComplete=f;this.restartTriggerOn=false;this.playing=true};extend(BufferPlayer,AudioletNode);BufferPlayer.prototype.generate=function(){var c=this.outputs[0];var d=c.samples.length;if(this.buffer.length==0||!this.playing){for(var e=0;e<d;e++){c.samples[e]=0}return}var g=this.playbackRate.getValue();var b=this.restartTrigger.getValue();var f=this.startPosition.getValue();var a=this.loop.getValue();if(b>0&&!this.restartTriggerOn){this.position=f;this.restartTriggerOn=true;this.playing=true}if(b<=0&&this.restartTriggerOn){this.restartTriggerOn=false}var d=this.buffer.channels.length;for(var e=0;e<d;e++){var h=this.buffer.getChannelData(e);c.samples[e]=h[Math.floor(this.position)]}this.position+=g;if(this.position>=this.buffer.length){if(a){this.position%=this.buffer.length}else{this.playing=false;if(this.onComplete){this.onComplete()}}}};BufferPlayer.prototype.toString=function(){return("Buffer player")}; -/*! - * @depends ../core/AudioletNode.js - */ -var CombFilter=function(a,d,c,b){AudioletNode.call(this,a,3,1);this.linkNumberOfOutputChannels(0,0);this.maximumDelayTime=d;this.delayTime=new AudioletParameter(this,1,c||1);this.decayTime=new AudioletParameter(this,2,b);this.buffers=[];this.readWriteIndex=0};extend(CombFilter,AudioletNode);CombFilter.prototype.generate=function(){var k=this.inputs[0];var c=this.outputs[0];var l=this.audiolet.device.sampleRate;var f=this.delayTime.getValue()*l;var h=this.decayTime.getValue()*l;var a=Math.exp(-3*f/h);var j=k.samples.length;for(var e=0;e<j;e++){if(e>=this.buffers.length){var b=this.maximumDelayTime*l;this.buffers.push(new Float32Array(b))}var d=this.buffers[e];var g=d[this.readWriteIndex];c.samples[e]=g;d[this.readWriteIndex]=k.samples[e]+a*g}this.readWriteIndex+=1;if(this.readWriteIndex>=f){this.readWriteIndex=0}};CombFilter.prototype.toString=function(){return"Comb Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Sine=function(a,b){AudioletNode.call(this,a,1,1);this.frequency=new AudioletParameter(this,0,b||440);this.phase=0};extend(Sine,AudioletNode);Sine.prototype.generate=function(){var a=this.outputs[0];var c=this.frequency.getValue();var b=this.audiolet.device.sampleRate;a.samples[0]=Math.sin(this.phase);this.phase+=2*Math.PI*c/b;if(this.phase>2*Math.PI){this.phase%=2*Math.PI}};Sine.prototype.toString=function(){return"Sine"}; -/*! - * @depends ../core/AudioletNode.js - * @depends Sine.js - */ -var CrossFade=function(b,a){AudioletNode.call(this,b,3,1);this.linkNumberOfOutputChannels(0,0);this.position=new AudioletParameter(this,2,a||0.5)};extend(CrossFade,AudioletNode);CrossFade.prototype.generate=function(){var j=this.inputs[0];var h=this.inputs[1];var c=this.outputs[0];var g=this.position.getValue();var b=g*Math.PI/2;var f=Math.cos(b);var e=Math.sin(b);var k=c.samples.length;for(var d=0;d<k;d++){var a=j.samples[d]||0;var l=h.samples[d]||0;c.samples[d]=a*f+l*e}};CrossFade.prototype.toString=function(){return"Cross Fader"}; -/*! - * @depends ../core/AudioletNode.js - */ -var DampedCombFilter=function(b,e,d,c,a){AudioletNode.call(this,b,4,1);this.linkNumberOfOutputChannels(0,0);this.maximumDelayTime=e;this.delayTime=new AudioletParameter(this,1,d||1);this.decayTime=new AudioletParameter(this,2,c);this.damping=new AudioletParameter(this,3,a);var f=e*this.audiolet.device.sampleRate;this.buffers=[];this.readWriteIndex=0;this.filterStores=[]};extend(DampedCombFilter,AudioletNode);DampedCombFilter.prototype.generate=function(){var m=this.inputs[0];var c=this.outputs[0];var n=this.audiolet.device.sampleRate;var g=this.delayTime.getValue()*n;var k=this.decayTime.getValue()*n;var d=this.damping.getValue();var a=Math.exp(-3*g/k);var l=m.samples.length;for(var f=0;f<l;f++){if(f>=this.buffers.length){var b=this.maximumDelayTime*n;this.buffers.push(new Float32Array(b))}if(f>=this.filterStores.length){this.filterStores.push(0)}var e=this.buffers[f];var h=this.filterStores[f];var j=e[this.readWriteIndex];h=(j*(1-d))+(h*d);c.samples[f]=j;e[this.readWriteIndex]=m.samples[f]+a*h;this.filterStores[f]=h}this.readWriteIndex+=1;if(this.readWriteIndex>=g){this.readWriteIndex=0}};DampedCombFilter.prototype.toString=function(){return"Damped Comb Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var DCFilter=function(b,a){AudioletNode.call(this,b,2,1);this.linkNumberOfOutputChannels(0,0);this.coefficient=new AudioletParameter(this,1,a||0.995);this.xValues=[];this.yValues=[]};extend(DCFilter,AudioletNode);DCFilter.prototype.generate=function(){var c=this.coefficient.getValue();var a=this.inputs[0];var b=a.samples.length;for(var e=0;e<b;e++){if(e>=this.xValues.length){this.xValues.push(0)}if(e>=this.yValues.length){this.yValues.push(0)}var d=a.samples[e];var f=d-this.xValues[e]+c*this.yValues[e];this.outputs[0].samples[e]=f;this.xValues[e]=d;this.yValues[e]=f}};DCFilter.prototype.toString=function(){return"DC Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Delay=function(a,c,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.maximumDelayTime=c;this.delayTime=new AudioletParameter(this,1,b||1);var d=c*this.audiolet.device.sampleRate;this.buffers=[];this.readWriteIndex=0};extend(Delay,AudioletNode);Delay.prototype.generate=function(){var c=this.inputs[0];var b=this.outputs[0];var e=this.audiolet.device.sampleRate;var g=this.delayTime.getValue()*e;var d=c.samples.length;for(var f=0;f<d;f++){if(f>=this.buffers.length){var h=this.maximumDelayTime*e;this.buffers.push(new Float32Array(h))}var a=this.buffers[f];b.samples[f]=a[this.readWriteIndex];a[this.readWriteIndex]=c.samples[f]}this.readWriteIndex+=1;if(this.readWriteIndex>=g){this.readWriteIndex=0}};Delay.prototype.toString=function(){return"Delay"}; -/*! - * @depends ../core/AudioletNode.js - */ -var DiscontinuityDetector=function(b,a,c){AudioletNode.call(this,b,1,1);this.linkNumberOfOutputChannels(0,0);this.threshold=a||0.2;if(c){this.callback=c}this.lastValues=[]};extend(DiscontinuityDetector,AudioletNode);DiscontinuityDetector.prototype.callback=function(a,b){console.error("Discontinuity of "+a+" detected on channel "+b)};DiscontinuityDetector.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var c=b.samples.length;for(var d=0;d<c;d++){if(d>=this.lastValues.length){this.lastValues.push(0)}var e=b.samples[d];var f=Math.abs(this.lastValues[d]-e);if(f>this.threshold){this.callback(f,d)}this.lastValues[d]=e}};DiscontinuityDetector.prototype.toString=function(){return"Discontinuity Detector"}; -/*! - * @depends ../core/AudioletNode.js - */ -var FeedbackDelay=function(b,e,d,a,c){AudioletNode.call(this,b,4,1);this.linkNumberOfOutputChannels(0,0);this.maximumDelayTime=e;this.delayTime=new AudioletParameter(this,1,d||1);this.feedback=new AudioletParameter(this,2,a||0.5);this.mix=new AudioletParameter(this,3,c||1);var f=e*this.audiolet.device.sampleRate;this.buffers=[];this.readWriteIndex=0};extend(FeedbackDelay,AudioletNode);FeedbackDelay.prototype.generate=function(){var j=this.inputs[0];var c=this.outputs[0];var k=this.audiolet.output.device.sampleRate;var g=this.delayTime.getValue()*k;var a=this.feedback.getValue();var n=this.mix.getValue();var h=j.samples.length;var d=this.buffers.length;for(var f=0;f<h;f++){if(f>=d){var b=this.maximumDelayTime*k;this.buffers.push(new Float32Array(b))}var e=this.buffers[f];var m=j.samples[f];var l=e[this.readWriteIndex];c.samples[f]=n*l+(1-n)*m;e[this.readWriteIndex]=m+a*l}this.readWriteIndex+=1;if(this.readWriteIndex>=g){this.readWriteIndex=0}};FeedbackDelay.prototype.toString=function(){return"Feedback Delay"}; -/*! - * @depends ../core/AudioletNode.js - */ -var FFT=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.bufferSize=b;this.readWriteIndex=0;this.buffer=new Float32Array(this.bufferSize);this.realBuffer=new Float32Array(this.bufferSize);this.imaginaryBuffer=new Float32Array(this.bufferSize);this.reverseTable=new Uint32Array(this.bufferSize);this.calculateReverseTable()};extend(FFT,AudioletNode);FFT.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];if(b.samples.length==0){return}this.buffer[this.readWriteIndex]=b.samples[0];a.samples[0]=[this.realBuffer[this.readWriteIndex],this.imaginaryBuffer[this.readWriteIndex]];this.readWriteIndex+=1;if(this.readWriteIndex>=this.bufferSize){this.transform();this.readWriteIndex=0}};FFT.prototype.calculateReverseTable=function(){var a=1;var c=this.bufferSize>>1;while(a<this.bufferSize){for(var b=0;b<a;b++){this.reverseTable[b+a]=this.reverseTable[b]+c}a=a<<1;c=c>>1}};FFT.prototype.transform=function(){for(var e=0;e<this.bufferSize;e++){this.realBuffer[e]=this.buffer[this.reverseTable[e]];this.imaginaryBuffer[e]=0}var f=1;while(f<this.bufferSize){var l=Math.cos(-Math.PI/f);var c=Math.sin(-Math.PI/f);var g=1;var k=0;for(var b=0;b<f;b++){var e=b;while(e<this.bufferSize){var d=e+f;var h=(g*this.realBuffer[d])-(k*this.imaginaryBuffer[d]);var a=(g*this.imaginaryBuffer[d])+(k*this.realBuffer[d]);this.realBuffer[d]=this.realBuffer[e]-h;this.imaginaryBuffer[d]=this.imaginaryBuffer[e]-a;this.realBuffer[e]+=h;this.imaginaryBuffer[e]+=a;e+=f<<1}var j=g;g=(j*l)-(k*c);k=(j*c)+(k*l)}f=f<<1}};FFT.prototype.toString=function(){return"FFT"}; -/*! - * @depends ../operators/Multiply.js - */ -var Gain=function(a,b){Multiply.call(this,a,b);this.gain=this.value};extend(Gain,Multiply);Gain.prototype.toString=function(){return("Gain")}; -/*! - * @depends BiquadFilter.js - */ -var HighPassFilter=function(a,b){BiquadFilter.call(this,a,b)};extend(HighPassFilter,BiquadFilter);HighPassFilter.prototype.calculateCoefficients=function(e){var b=2*Math.PI*e/this.audiolet.device.sampleRate;var a=Math.cos(b);var c=Math.sin(b);var d=c/(2/Math.sqrt(2));this.b0=(1+a)/2;this.b1=-(1+a);this.b2=this.b0;this.a0=1+d;this.a1=-2*a;this.a2=1-d};HighPassFilter.prototype.toString=function(){return"High Pass Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var IFFT=function(a,b){AudioletNode.call(this,a,2,1);this.linkNumberOfOutputChannels(0,0);this.bufferSize=b;this.readWriteIndex=0;this.buffer=new Float32Array(this.bufferSize);this.realBuffer=new Float32Array(this.bufferSize);this.imaginaryBuffer=new Float32Array(this.bufferSize);this.reverseTable=new Uint32Array(this.bufferSize);this.calculateReverseTable();this.reverseReal=new Float32Array(this.bufferSize);this.reverseImaginary=new Float32Array(this.bufferSize)};extend(IFFT,AudioletNode);IFFT.prototype.generate=function(){var c=this.inputs[0];var b=this.outputs[0];if(!c.samples.length){return}var a=c.samples[0];this.realBuffer[this.readWriteIndex]=a[0];this.imaginaryBuffer[this.readWriteIndex]=a[1];b.samples[0]=this.buffer[this.readWriteIndex];this.readWriteIndex+=1;if(this.readWriteIndex>=this.bufferSize){this.transform();this.readWriteIndex=0}};IFFT.prototype.calculateReverseTable=function(){var a=1;var c=this.bufferSize>>1;while(a<this.bufferSize){for(var b=0;b<a;b++){this.reverseTable[b+a]=this.reverseTable[b]+c}a=a<<1;c=c>>1}};IFFT.prototype.transform=function(){var e=1;for(var f=0;f<this.bufferSize;f++){this.imaginaryBuffer[f]*=-1}for(var f=0;f<this.bufferSize;f++){this.reverseReal[f]=this.realBuffer[this.reverseTable[f]];this.reverseImaginary[f]=this.imaginaryBuffer[this.reverseTable[f]]}this.realBuffer.set(this.reverseReal);this.imaginaryBuffer.set(this.reverseImaginary);while(e<this.bufferSize){var l=Math.cos(-Math.PI/e);var c=Math.sin(-Math.PI/e);var g=1;var k=0;for(var b=0;b<e;b++){f=b;while(f<this.bufferSize){var d=f+e;var h=(g*this.realBuffer[d])-(k*this.imaginaryBuffer[d]);var a=(g*this.imaginaryBuffer[d])+(k*this.realBuffer[d]);this.realBuffer[d]=this.realBuffer[f]-h;this.imaginaryBuffer[d]=this.imaginaryBuffer[f]-a;this.realBuffer[f]+=h;this.imaginaryBuffer[f]+=a;f+=e<<1}var j=g;g=(j*l)-(k*c);k=(j*c)+(k*l)}e=e<<1}for(f=0;f<this.bufferSize;f++){this.buffer[f]=this.realBuffer[f]/this.bufferSize}};IFFT.prototype.toString=function(){return"IFFT"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Lag=function(a,c,b){AudioletNode.call(this,a,2,1);this.value=new AudioletParameter(this,0,c||0);this.lag=new AudioletParameter(this,1,b||1);this.lastValue=0;this.log001=Math.log(0.001)};extend(Lag,AudioletNode);Lag.prototype.generate=function(){var c=this.inputs[0];var b=this.outputs[0];var e=this.audiolet.device.sampleRate;var f=this.value.getValue();var g=this.lag.getValue();var d=Math.exp(this.log001/(g*e));var a=((1-d)*f)+(d*this.lastValue);b.samples[0]=a;this.lastValue=a};Lag.prototype.toString=function(){return"Lag"}; -/*! - * @depends ../core/AudioletGroup.js - */ -var Limiter=function(c,b,d,a){AudioletNode.call(this,c,4,1);this.linkNumberOfOutputChannels(0,0);this.threshold=new AudioletParameter(this,1,b||0.95);this.attack=new AudioletParameter(this,2,d||0.01);this.release=new AudioletParameter(this,2,a||0.4);this.followers=[]};extend(Limiter,AudioletNode);Limiter.prototype.generate=function(){var h=this.inputs[0];var a=this.outputs[0];var m=this.audiolet.device.sampleRate;var b=Math.pow(0.01,1/(this.attack.getValue()*m));var j=Math.pow(0.01,1/(this.release.getValue()*m));var d=this.threshold.getValue();var g=h.samples.length;for(var c=0;c<g;c++){if(c>=this.followers.length){this.followers.push(0)}var f=this.followers[c];var l=h.samples[c];var e=Math.abs(l);if(e>f){f=b*(f-e)+e}else{f=j*(f-e)+e}var k=f-d;if(k>0){a.samples[c]=l/(1+k)}else{a.samples[c]=l}this.followers[c]=f}};Limiter.prototype.toString=function(){return"Limiter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var LinearCrossFade=function(b,a){AudioletNode.call(this,b,3,1);this.linkNumberOfOutputChannels(0,0);this.position=new AudioletParameter(this,2,a||0.5)};extend(LinearCrossFade,AudioletNode);LinearCrossFade.prototype.generate=function(){var h=this.inputs[0];var g=this.inputs[1];var b=this.outputs[0];var f=this.position.getValue();var e=1-f;var c=f;var j=b.samples.length;for(var d=0;d<j;d++){var a=h.samples[d]||0;var k=g.samples[d]||0;b.samples[d]=a*e+k*c}};LinearCrossFade.prototype.toString=function(){return"Linear Cross Fader"}; -/*! - * @depends BiquadFilter.js - */ -var LowPassFilter=function(a,b){BiquadFilter.call(this,a,b)};extend(LowPassFilter,BiquadFilter);LowPassFilter.prototype.calculateCoefficients=function(e){var b=2*Math.PI*e/this.audiolet.device.sampleRate;var a=Math.cos(b);var c=Math.sin(b);var d=c/(2/Math.sqrt(2));this.b0=(1-a)/2;this.b1=1-a;this.b2=this.b0;this.a0=1+d;this.a1=-2*a;this.a2=1-d};LowPassFilter.prototype.toString=function(){return"Low Pass Filter"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Pan=function(a,b){AudioletNode.call(this,a,2,1);this.setNumberOfOutputChannels(0,2);if(b==null){var b=0.5}this.pan=new AudioletParameter(this,1,b)};extend(Pan,AudioletNode);Pan.prototype.generate=function(){var c=this.inputs[0];var b=this.outputs[0];var e=this.pan.getValue();var d=c.samples[0]||0;var a=e*Math.PI/2;b.samples[0]=d*Math.cos(a);b.samples[1]=d*Math.sin(a)};Pan.prototype.toString=function(){return"Stereo Panner"}; -/*! - * @depends Envelope.js - */ -var PercussiveEnvelope=function(b,c,g,a,e){var d=[0,1,0];var f=[g,a];Envelope.call(this,b,c,d,f,null,e);this.attack=this.times[0];this.release=this.times[1]};extend(PercussiveEnvelope,Envelope);PercussiveEnvelope.prototype.toString=function(){return"Percussive Envelope"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Pulse=function(a,b,c){AudioletNode.call(this,a,2,1);this.frequency=new AudioletParameter(this,0,b||440);this.pulseWidth=new AudioletParameter(this,1,c||0.5);this.phase=0};extend(Pulse,AudioletNode);Pulse.prototype.generate=function(){var c=this.pulseWidth.getValue();this.outputs[0].samples[0]=(this.phase<c)?1:-1;var b=this.frequency.getValue();var a=this.audiolet.device.sampleRate;this.phase+=b/a;if(this.phase>1){this.phase%=1}};Pulse.prototype.toString=function(){return"Pulse"}; -/*! - * @depends ../core/AudioletNode.js - * @depends ../core/AudioletGroup.js - */ -var Reverb=function(d,g,a,c){AudioletNode.call(this,d,4,1);this.initialMix=0.33;this.fixedGain=0.015;this.initialDamping=0.5;this.scaleDamping=0.4;this.initialRoomSize=0.5;this.scaleRoom=0.28;this.offsetRoom=0.7;this.combTuning=[1116,1188,1277,1356,1422,1491,1557,1617];this.allPassTuning=[556,441,341,225];var g=g||this.initialMix;this.mix=new AudioletParameter(this,1,g);var a=a||this.initialRoomSize;this.roomSize=new AudioletParameter(this,2,a);var c=c||this.initialDamping;this.damping=new AudioletParameter(this,3,c);this.combBuffers=[];this.combIndices=[];this.filterStores=[];var b=this.combTuning.length;for(var f=0;f<b;f++){this.combBuffers.push(new Float32Array(this.combTuning[f]));this.combIndices.push(0);this.filterStores.push(0)}this.allPassBuffers=[];this.allPassIndices=[];var e=this.allPassTuning.length;for(var f=0;f<e;f++){this.allPassBuffers.push(new Float32Array(this.allPassTuning[f]));this.allPassIndices.push(0)}};extend(Reverb,AudioletNode);Reverb.prototype.generate=function(){var k=this.mix.getValue();var m=this.roomSize.getValue();var d=this.damping.getValue();var a=this.combTuning.length;var s=this.allPassTuning.length;var q=this.inputs[0].samples[0]||0;var j=q;q*=this.fixedGain;var c=q;var d=d*this.scaleDamping;var e=m*this.scaleRoom+this.offsetRoom;for(var r=0;r<a;r++){var o=this.combIndices[r];var p=this.combBuffers[r];var n=this.filterStores[r];var h=p[o];n=(h*(1-d))+(n*d);q+=h;p[o]=c+e*n;o+=1;if(o>=p.length){o=0}this.combIndices[r]=o;this.filterStores[r]=n}for(var r=0;r<s;r++){var b=this.allPassBuffers[r];var g=this.allPassIndices[r];var l=q;var f=b[g];q=-q+f;b[g]=l+(f*0.5);g+=1;if(g>=b.length){g=0}this.allPassIndices[r]=g}this.outputs[0].samples[0]=k*q+(1-k)*j};Reverb.prototype.toString=function(){return"Reverb"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Saw=function(a,b){AudioletNode.call(this,a,1,1);this.frequency=new AudioletParameter(this,0,b||440);this.phase=0};extend(Saw,AudioletNode);Saw.prototype.generate=function(){var a=this.outputs[0];var c=this.frequency.getValue();var b=this.audiolet.device.sampleRate;a.samples[0]=((this.phase/2+0.25)%0.5-0.25)*4;this.phase+=c/b;if(this.phase>1){this.phase%=1}};Saw.prototype.toString=function(){return"Saw"}; -/*! - * @depends ../core/AudioletNode.js - */ -var SoftClip=function(a){AudioletNode.call(this,a,1,1);this.linkNumberOfOutputChannels(0,0)};extend(SoftClip,AudioletNode);SoftClip.prototype.generate=function(){var b=this.inputs[0];var a=this.outputs[0];var c=b.samples.length;for(var d=0;d<c;d++){var e=b.samples[d];if(e>0.5||e<-0.5){a.samples[d]=(Math.abs(e)-0.25)/e}else{a.samples[d]=e}}};SoftClip.prototype.toString=function(){return("SoftClip")}; -/*! - * @depends ../core/AudioletNode.js - */ -var Square=function(a,b){AudioletNode.call(this,a,1,1);this.frequency=new AudioletParameter(this,0,b||440);this.phase=0};extend(Square,AudioletNode);Square.prototype.generate=function(){var a=this.outputs[0];var c=this.frequency.getValue();var b=this.audiolet.device.sampleRate;a.samples[0]=this.phase>0.5?1:-1;this.phase+=c/b;if(this.phase>1){this.phase%=1}};Square.prototype.toString=function(){return"Square"}; -/*! - * @depends ../core/AudioletNode.js - */ -var Triangle=function(a,b){AudioletNode.call(this,a,1,1);this.frequency=new AudioletParameter(this,0,b||440);this.phase=0};extend(Triangle,AudioletNode);Triangle.prototype.generate=function(){var a=this.outputs[0];var c=this.frequency.getValue();var b=this.audiolet.device.sampleRate;a.samples[0]=1-4*Math.abs((this.phase+0.25)%1-0.5);this.phase+=c/b;if(this.phase>1){this.phase%=1}};Triangle.prototype.toString=function(){return"Triangle"}; -/*! - * @depends ../core/AudioletNode.js - */ -var TriggerControl=function(b,a){AudioletNode.call(this,b,0,1);this.trigger=new AudioletParameter(this,null,a||0)};extend(TriggerControl,AudioletNode);TriggerControl.prototype.generate=function(){if(this.trigger.getValue()>0){this.outputs[0].samples[0]=1;this.trigger.setValue(0)}else{this.outputs[0].samples[0]=0}};TriggerControl.prototype.toString=function(){return"Trigger Control"}; -/*! - * @depends ../core/AudioletNode.js - */ -var UpMixer=function(a,b){AudioletNode.call(this,a,1,1);this.outputs[0].numberOfChannels=b};extend(UpMixer,AudioletNode);UpMixer.prototype.generate=function(){var c=this.inputs[0];var b=this.outputs[0];var e=c.samples.length;var a=b.samples.length;if(e==a){b.samples=c.samples}else{for(var d=0;d<a;d++){b.samples[d]=c.samples[d%e]}}};UpMixer.prototype.toString=function(){return"UpMixer"};var WebKitBufferPlayer=function(a,b){AudioletNode.call(this,a,0,1);this.onComplete=b;this.isWebKit=this.audiolet.device.sink instanceof Sink.sinks.webkit;this.ready=false;this.setNumberOfOutputChannels(0,0);if(!this.isWebKit){return}this.context=this.audiolet.device.sink._context;this.jsNode=null;this.source=null;this.ready=false;this.loaded=false;this.buffers=[];this.readPosition=0;this.endTime=null};extend(WebKitBufferPlayer,AudioletNode);WebKitBufferPlayer.prototype.load=function(a,b,c){if(!this.isWebKit){return}this.stop();this.xhr=new XMLHttpRequest();this.xhr.open("GET",a,true);this.xhr.responseType="arraybuffer";this.xhr.onload=this.onLoad.bind(this,b,c);this.xhr.onerror=c;this.xhr.send()};WebKitBufferPlayer.prototype.stop=function(){this.ready=false;this.loaded=false;this.buffers=[];this.readPosition=0;this.endTime=null;this.setNumberOfOutputChannels(0);this.disconnectWebKitNodes()};WebKitBufferPlayer.prototype.disconnectWebKitNodes=function(){if(this.source&&this.jsNode){this.source.disconnect(this.jsNode);this.jsNode.disconnect(this.context.destination);this.source=null;this.jsNode=null}};WebKitBufferPlayer.prototype.onLoad=function(a,b){this.context.decodeAudioData(this.xhr.response,function(c){this.onDecode(c);a()}.bind(this),b)};WebKitBufferPlayer.prototype.onDecode=function(a){this.fileBuffer=a;this.source=this.context.createBufferSource();this.source.buffer=this.fileBuffer;var b=this.fileBuffer.numberOfChannels;this.setNumberOfOutputChannels(0,b);this.jsNode=this.context.createJavaScriptNode(4096,b,0);this.jsNode.onaudioprocess=this.onData.bind(this);this.source.connect(this.jsNode);this.jsNode.connect(this.context.destination);this.source.noteOn(0);this.endTime=this.context.currentTime+this.fileBuffer.duration;this.loaded=true};WebKitBufferPlayer.prototype.onData=function(c){if(this.loaded){this.ready=true}var a=c.inputBuffer.numberOfChannels;for(var b=0;b<a;b++){this.buffers[b]=c.inputBuffer.getChannelData(b);this.readPosition=0}};WebKitBufferPlayer.prototype.generate=function(){if(!this.ready){return}var a=this.outputs[0];var b=a.samples.length;for(var c=0;c<b;c++){a.samples[c]=this.buffers[c][this.readPosition]}this.readPosition+=1;if(this.context.currentTime>this.endTime){this.stop();this.onComplete()}}; -/*! - * @depends ../core/AudioletNode.js - */ -var WhiteNoise=function(a){AudioletNode.call(this,a,0,1)};extend(WhiteNoise,AudioletNode);WhiteNoise.prototype.generate=function(){this.outputs[0].samples[0]=Math.random()*2-1};WhiteNoise.prototype.toString=function(){return"White Noise"};var Pattern=function(){};Pattern.prototype.next=function(){return null};Pattern.prototype.valueOf=function(a){if(a instanceof Pattern){return(a.next())}else{return(a)}};Pattern.prototype.reset=function(){}; -/*! - * @depends Pattern.js - */ -var PArithmetic=function(c,b,a){Pattern.call(this);this.start=c;this.value=c;this.step=b;this.repeats=a;this.position=0};extend(PArithmetic,Pattern);PArithmetic.prototype.next=function(){var a;if(this.position==0){a=this.value;this.position+=1}else{if(this.position<this.repeats){var b=this.valueOf(this.step);if(b!=null){this.value+=b;a=this.value;this.position+=1}else{a=null}}else{a=null}}return(a)};PArithmetic.prototype.reset=function(){this.value=this.start;this.position=0;if(this.step instanceof Pattern){this.step.reset()}};var Pseries=PArithmetic; -/*! - * @depends Pattern.js - */ -var PChoose=function(b,a){Pattern.call(this);this.list=b;this.repeats=a||1;this.position=0};extend(PChoose,Pattern);PChoose.prototype.next=function(){var b;if(this.position<this.repeats){var a=Math.floor(Math.random()*this.list.length);var c=this.list[a];var d=this.valueOf(c);if(d!=null){if(!(c instanceof Pattern)){this.position+=1}b=d}else{if(c instanceof Pattern){c.reset()}this.position+=1;b=this.next()}}else{b=null}return(b)};PChoose.prototype.reset=function(){this.position=0;for(var a=0;a<this.list.length;a++){var b=this.list[a];if(b instanceof Pattern){b.reset()}}};var Prand=PChoose; -/*! - * @depends Pattern.js - */ -var PGeometric=function(c,b,a){Pattern.call(this);this.start=c;this.value=c;this.step=b;this.repeats=a;this.position=0};extend(PGeometric,Pattern);PGeometric.prototype.next=function(){var a;if(this.position==0){a=this.value;this.position+=1}else{if(this.position<this.repeats){var b=this.valueOf(this.step);if(b!=null){this.value*=b;a=this.value;this.position+=1}else{a=null}}else{a=null}}return(a)};PGeometric.prototype.reset=function(){this.value=this.start;this.position=0;if(this.step instanceof Pattern){this.step.reset()}};var Pgeom=PGeometric; -/*! - * @depends Pattern.js - */ -var PProxy=function(a){Pattern.call(this);if(a){this.pattern=a}};extend(PProxy,Pattern);PProxy.prototype.next=function(){var a;if(this.pattern){var a=this.pattern.next()}else{a=null}return a};var Pp=PProxy; -/*! - * @depends Pattern.js - */ -var PRandom=function(a,c,b){Pattern.call(this);this.low=a;this.high=c;this.repeats=b;this.position=0};extend(PRandom,Pattern);PRandom.prototype.next=function(){var b;if(this.position<this.repeats){var a=this.valueOf(this.low);var c=this.valueOf(this.high);if(a!=null&&c!=null){b=a+Math.random()*(c-a);this.position+=1}else{b=null}}else{b=null}return(b)};PRandom.prototype.reset=function(){this.position=0};var Pwhite=PRandom; -/*! - * @depends Pattern.js - */ -var PSequence=function(b,a,c){Pattern.call(this);this.list=b;this.repeats=a||1;this.position=0;this.offset=c||0};extend(PSequence,Pattern);PSequence.prototype.next=function(){var b;if(this.position<this.repeats*this.list.length){var a=(this.position+this.offset)%this.list.length;var c=this.list[a];var d=this.valueOf(c);if(d!=null){if(!(c instanceof Pattern)){this.position+=1}b=d}else{if(c instanceof Pattern){c.reset()}this.position+=1;b=this.next()}}else{b=null}return(b)};PSequence.prototype.reset=function(){this.position=0;for(var a=0;a<this.list.length;a++){var b=this.list[a];if(b instanceof Pattern){b.reset()}}};var Pseq=PSequence; -/*! - * @depends Pattern.js - */ -var PSeries=function(b,a,c){Pattern.call(this);this.list=b;this.repeats=a||1;this.position=0;this.offset=c||0};extend(PSeries,Pattern);PSeries.prototype.next=function(){var b;if(this.position<this.repeats){var a=(this.position+this.offset)%this.list.length;var c=this.list[a];var d=this.valueOf(c);if(d!=null){if(!(c instanceof Pattern)){this.position+=1}b=d}else{if(c instanceof Pattern){c.reset()}this.position+=1;b=this.next()}}else{b=null}return(b)};PSeries.prototype.reset=function(){this.position=0;for(var a=0;a<this.list.length;a++){var b=this.list[a];if(b instanceof Pattern){b.reset()}}};var Pser=PSeries; -/*! - * @depends Pattern.js - */ -var PShuffle=function(d,a){Pattern.call(this);this.list=[];while(d.length){var b=Math.floor(Math.random()*d.length);var c=d.splice(b,1);this.list.push(c)}this.repeats=a;this.position=0};extend(PShuffle,Pattern);PShuffle.prototype.next=function(){var b;if(this.position<this.repeats*this.list.length){var a=(this.position+this.offset)%this.list.length;var c=this.list[a];var d=this.valueOf(c);if(d!=null){if(!(c instanceof Pattern)){this.position+=1}b=d}else{if(c instanceof Pattern){c.reset()}this.position+=1;b=this.next()}}else{b=null}return(b)};var Pshuffle=PShuffle;var Scale=function(b,a){this.degrees=b;this.tuning=a||new EqualTemperamentTuning(12)};Scale.prototype.getFrequency=function(d,a,b){var c=a;b+=Math.floor(d/this.degrees.length);d%=this.degrees.length;c*=Math.pow(this.tuning.octaveRatio,b);c*=this.tuning.ratios[this.degrees[d]];return c}; -/*! - * @depends Scale.js - */ -var MajorScale=function(){Scale.call(this,[0,2,4,5,7,9,11])};extend(MajorScale,Scale); -/*! - * @depends Scale.js - */ -var MinorScale=function(){Scale.call(this,[0,2,3,5,7,8,10])};extend(MinorScale,Scale);var Tuning=function(d,c){this.semitones=d;this.octaveRatio=c||2;this.ratios=[];var b=this.semitones.length;for(var a=0;a<b;a++){this.ratios.push(Math.pow(2,this.semitones[a]/b))}}; -/*! - * @depends Tuning.js - */ -var EqualTemperamentTuning=function(b){var c=[];for(var a=0;a<b;a++){c.push(a)}Tuning.call(this,c,2)};extend(EqualTemperamentTuning,Tuning);var Sink=this.Sink=function(d){function c(j,h,l,f){var e=c.sinks.list,g;for(g=0;g<e.length;g++){if(e[g].enabled){try{return new e[g](j,h,l,f)}catch(k){}}}throw c.Error(2)}function b(){}c.SinkClass=b;b.prototype=c.prototype={sampleRate:44100,channelCount:2,bufferSize:4096,writePosition:0,previousHit:0,ringOffset:0,channelMode:"interleaved",isReady:false,start:function(g,f,h,e){this.channelCount=isNaN(f)||f===null?this.channelCount:f;this.bufferSize=isNaN(h)||h===null?this.bufferSize:h;this.sampleRate=isNaN(e)||e===null?this.sampleRate:e;this.readFn=g;this.activeRecordings=[];this.previousHit=+new Date();c.EventEmitter.call(this);c.emit("init",[this].concat([].slice.call(arguments)))},process:function(g,h){this.emit("preprocess",arguments);if(this.ringBuffer){(this.channelMode==="interleaved"?this.ringSpin:this.ringSpinInterleaved).apply(this,arguments)}if(this.channelMode==="interleaved"){this.emit("audioprocess",arguments);if(this.readFn){this.readFn.apply(this,arguments)}}else{var e=c.deinterleave(g,this.channelCount),f=[e].concat([].slice.call(arguments,1));this.emit("audioprocess",f);if(this.readFn){this.readFn.apply(this,f)}c.interleave(e,this.channelCount,g)}this.emit("postprocess",arguments);this.previousHit=+new Date();this.writePosition+=g.length/h},getPlaybackTime:function(){return this.writePosition-this.bufferSize},ready:function(){if(this.isReady){return}this.isReady=true;this.emit("ready",[])}};function a(l,j,f,h,g){f=f||j.prototype;j.prototype=new c.SinkClass();j.prototype.type=l;j.enabled=!h;var e;for(e in f){if(f.hasOwnProperty(e)){j.prototype[e]=f[e]}}a[l]=j;a.list[g?"unshift":"push"](j)}c.sinks=c.devices=a;c.sinks.list=[];c.singleton=function(){var e=c.apply(null,arguments);c.singleton=function(){return e};return e};d.Sink=c;return c}(function(){return this}());void function(a){function b(){var c;for(c in b.prototype){if(b.prototype.hasOwnProperty(c)){this[c]=b.prototype[c]}}this._listeners={}}b.prototype={_listeners:null,emit:function(d,c){if(this._listeners[d]){for(var e=0;e<this._listeners[d].length;e++){this._listeners[d][e].apply(this,c)}}return this},on:function(c,d){this._listeners[c]=this._listeners[c]||[];this._listeners[c].push(d);return this},off:function(c,e){if(this._listeners[c]){if(!e){delete this._listeners[c];return this}for(var d=0;d<this._listeners[c].length;d++){if(this._listeners[c][d]===e){this._listeners[c].splice(d--,1)}}if(!this._listeners[c].length){delete this._listeners[c]}}return this}};a.EventEmitter=b;b.call(a)}(this.Sink);void function(a){a.doInterval=function(f,d){var e,c;function b(g){if(a.inlineWorker.working&&!g){e=a.inlineWorker('setInterval(function (){ postMessage("tic"); }, '+d+");");e.onmessage=function(){f()};c=function(){e.terminate()}}else{e=setInterval(f,d);c=function(){clearInterval(e)}}}if(a.inlineWorker.ready){b()}else{a.inlineWorker.on("ready",function(){b()})}return function(){if(!c){if(!a.inlineWorker.ready){a.inlineWorker.on("ready",function(){if(c){c()}})}}else{c()}}}}(this.Sink);void function(d){var b,h,j,f;void function(k,m){function l(p,q){var n,o=q.slice();for(n=o.shift();typeof n!=="undefined";n=o.shift()){n=Function("return typeof "+n+p+'=== "undefined" ? undefined : '+n+p)();if(n){return n}}}b=l("Blob",k);h=l("BlobBuilder",k);j=l("URL",m);f=l("btoa",[""])}(["","Moz","WebKit","MS"],["","webkit"]);var g=b&&j&&function(l,k){return j.createObjectURL(new b([l],{type:k}))};var c=h&&j&&function(l,k){var m=new h();m.append(l);return j.createObjectURL(m.getBlob(k))};var a=f&&function(l,k){return"data:"+k+";base64,"+f(l)};var e=g||c||a;if(!e){return}if(g){e.createBlob=g}if(c){e.createBlobBuilder=c}if(a){e.createData=a}if(b){e.Blob=b}if(h){e.BlobBuilder=h}if(j){e.URL=j}d.createDynURL=e;d.revokeDynURL=function(k){if(typeof k==="string"&&k.indexOf("data:")===0){return false}else{return j.revokeObjectURL(k)}}}(this.Sink);void function(a){function b(d){if(!b.hasOwnProperty(d)){throw b(1)}if(!(this instanceof b)){return new b(d)}var c;for(c in b[d]){if(b[d].hasOwnProperty(c)){this[c]=b[d][c]}}this.code=d}b.prototype=new Error();b.prototype.toString=function(){return"SinkError 0x"+this.code.toString(16)+": "+this.message};b[1]={message:"No such error code.",explanation:"The error code does not exist."};b[2]={message:"No audio sink available.",explanation:"The audio device may be busy, or no supported output API is available for this browser."};b[16]={message:"Buffer underflow.",explanation:"Trying to recover..."};b[17]={message:"Critical recovery fail.",explanation:"The buffer underflow has reached a critical point, trying to recover, but will probably fail anyway."};b[18]={message:"Buffer size too large.",explanation:"Unable to allocate the buffer due to excessive length, please try a smaller buffer. Buffer size should probably be smaller than the sample rate."};a.Error=b}(this.Sink);void function(b){var d=Object.defineProperty?function(g,e,f){Object.defineProperty(g,e,{value:f,configurable:true,writable:true})}:function(g,e,f){g[e]=f};function c(){d(this,"terminate",this._terminate);b.revokeDynURL(this._url);delete this._url;delete this._terminate;return this.terminate()}function a(e){function f(l,m,j){try{var k=l(m,"text/javascript");var o=new Worker(k);d(o,"_url",k);d(o,"_terminate",o.terminate);d(o,"terminate",c);if(a.type){return o}a.type=j;a.createURL=l;return o}catch(n){return null}}var h=b.createDynURL;var g;if(a.createURL){return f(a.createURL,e,a.type)}g=f(h.createBlob,e,"blob");if(g){return g}g=f(h.createBlobBuilder,e,"blobbuilder");if(g){return g}g=f(h.createData,e,"data");return g}b.EventEmitter.call(a);a.test=function(){a.ready=a.working=false;a.type="";a.createURL=null;var g=a("this.onmessage=function(e){postMessage(e.data)}");var f="inlineWorker";function e(h){if(a.ready){return}a.ready=true;a.working=h;a.emit("ready",[h]);a.off("ready");if(h&&g){g.terminate()}g=null}if(!g){setTimeout(function(){e(false)},0)}else{g.onmessage=function(h){e(h.data===f)};g.postMessage(f);setTimeout(function(){e(false)},1000)}};b.inlineWorker=a;a.test()}(this.Sink);void function(a){a.sinks("audiodata",function(){var m=this,d=0,k=null,j=new Audio(),h,g,e,f,l,b;m.start.apply(m,arguments);m.preBufferSize=isNaN(arguments[4])||arguments[4]===null?this.preBufferSize:arguments[4];function c(){if(k){h=j.mozWriteAudio(k);d+=h;if(h<k.length){k=k.subarray(h);return k}k=null}g=j.mozCurrentSampleOffset();e=Number(g+(l!==g?m.bufferSize:m.preBufferSize)*m.channelCount-d);if(g===l){m.emit("error",[a.Error(16)])}if(e>0||l===g){m.ready();try{f=new Float32Array(l===g?m.preBufferSize*m.channelCount:m.forceBufferSize?e<m.bufferSize*2?m.bufferSize*2:e:e)}catch(n){m.emit("error",[a.Error(18)]);m.kill();return}m.process(f,m.channelCount);h=m._audio.mozWriteAudio(f);if(h<f.length){k=f.subarray(h)}d+=h}l=g}j.mozSetup(m.channelCount,m.sampleRate);this._timers=[];this._timers.push(a.doInterval(function(){if(+new Date()-m.previousHit>2000){m._audio=j=new Audio();j.mozSetup(m.channelCount,m.sampleRate);d=0;m.emit("error",[a.Error(17)])}},1000));this._timers.push(a.doInterval(c,m.interval));m._bufferFill=c;m._audio=j},{bufferSize:24576,preBufferSize:24576,forceBufferSize:false,interval:100,kill:function(){while(this._timers.length){this._timers.shift()()}this.emit("kill")},getPlaybackTime:function(){return this._audio.mozCurrentSampleOffset()/this.channelCount}},false,true);a.sinks.moz=a.sinks.audiodata}(this.Sink);void function(a){a.sinks("dummy",function(){var b=this;b.start.apply(b,arguments);function c(){var d=new Float32Array(b.bufferSize*b.channelCount);b.process(d,b.channelCount)}b._kill=a.doInterval(c,b.bufferSize/b.sampleRate*1000);b._callback=c},{kill:function(){this._kill();this.emit("kill")}},true)}(this.Sink);(function(b,a){a=b.sinks;function d(f){var e=document.createElement("audio");if(f){e.src=f}return e}a("wav",function(){var e=this,j=new a.wav.wavAudio(),k=typeof k==="undefined"?audioLib.PCMData:k;e.start.apply(e,arguments);var g=new Float32Array(e.bufferSize*e.channelCount),h=new Float32Array(e.bufferSize*e.channelCount);if(!d().canPlayType("audio/wav; codecs=1")||!btoa){throw 0}function f(){if(e._audio.hasNextFrame){return}e.ready();b.memcpy(h,0,g,0);e.process(g,e.channelCount);e._audio.setSource("data:audio/wav;base64,"+btoa(audioLib.PCMData.encode({data:g,sampleRate:e.sampleRate,channelCount:e.channelCount,bytesPerSample:e.quality})));if(!e._audio.currentFrame.src){e._audio.nextClip()}}e.kill=b.doInterval(f,40);e._bufferFill=f;e._audio=j},{quality:1,bufferSize:22050,getPlaybackTime:function(){var e=this._audio;return(e.currentFrame?e.currentFrame.currentTime*this.sampleRate:0)+e.samples}});function c(){var e=this;e.currentFrame=d();e.nextFrame=d();e._onended=function(){e.samples+=e.bufferSize;e.nextClip()}}c.prototype={samples:0,nextFrame:null,currentFrame:null,_onended:null,hasNextFrame:false,nextClip:function(){var e=this.currentFrame;this.currentFrame=this.nextFrame;this.nextFrame=e;this.hasNextFrame=false;this.currentFrame.play()},setSource:function(e){this.nextFrame.src=e;this.nextFrame.addEventListener("ended",this._onended,true);this.hasNextFrame=true}};a.wav.wavAudio=c}(this.Sink));(function(a,b){var c=typeof window==="undefined"?null:window.webkitAudioContext||window.AudioContext;a("webaudio",function(l,k,g,m){var n=this,d=a.webaudio.getContext(),j=null,h=null,f=null;n.start.apply(n,arguments);j=d.createJavaScriptNode(n.bufferSize,0,n.channelCount);function e(v){var o=v.outputBuffer,q=o.numberOfChannels,s,p,r=o.length,w=o.size,t=new Array(q),u;n.ready();h=h&&h.length===r*q?h:new Float32Array(r*q);f=f&&f.length===h.length?f:new Float32Array(r*q);h.set(f);for(s=0;s<q;s++){t[s]=o.getChannelData(s)}n.process(h,n.channelCount);for(s=0;s<r;s++){for(p=0;p<q;p++){t[p][s]=h[s*n.channelCount+p]}}}n.sampleRate=d.sampleRate;j.onaudioprocess=e;j.connect(d.destination);n._context=d;n._node=j;n._callback=e;b.push(j)},{kill:function(){this._node.disconnect(0);for(var d=0;d<b.length;d++){if(b[d]===this._node){b.splice(d--,1)}}this._node=this._context=null;this.emit("kill")},getPlaybackTime:function(){return this._context.currentTime*this.sampleRate}},false,true);a.webkit=a.webaudio;a.webaudio.fix82795=b;a.webaudio.getContext=function(){var d=new c();a.webaudio.getContext=function(){return d};return d}}(this.Sink.sinks,[]));(function(a){a.sinks("worker",function(){var b=this,e=(function(){return this}()),c=null,h=null,d=null;b.start.apply(b,arguments);importScripts();function f(o){if(!b.isReady){b.initMSP(o)}b.ready();var m=b.channelCount,j=o.audioLength,p,k;c=c&&c.length===j*m?c:new Float32Array(j*m);h=h&&h.length===c.length?h:new Float32Array(j*m);d=d&&d.length===c.length?d:new Float32Array(j*m);c.set(d);h.set(d);b.process(c,b.channelCount);for(p=0;p<m;p++){for(k=0;k<j;k++){h[p*o.audioLength+k]=c[p+k*m]}}o.writeAudio(h)}function g(s){if(!b.isReady){b.initWA(s)}b.ready();var j=s.outputBuffer,m=j.numberOfChannels,p,k,o=j.length,t=j.size,q=new Array(m),r;c=c&&c.length===o*m?c:new Float32Array(o*m);d=d&&d.length===c.length?d:new Float32Array(o*m);c.set(d);for(p=0;p<m;p++){q[p]=j.getChannelData(p)}b.process(c,b.channelCount);for(p=0;p<o;p++){for(k=0;k<m;k++){q[k][p]=c[p*b.channelCount+k]}}}e.onprocessmedia=f;e.onaudioprocess=g;b._mspBufferFill=f;b._waBufferFill=g},{ready:false,initMSP:function(b){this.channelCount=b.audioChannels;this.sampleRate=b.audioSampleRate;this.bufferSize=b.audioLength*this.channelCount;this.ready=true;this.emit("ready",[])},initWA:function(d){var c=d.outputBuffer;this.channelCount=c.numberOfChannels;this.sampleRate=c.sampleRate;this.bufferSize=c.length*this.channelCount;this.ready=true;this.emit("ready",[])}})}(this.Sink));(function(a){a.deinterleave=function(c,g){var b=c.length,f=b/g,d=[],e,h;for(e=0;e<g;e++){d[e]=new Float32Array(f);for(h=0;h<f;h++){d[e][h]=c[h*g+e]}}return d};a.interleave=function(d,g,c){g=g||d.length;var b=d[0].length,f=d.length,e,h;c=c||new Float32Array(b*g);for(e=0;e<f;e++){for(h=0;h<b;h++){c[e+h*g]=d[e][h]}}return c};a.mix=function(e){var d=[].slice.call(arguments,1),b,f,g;for(g=0;g<d.length;g++){b=Math.max(e.length,d[g].length);for(f=0;f<b;f++){e[f]+=d[g][f]}}return e};a.resetBuffer=function(c){var b=c.length,d;for(d=0;d<b;d++){c[d]=0}return c};a.clone=function(d,b){var c=d.length,e;b=b||new Float32Array(c);for(e=0;e<c;e++){b[e]=d[e]}return b};a.createDeinterleaved=function(e,d){var b=new Array(d),c;for(c=0;c<d;c++){b[c]=new Float32Array(e)}return b};a.memcpy=function(f,b,g,d,e){f=f.subarray||f.slice?f:f.buffer;g=g.subarray||g.slice?g:g.buffer;f=b?f.subarray?f.subarray(b,e&&b+e):f.slice(b,e&&b+e):f;if(g.set){g.set(f,d)}else{for(var c=0;c<f.length;c++){g[c+d]=f[c]}}return g};a.memslice=function(b,d,c){return b.subarray?b.subarray(d,c):b.slice(d,c)};a.mempad=function(b,c,d){c=c.length?c:new (b.constructor)(c);a.memcpy(b,0,c,d);return c};a.linspace=function(h,c,d){var b,e,g,f;d=d.length?(b=d.length)&&d:Array(b=d);f=(c-h)/--b;for(g=h+f,e=1;e<b;e++,g+=f){d[e]=g}d[0]=h;d[b]=c;return d};a.ftoi=function(d,f,c){var e,b=Math.pow(2,f-1);c=c||new (d.constructor)(d.length);for(e=0;e<d.length;e++){c[e]=~~(b*d[e])}return c}}(this.Sink));(function(a){function b(e,d){a.EventEmitter.call(this);this.bufferSize=isNaN(e)||e===null?this.bufferSize:e;this.channelCount=isNaN(d)||d===null?this.channelCount:d;var c=this;this.callback=function(){return c.process.apply(c,arguments)};this.resetBuffer()}b.prototype={buffer:null,zeroBuffer:null,parentSink:null,bufferSize:4096,channelCount:2,offset:null,resetBuffer:function(){this.buffer=new Float32Array(this.bufferSize);this.zeroBuffer=new Float32Array(this.bufferSize)},process:function(c,e){if(this.offset===null){this.loadBuffer()}for(var d=0;d<c.length;d++){if(this.offset>=this.buffer.length){this.loadBuffer()}c[d]=this.buffer[this.offset++]}},loadBuffer:function(){this.offset=0;a.memcpy(this.zeroBuffer,0,this.buffer,0);this.emit("audioprocess",[this.buffer,this.channelCount])}};a.Proxy=b;a.prototype.createProxy=function(d){var c=new a.Proxy(d,this.channelCount);c.parentSink=this;this.on("audioprocess",c.callback);return c}}(this.Sink));(function(a){(function(){function b(c,d){if(c&&d){b[c]=d}else{if(c&&b[c] instanceof Function){a.interpolate=b[c]}}return b[c]}a.interpolation=b;b("linear",function(c,g){var f=Math.floor(g),e=f+1,d=g-f;e=e<c.length?e:0;return c[f]*(1-d)+c[e]*d});b("nearest",function(c,d){return d>=c.length-0.5?c[0]:c[Math.round(d)]});b("linear")}());a.resample=function(j,b,o,p,d){var h=arguments.length,f=h===2?b:h===3?b/o:p/b*d/o,g=j.length,c=Math.ceil(g/f),m=new Float32Array(c),k,e;for(k=0,e=0;k<g;k+=f){m[e++]=a.interpolate(j,k)}return m}}(this.Sink));void function(b){b.on("init",function(c){c.activeRecordings=[];c.on("postprocess",c.recordData)});b.prototype.activeRecordings=null;b.prototype.record=function(){var c=new b.Recording(this);this.emit("record",[c]);return c};b.prototype.recordData=function(d){var f=this.activeRecordings,e,c=f.length;for(e=0;e<c;e++){f[e].add(d)}};function a(c){this.boundTo=c;this.buffers=[];c.activeRecordings.push(this)}a.prototype={add:function(c){this.buffers.push(c)},clear:function(){this.buffers=[]},stop:function(){var c=this.boundTo.activeRecordings,d;for(d=0;d<c.length;d++){if(c[d]===this){c.splice(d--,1)}}},join:function(){var g=0,h=0,e=this.buffers,c,j,f,d=e.length;for(f=0;f<d;f++){g+=e[f].length}c=new Float32Array(g);for(f=0;f<d;f++){for(j=0;j<e[f].length;j++){c[h+j]=e[f][j]}h+=e[f].length}return c}};b.Recording=a}(this.Sink);void function(b){function a(){if(this.ringBuffer){(this.channelMode==="interleaved"?this.ringSpin:this.ringSpinInterleaved).apply(this,arguments)}}b.on("init",function(c){c.on("preprocess",a)});b.prototype.ringBuffer=null;b.prototype.ringSpin=function(e){var f=this.ringBuffer,d=e.length,c=f.length,h=this.ringOffset,g;for(g=0;g<d;g++){e[g]+=f[h];h=(h+1)%c}this.ringOffset=h};b.prototype.ringSpinDeinterleaved=function(j){var h=this.ringBuffer,g=j.length,c=h.length,f=h[0].length,o=c*f,e=this.ringOffset,k,d;for(k=0;k<g;k+=c){for(d=0;d<c;d++){j[k+d]+=h[d][e]}e=(e+1)%f}this.ringOffset=d}}(this.Sink);void function(a,b){b=a.prototype;a.on("init",function(c){c.asyncBuffers=[];c.syncBuffers=[];c.on("preprocess",c.writeBuffersSync);c.on("postprocess",c.writeBuffersAsync)});b.writeMode="async";b.asyncBuffers=b.syncBuffers=null;b.writeBuffersAsync=function(e){var d=this.asyncBuffers,c=e.length,f,h,g,k,j;if(d){for(g=0;g<d.length;g++){f=d[g];h=f.b.length;j=f.d;f.d-=Math.min(j,c);for(k=0;k+j<c&&k<h;k++){e[k+j]+=f.b[k]}f.b=f.b.subarray(k+j);if(g>=h){d.splice(g--,1)}}}};b.writeBuffersSync=function(e){var d=this.syncBuffers,c=e.length,f=0,g=0;for(;f<c&&d.length;f++){e[f]+=d[0][g];if(d[0].length<=g){d.splice(0,1);g=0;continue}g++}if(d.length){d[0]=d[0].subarray(g)}};b.writeBufferAsync=function(d,e){d=this.mode==="deinterleaved"?a.interleave(d,this.channelCount):d;var c=this.asyncBuffers;c.push({b:d,d:isNaN(e)?~~((+new Date()-this.previousHit)/1000*this.sampleRate):e});return c.length};b.writeBufferSync=function(d){d=this.mode==="deinterleaved"?a.interleave(d,this.channelCount):d;var c=this.syncBuffers;c.push(d);return c.length};b.writeBuffer=function(){return this[this.writeMode==="async"?"writeBufferAsync":"writeBufferSync"].apply(this,arguments)};b.getSyncWriteOffset=function(){var c=this.syncBuffers,e=0,d;for(d=0;d<c.length;d++){e+=c[d].length}return e}}(this.Sink);
\ No newline at end of file |
