From 9a7278ee2ed435a8ac68b2506d8b0975b905600d Mon Sep 17 00:00:00 2001 From: Ian McGregor Date: Wed, 16 Nov 2016 15:39:39 +0000 Subject: [PATCH] :gem: v0.1.81 --- bower.json | 2 +- dist/sono.js | 4 ++-- dist/sono.js.map | 2 +- dist/sono.min.js | 2 +- package.json | 2 +- src/sono.js | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bower.json b/bower.json index a7177a7..3490262 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "sono", - "version": "0.1.8", + "version": "0.1.81", "homepage": "https://github.com/Stinkdigital/sono", "authors": [ "Ian McGregor " diff --git a/dist/sono.js b/dist/sono.js index 0e0d20e..dfa7db4 100755 --- a/dist/sono.js +++ b/dist/sono.js @@ -44,7 +44,7 @@ browser.handleTouchLock = function (context, onUnlock) { function unlock() { if (context && context.state === 'suspended') { context.resume().then(function () { - var buffer = context.createBuffer(1, 1, 22050); + var buffer = context.createBuffer(1, 1, 44100); var source = context.createBufferSource(); source.buffer = buffer; source.connect(context.destination); @@ -4295,7 +4295,7 @@ var utils = Object.freeze({ }); function Sono() { - var VERSION = '0.1.8'; + var VERSION = '0.1.81'; var context = utils.getContext(); var destination = context ? context.destination : null; var group = new Group(context, destination); diff --git a/dist/sono.js.map b/dist/sono.js.map index ba45b17..4973233 100644 --- a/dist/sono.js.map +++ b/dist/sono.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/lib/utils/browser.js","../src/lib/utils/file.js","../src/lib/effect/analyser.js","../src/lib/utils/validify.js","../src/lib/effect/distortion.js","../src/lib/effect/echo.js","../src/lib/effect/fake-context.js","../src/lib/effect/filter.js","../src/lib/effect/flanger.js","../src/lib/effect/panner.js","../src/lib/effect/phaser.js","../src/lib/effect/recorder.js","../src/lib/effect/reverb.js","../src/lib/effect.js","../src/lib/group.js","../node_modules/events/events.js","../src/lib/utils/emitter.js","../src/lib/utils/loader.js","../src/lib/source/buffer-source.js","../src/lib/source/media-source.js","../src/lib/source/microphone-source.js","../src/lib/source/oscillator-source.js","../src/lib/source/script-source.js","../src/lib/utils/waveform.js","../src/lib/sound.js","../src/lib/utils/sound-group.js","../src/lib/utils/microphone.js","../src/lib/utils/waveformer.js","../src/lib/utils/utils.js","../src/sono.js"],"sourcesContent":["const browser = {};\n\nbrowser.handlePageVisibility = function(onHidden, onShown) {\n let hidden,\n visibilityChange;\n\n if (typeof document.hidden !== 'undefined') {\n hidden = 'hidden';\n visibilityChange = 'visibilitychange';\n } else if (typeof document.mozHidden !== 'undefined') {\n hidden = 'mozHidden';\n visibilityChange = 'mozvisibilitychange';\n } else if (typeof document.msHidden !== 'undefined') {\n hidden = 'msHidden';\n visibilityChange = 'msvisibilitychange';\n } else if (typeof document.webkitHidden !== 'undefined') {\n hidden = 'webkitHidden';\n visibilityChange = 'webkitvisibilitychange';\n }\n\n function onChange() {\n if (document[hidden]) {\n onHidden();\n } else {\n onShown();\n }\n }\n\n if (typeof visibilityChange !== 'undefined') {\n document.addEventListener(visibilityChange, onChange, false);\n }\n};\n\nbrowser.handleTouchLock = function(context, onUnlock) {\n const ua = navigator.userAgent,\n locked = !!ua.match(\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|SymbianOS/i);\n\n function unlock() {\n if (context && context.state === 'suspended') {\n context.resume()\n .then(function() {\n const buffer = context.createBuffer(1, 1, 22050);\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n source.start(0);\n source.stop(0);\n source.disconnect();\n\n document.body.removeEventListener('touchend', unlock);\n onUnlock();\n });\n } else {\n document.body.removeEventListener('touchend', unlock);\n onUnlock();\n }\n }\n\n if (locked) {\n document.body.addEventListener('touchend', unlock, false);\n }\n\n return locked;\n};\n\nexport default browser;\n","const extensions = [];\nconst canPlay = {};\n\n/*\n * Initial tests\n */\n\nconst tests = [{\n ext: 'ogg',\n type: 'audio/ogg; codecs=\"vorbis\"'\n}, {\n ext: 'mp3',\n type: 'audio/mpeg;'\n}, {\n ext: 'opus',\n type: 'audio/ogg; codecs=\"opus\"'\n}, {\n ext: 'wav',\n type: 'audio/wav; codecs=\"1\"'\n}, {\n ext: 'm4a',\n type: 'audio/x-m4a;'\n}, {\n ext: 'm4a',\n type: 'audio/aac;'\n}];\n\nlet el = document.createElement('audio');\nif (el) {\n tests.forEach(function(test) {\n const canPlayType = !!el.canPlayType(test.type);\n if (canPlayType && extensions.indexOf(test.ext) === -1) {\n extensions.push(test.ext);\n }\n canPlay[test.ext] = canPlayType;\n });\n el = null;\n}\n\n/*\n * find a supported file\n */\n\nfunction getFileExtension(url) {\n if (typeof url !== 'string') {\n return '';\n }\n // from DataURL\n if (url.slice(0, 5) === 'data:') {\n const match = url.match(/data:audio\\/(ogg|mp3|opus|wav|m4a)/i);\n if (match && match.length > 1) {\n return match[1].toLowerCase();\n }\n }\n // from Standard URL\n url = url.split('?')[0];\n url = url.slice(url.lastIndexOf('/') + 1);\n\n const a = url.split('.');\n if (a.length === 1 || (a[0] === '' && a.length === 2)) {\n return '';\n }\n return a.pop()\n .toLowerCase();\n}\n\nfunction getSupportedFile(fileNames) {\n let name;\n\n if (Array.isArray(fileNames)) {\n // if array get the first one that works\n for (let i = 0; i < fileNames.length; i++) {\n name = fileNames[i];\n const ext = getFileExtension(name);\n if (extensions.indexOf(ext) > -1) {\n break;\n }\n }\n } else if (typeof fileNames === 'object') {\n // if not array and is object\n Object.keys(fileNames)\n .some(function(key) {\n name = fileNames[key];\n const ext = getFileExtension(name);\n return extensions.indexOf(ext) > -1;\n });\n }\n // if string just return\n return name || fileNames;\n}\n\n/*\n * infer file types\n */\n\nfunction isAudioBuffer(data) {\n return !!(data &&\n window.AudioBuffer &&\n data instanceof window.AudioBuffer);\n}\n\nfunction isArrayBuffer(data) {\n return !!(data &&\n window.ArrayBuffer &&\n data instanceof window.ArrayBuffer);\n}\n\nfunction isMediaElement(data) {\n return !!(data &&\n window.HTMLMediaElement &&\n data instanceof window.HTMLMediaElement);\n}\n\nfunction isMediaStream(data) {\n return !!(data &&\n typeof data.getAudioTracks === 'function' &&\n data.getAudioTracks()\n .length &&\n window.MediaStreamTrack &&\n data.getAudioTracks()[0] instanceof window.MediaStreamTrack);\n}\n\nfunction isOscillatorType(data) {\n return !!(data && typeof data === 'string' &&\n (data === 'sine' || data === 'square' ||\n data === 'sawtooth' || data === 'triangle'));\n}\n\nfunction isScriptConfig(data) {\n return !!(data && typeof data === 'object' &&\n data.bufferSize && data.channels && data.callback);\n}\n\nfunction isURL(data) {\n return !!(data && typeof data === 'string' &&\n (data.indexOf('.') > -1 || data.slice(0, 5) === 'data:'));\n}\n\nfunction containsURL(config) {\n if (!config || isMediaElement(config)) {\n return false;\n }\n // string, array or object with src/url/data property that is string, array or arraybuffer\n const src = config.src || config.url || config.data || config;\n return isURL(src) || isArrayBuffer(src) || (Array.isArray(src) && isURL(src[0]));\n}\n\nexport default {\n canPlay,\n containsURL,\n extensions,\n getFileExtension,\n getSupportedFile,\n isAudioBuffer,\n isMediaElement,\n isMediaStream,\n isOscillatorType,\n isScriptConfig,\n isURL\n};\n","export default function Analyser(context, config) {\n config = config || {};\n\n const node = context.createAnalyser();\n\n let fftSize = config.fftSize || 512,\n freqFloat = !!config.float,\n waveFloat = !!config.float,\n waveform,\n frequencies;\n\n node.fftSize = fftSize; // frequencyBinCount will be half this value\n node.smoothingTimeConstant = config.smoothing || config.smoothingTimeConstant || node.smoothingTimeConstant;\n node.minDecibels = config.minDecibels || node.minDecibels;\n node.maxDecibels = config.maxDecibels || node.maxDecibels;\n\n //the worker returns a normalized value\n //first a sum of all magnitudes devided by the byteLength, then devide by half the fft (1channel)\n const amplitudeBlob = new Blob([\n 'onmessage=function(e){var data=e.data;var f=new Float32Array(data.b);for(var i=0;i0.9)&&(correlation>lastCorrelation)){foundGoodCorrelation=true;if (correlation>best_correlation){best_correlation=correlation;best_offset=offset}}else if (foundGoodCorrelation){var shift=(correlations[best_offset+1]-correlations[best_offset-1])/correlations[best_offset];postMessage(sampleRate/(best_offset+(8*shift)))}lastCorrelation=correlation}if (best_correlation>0.01){postMessage(sampleRate/best_offset)}else{postMessage(-1)}}};'\n ]);\n const amplitudeBlobURL = URL.createObjectURL(amplitudeBlob);\n const amplitudeWorker = new Worker(amplitudeBlobURL);\n const pitchBlobURL = URL.createObjectURL(pitchBlob);\n const pitchWorker = new Worker(pitchBlobURL);\n\n let amplitudeCallback = null;\n const noteStrings = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];\n let pitchCallback = null;\n const pitchCallbackObject = {\n hertz: null, //number\n note: null, //string\n noteIndex: null, //int\n detuneCents: null, //number\n detune: null //string\n };\n\n function noteFromPitch(frequency) {\n const noteNum = 12 * (Math.log(frequency / 440) / Math.log(2));\n return Math.round(noteNum) + 69;\n }\n\n function frequencyFromNoteNumber(note) {\n return 440 * Math.pow(2, (note - 69) / 12);\n }\n\n function centsOffFromPitch(frequency, note) {\n return Math.floor(1200 * Math.log(frequency / frequencyFromNoteNumber(note)) / Math.log(2));\n }\n\n amplitudeWorker.onmessage = function(e) {\n if (amplitudeCallback) {\n amplitudeCallback(e.data);\n }\n };\n\n pitchWorker.onmessage = function(e) {\n if (pitchCallback) {\n const Hz = e.data;\n if (Hz !== -1) {\n const note = noteFromPitch(Hz);\n const detune = centsOffFromPitch(Hz, note);\n pitchCallbackObject.hertz = Hz;\n pitchCallbackObject.noteIndex = note % 12;\n pitchCallbackObject.note = noteStrings[note % 12];\n pitchCallbackObject.detuneCents = detune;\n if (detune === 0) {\n pitchCallbackObject.detune = '';\n } else if (detune < 0) {\n pitchCallbackObject.detune = 'flat';\n } else {\n pitchCallbackObject.detune = 'sharp';\n }\n }\n pitchCallback(pitchCallbackObject);\n }\n };\n\n function needsUpdate(arr, float) {\n if (!arr) {\n return true;\n }\n if (node.fftSize !== fftSize) {\n return true;\n }\n if (float && arr instanceof Uint8Array) {\n return true;\n }\n return !float && arr instanceof Float32Array;\n }\n\n function createArray(float, length) {\n return float ? new Float32Array(length) : new Uint8Array(length);\n }\n\n node.getWaveform = function(float) {\n if (!arguments.length) {\n float = waveFloat;\n }\n\n if (needsUpdate(waveform, float)) {\n fftSize = node.fftSize;\n waveFloat = float;\n waveform = createArray(float, fftSize);\n }\n if (float && this.getFloatTimeDomainData) {\n this.getFloatTimeDomainData(waveform);\n } else {\n this.getByteTimeDomainData(waveform);\n }\n\n return waveform;\n };\n\n node.getPitch = function(callback) {\n pitchCallback = pitchCallback || callback;\n const f = new Float32Array(node.fftSize);\n f.set(node.getWaveform(true));\n pitchWorker.postMessage({\n sampleRate: context.sampleRate,\n b: f.buffer\n }, [f.buffer]);\n };\n\n node.getFrequencies = function(float) {\n if (!arguments.length) {\n float = freqFloat;\n }\n\n if (needsUpdate(frequencies, float)) {\n fftSize = node.fftSize;\n freqFloat = float;\n frequencies = createArray(float, node.frequencyBinCount);\n }\n\n if (float) {\n this.getFloatFrequencyData(frequencies);\n } else {\n this.getByteFrequencyData(frequencies);\n }\n\n return frequencies;\n };\n\n node.getAmplitude = function(callback) {\n amplitudeCallback = amplitudeCallback || callback;\n const f = new Float32Array(node.fftSize);\n f.set(node.getFrequencies(true));\n amplitudeWorker.postMessage({\n sum: 0,\n length: f.byteLength,\n numSamples: node.fftSize / 2,\n b: f.buffer\n }, [f.buffer]);\n };\n\n node.update = function() {\n node.getWaveform();\n node.getFrequencies();\n };\n\n Object.defineProperties(node, {\n smoothing: {\n get: function() {\n return node.smoothingTimeConstant;\n },\n set: function(value) {\n node.smoothingTimeConstant = value;\n }\n }\n });\n\n return node;\n}\n","function number(value, defaultValue) {\n if (arguments.length < 2) {\n defaultValue = 0;\n }\n if (typeof value !== 'number' || isNaN(value)) {\n return defaultValue;\n }\n return value;\n}\n\nexport {number};\n","import {number} from '../utils/validify.js';\n\nconst n = 22050;\n\nexport default function Distortion(context, amount) {\n\n amount = number(amount, 1);\n\n const node = context.createWaveShaper();\n const curve = new Float32Array(n);\n\n // create waveShaper distortion curve from 0 to 1\n node.update = function(value) {\n amount = value;\n if (amount <= 0) {\n amount = 0;\n this.curve = null;\n return;\n }\n const k = value * 100;\n const deg = Math.PI / 180;\n let x;\n\n for (let i = 0; i < n; i++) {\n x = i * 2 / n - 1;\n curve[i] = (3 + k) * x * 20 * deg / (Math.PI + k * Math.abs(x));\n }\n\n this.curve = curve;\n };\n\n Object.defineProperties(node, {\n amount: {\n get: function() {\n return amount;\n },\n set: function(value) {\n this.update(value);\n }\n }\n });\n\n if (typeof amount !== 'undefined') {\n node.update(amount);\n }\n\n return node;\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Echo(context, config) {\n config = config || {};\n\n const input = context.createGain();\n const delay = context.createDelay();\n const gain = context.createGain();\n const output = context.createGain();\n\n delay.delayTime.value = number(config.delayTime, 0.5);\n gain.gain.value = number(config.feedback, 0.5);\n\n input.connect(delay);\n input.connect(output);\n delay.connect(gain);\n gain.connect(delay);\n gain.connect(output);\n\n const node = input;\n node.name = 'Echo';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delay.delayTime.value;\n },\n set: function(value) {\n delay.delayTime.value = value;\n }\n },\n feedback: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n gain.gain.value = value;\n }\n }\n });\n\n return node;\n}\n","export default function FakeContext() {\n\n const startTime = Date.now();\n\n function fn() {}\n\n function param() {\n return {\n value: 1,\n defaultValue: 1,\n linearRampToValueAtTime: fn,\n setValueAtTime: fn,\n exponentialRampToValueAtTime: fn,\n setTargetAtTime: fn,\n setValueCurveAtTime: fn,\n cancelScheduledValues: fn\n };\n }\n\n function fakeNode() {\n return {\n connect: fn,\n disconnect: fn,\n // analyser\n frequencyBinCount: 0,\n smoothingTimeConstant: 0,\n fftSize: 0,\n minDecibels: 0,\n maxDecibels: 0,\n getByteTimeDomainData: fn,\n getByteFrequencyData: fn,\n getFloatTimeDomainData: fn,\n getFloatFrequencyData: fn,\n // gain\n gain: param(),\n // panner\n panningModel: 0,\n setPosition: fn,\n setOrientation: fn,\n setVelocity: fn,\n distanceModel: 0,\n refDistance: 0,\n maxDistance: 0,\n rolloffFactor: 0,\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n // filter:\n type: 0,\n frequency: param(),\n Q: param(),\n detune: param(),\n // delay\n delayTime: param(),\n // convolver\n buffer: 0,\n // compressor\n threshold: param(),\n knee: param(),\n ratio: param(),\n attack: param(),\n release: param(),\n reduction: param(),\n // distortion\n oversample: 0,\n curve: 0,\n // buffer\n sampleRate: 1,\n length: 0,\n duration: 0,\n numberOfChannels: 0,\n getChannelData: function() {\n return [];\n },\n copyFromChannel: fn,\n copyToChannel: fn,\n // listener\n dopplerFactor: 0,\n speedOfSound: 0,\n // osc\n start: fn\n };\n }\n\n // ie9\n if (!window.Uint8Array) {\n window.Uint8Array = window.Float32Array = Array;\n }\n\n return {\n createAnalyser: fakeNode,\n createBuffer: fakeNode,\n createBiquadFilter: fakeNode,\n createChannelMerger: fakeNode,\n createChannelSplitter: fakeNode,\n createDynamicsCompressor: fakeNode,\n createConvolver: fakeNode,\n createDelay: fakeNode,\n createGain: fakeNode,\n createOscillator: fakeNode,\n createPanner: fakeNode,\n createScriptProcessor: fakeNode,\n createWaveShaper: fakeNode,\n listener: fakeNode(),\n get currentTime() {\n return (Date.now() - startTime) / 1000;\n }\n };\n}\n","// https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode\n// For lowpass and highpass Q indicates how peaked the frequency is around the cutoff.\n// The greater the value is, the greater is the peak\n\nexport default function Filter(context, config = {}) {\n // Frequency between 40Hz and half of the sampling rate\n const minFrequency = 40;\n const maxFrequency = context.sampleRate / 2;\n\n const node = context.createBiquadFilter();\n node.type = config.type;\n\n function getFrequency(value) {\n // Logarithm (base 2) to compute how many octaves fall in the range.\n const numberOfOctaves = Math.log(maxFrequency / minFrequency) / Math.LN2;\n // Compute a multiplier from 0 to 1 based on an exponential scale.\n const multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n // Get back to the frequency value between min and max.\n return maxFrequency * multiplier;\n }\n\n node.set = function(frequency, q, gain) {\n if (typeof frequency !== 'undefined' && typeof frequency === 'number') {\n node.frequency.value = frequency;\n }\n if (typeof q !== 'undefined' && typeof q === 'number') {\n node.Q.value = q;\n }\n if (typeof gain !== 'undefined' && typeof gain === 'number') {\n node.gain.value = gain;\n }\n return node;\n };\n\n // set filter frequency based on value from 0 to 1\n node.setByPercent = function(percent, q, gain) {\n return node.set(getFrequency(percent), q, gain);\n };\n\n return node.set(config.frequency, config.q, config.gain);\n}\n","import {number} from '../utils/validify.js';\n\nfunction MonoFlanger(context, config) {\n const input = context.createGain();\n const delay = context.createDelay();\n const feedback = context.createGain();\n const lfo = context.createOscillator();\n const gain = context.createGain();\n const output = context.createGain();\n\n delay.delayTime.value = number(config.delay, 0.005); // 5-25ms delay (0.005 > 0.025)\n feedback.gain.value = number(config.feedback, 0.5); // 0 > 1\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.002); // 0.05 > 5\n gain.gain.value = number(config.gain, 0.25); // 0.0005 > 0.005\n\n input.connect(output);\n input.connect(delay);\n delay.connect(output);\n delay.connect(feedback);\n feedback.connect(input);\n\n lfo.connect(gain);\n gain.connect(delay.delayTime);\n lfo.start(0);\n\n const node = input;\n node.name = 'Flanger';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delay.delayTime.value;\n },\n set: function(value) {\n delay.delayTime.value = value;\n }\n },\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n gain.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedback.gain.value;\n },\n set: function(value) {\n feedback.gain.value = value;\n }\n }\n });\n\n return node;\n}\n\nfunction StereoFlanger(context, config) {\n const input = context.createGain();\n const splitter = context.createChannelSplitter(2);\n const merger = context.createChannelMerger(2);\n const feedbackL = context.createGain();\n const feedbackR = context.createGain();\n const lfo = context.createOscillator();\n const lfoGainL = context.createGain();\n const lfoGainR = context.createGain();\n const delayL = context.createDelay();\n const delayR = context.createDelay();\n const output = context.createGain();\n\n feedbackL.gain.value = feedbackR.gain.value = number(config.feedback, 0.5);\n delayL.delayTime.value = delayR.delayTime.value = number(config.delay, 0.003);\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.5);\n lfoGainL.gain.value = number(config.gain, 0.005);\n lfoGainR.gain.value = 0 - lfoGainL.gain.value;\n\n input.connect(splitter);\n\n splitter.connect(delayL, 0);\n splitter.connect(delayR, 1);\n\n delayL.connect(feedbackL);\n delayR.connect(feedbackR);\n\n feedbackL.connect(delayR);\n feedbackR.connect(delayL);\n\n delayL.connect(merger, 0, 0);\n delayR.connect(merger, 0, 1);\n\n merger.connect(output);\n input.connect(output);\n\n lfo.connect(lfoGainL);\n lfo.connect(lfoGainR);\n lfoGainL.connect(delayL.delayTime);\n lfoGainR.connect(delayR.delayTime);\n lfo.start(0);\n\n const node = input;\n node.name = 'StereoFlanger';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delayL.delayTime.value;\n },\n set: function(value) {\n delayL.delayTime.value = delayR.delayTime.value = value;\n }\n },\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return lfoGainL.gain.value;\n },\n set: function(value) {\n lfoGainL.gain.value = lfoGainR.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedbackL.gain.value;\n },\n set: function(value) {\n feedbackL.gain.value = feedbackR.gain.value = value;\n }\n }\n });\n\n return node;\n}\n\nexport default function Flanger(context, config) {\n config = config || {};\n return config.stereo ? new StereoFlanger(context, config) : new MonoFlanger(context, config);\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Panner(context) {\n const node = context.createPanner();\n\n // Default for stereo is 'HRTF' can also be 'equalpower'\n node.panningModel = Panner.defaults.panningModel;\n\n // Distance model and attributes\n // Can be 'linear' 'inverse' 'exponential'\n node.distanceModel = Panner.defaults.distanceModel;\n node.refDistance = Panner.defaults.refDistance;\n node.maxDistance = Panner.defaults.maxDistance;\n node.rolloffFactor = Panner.defaults.rolloffFactor;\n node.coneInnerAngle = Panner.defaults.coneInnerAngle;\n node.coneOuterAngle = Panner.defaults.coneOuterAngle;\n node.coneOuterGain = Panner.defaults.coneOuterGain;\n // set to defaults (needed in Firefox)\n node.setPosition(0, 0, 1);\n node.setOrientation(0, 0, 0);\n\n // simple vec3 object pool\n const vecPool = {\n pool: [],\n get: function(x, y, z) {\n const v = this.pool.length ? this.pool.pop() : {\n x: 0,\n y: 0,\n z: 0\n };\n // check if a vector has been passed in\n if (typeof x !== 'undefined' && isNaN(x) && 'x' in x && 'y' in x && 'z' in x) {\n v.x = number(x.x);\n v.y = number(x.y);\n v.z = number(x.z);\n } else {\n v.x = number(x);\n v.y = number(y);\n v.z = number(z);\n }\n return v;\n },\n dispose: function(instance) {\n this.pool.push(instance);\n }\n };\n\n const globalUp = vecPool.get(0, 1, 0),\n angle45 = Math.PI / 4,\n angle90 = Math.PI / 2;\n\n // cross product of 2 vectors\n function cross(a, b) {\n const ax = a.x,\n ay = a.y,\n az = a.z;\n const bx = b.x,\n by = b.y,\n bz = b.z;\n a.x = ay * bz - az * by;\n a.y = az * bx - ax * bz;\n a.z = ax * by - ay * bx;\n }\n\n // normalise to unit vector\n function normalize(vec3) {\n if (vec3.x === 0 && vec3.y === 0 && vec3.z === 0) {\n return vec3;\n }\n const length = Math.sqrt(vec3.x * vec3.x + vec3.y * vec3.y + vec3.z * vec3.z);\n const invScalar = 1 / length;\n vec3.x *= invScalar;\n vec3.y *= invScalar;\n vec3.z *= invScalar;\n return vec3;\n }\n\n // set the orientation of the source (where the audio is coming from)\n function setOrientation(pannerNode, fw) {\n // calculate up vec ( up = (forward cross (0, 1, 0)) cross forward )\n const up = vecPool.get(fw.x, fw.y, fw.z);\n cross(up, globalUp);\n cross(up, fw);\n normalize(up);\n normalize(fw);\n // set the audio context's listener position to match the camera position\n pannerNode.setOrientation(fw.x, fw.y, fw.z, up.x, up.y, up.z);\n // return the vecs to the pool\n vecPool.dispose(fw);\n vecPool.dispose(up);\n }\n\n function setPosition(nodeOrListener, vec) {\n nodeOrListener.setPosition(vec.x, vec.y, vec.z);\n vecPool.dispose(vec);\n }\n\n\n node.set = function(x, y, z) {\n const v = vecPool.get(x, y, z);\n\n if (arguments.length === 1 && v.x) {\n // pan left to right with value from -1 to 1\n x = v.x;\n\n if (x > 1) {\n x = 1;\n }\n if (x < -1) {\n x = -1;\n }\n\n // creates a nice curve with z\n x = x * angle45;\n z = x + angle90;\n\n if (z > angle90) {\n z = Math.PI - z;\n }\n\n v.x = Math.sin(x);\n v.z = Math.sin(z);\n }\n setPosition(node, v);\n };\n\n // set the position the audio is coming from)\n node.setSourcePosition = function(x, y, z) {\n setPosition(node, vecPool.get(x, y, z));\n };\n\n // set the direction the audio is coming from)\n node.setSourceOrientation = function(x, y, z) {\n setOrientation(node, vecPool.get(x, y, z));\n };\n\n // set the position of who or what is hearing the audio (could be camera or some character)\n node.setListenerPosition = function(x, y, z) {\n setPosition(context.listener, vecPool.get(x, y, z));\n };\n\n // set the position of who or what is hearing the audio (could be camera or some character)\n node.setListenerOrientation = function(x, y, z) {\n setOrientation(context.listener, vecPool.get(x, y, z));\n };\n\n node.getDefaults = function() {\n return Panner.defaults;\n };\n\n node.setDefaults = function(defaults) {\n Object.keys(defaults)\n .forEach(function(key) {\n Panner.defaults[key] = defaults[key];\n });\n };\n\n return node;\n}\n\nPanner.defaults = {\n panningModel: 'HRTF',\n distanceModel: 'linear',\n refDistance: 1,\n maxDistance: 1000,\n rolloffFactor: 1,\n coneInnerAngle: 360,\n coneOuterAngle: 0,\n coneOuterGain: 0\n};\n","import {number} from '../utils/validify.js';\n\nexport default function Phaser(context, config = {}) {\n const stages = number(config.stages, 8);\n const filters = [];\n let filter;\n\n const input = context.createGain();\n const feedback = context.createGain();\n const lfo = context.createOscillator();\n const lfoGain = context.createGain();\n const output = context.createGain();\n\n feedback.gain.value = number(config.feedback, 0.5);\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.5);\n lfoGain.gain.value = number(config.gain, 300);\n\n for (let i = 0; i < stages; i++) {\n filter = context.createBiquadFilter();\n filter.type = 'allpass';\n filter.frequency.value = 1000 * i;\n //filter.Q.value = 10;\n if (i > 0) {\n filters[i - 1].connect(filter);\n }\n lfoGain.connect(filter.frequency);\n\n filters.push(filter);\n }\n\n const first = filters[0];\n const last = filters[filters.length - 1];\n\n input.connect(first);\n input.connect(output);\n last.connect(output);\n last.connect(feedback);\n feedback.connect(first);\n lfo.connect(lfoGain);\n lfo.start(0);\n\n const node = input;\n node.name = 'Phaser';\n node._output = output;\n\n Object.defineProperties(node, {\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return lfoGain.gain.value;\n },\n set: function(value) {\n lfoGain.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedback.gain.value;\n },\n set: function(value) {\n feedback.gain.value = value;\n }\n }\n });\n\n return node;\n}\n","export default function Recorder(context, passThrough) {\n const bufferLength = 4096,\n buffersL = [],\n buffersR = [];\n let startedAt = 0,\n stoppedAt = 0;\n\n const input = context.createGain();\n const output = context.createGain();\n let script;\n\n const node = input;\n node.name = 'Recorder';\n node._output = output;\n\n node.isRecording = false;\n\n function mergeBuffers(buffers, length) {\n const buffer = new Float32Array(length);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffer.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return buffer;\n }\n\n function getBuffer() {\n if (!buffersL.length) {\n return context.createBuffer(2, bufferLength, context.sampleRate);\n }\n const recordingLength = buffersL.length * bufferLength;\n const buffer = context.createBuffer(2, recordingLength, context.sampleRate);\n buffer.getChannelData(0)\n .set(mergeBuffers(buffersL, recordingLength));\n buffer.getChannelData(1)\n .set(mergeBuffers(buffersR, recordingLength));\n return buffer;\n }\n\n function destroyScriptProcessor() {\n if (script) {\n script.onaudioprocess = null;\n input.disconnect();\n script.disconnect();\n }\n }\n\n function createScriptProcessor() {\n destroyScriptProcessor();\n\n script = context.createScriptProcessor(bufferLength, 2, 2);\n input.connect(script);\n script.connect(context.destination);\n script.connect(output);\n\n\n script.onaudioprocess = function(event) {\n const inputL = event.inputBuffer.getChannelData(0);\n const inputR = event.inputBuffer.getChannelData(1);\n\n if (passThrough) {\n const outputL = event.outputBuffer.getChannelData(0);\n const outputR = event.outputBuffer.getChannelData(1);\n outputL.set(inputL);\n outputR.set(inputR);\n }\n\n if (node.isRecording) {\n buffersL.push(new Float32Array(inputL));\n buffersR.push(new Float32Array(inputR));\n }\n };\n }\n\n node.start = function() {\n createScriptProcessor();\n buffersL.length = 0;\n buffersR.length = 0;\n startedAt = context.currentTime;\n stoppedAt = 0;\n this.isRecording = true;\n };\n\n node.stop = function() {\n stoppedAt = context.currentTime;\n this.isRecording = false;\n destroyScriptProcessor();\n return getBuffer();\n };\n\n node.getDuration = function() {\n if (!this.isRecording) {\n return stoppedAt - startedAt;\n }\n return context.currentTime - startedAt;\n };\n\n return node;\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Reverb(context, config = {}) {\n const rate = context.sampleRate;\n\n let time = number(config.time, 1);\n let decay = number(config.decay, 5);\n let reverse = !!config.reverse;\n let length;\n let impulseResponse;\n\n const input = context.createGain();\n const reverb = context.createConvolver();\n const output = context.createGain();\n\n input.connect(reverb);\n input.connect(output);\n reverb.connect(output);\n\n const node = input;\n node.name = 'Reverb';\n node._output = output;\n\n node.update = function(opt) {\n if (typeof opt.time !== 'undefined') {\n time = opt.time;\n length = Math.floor(rate * time);\n impulseResponse = length ? context.createBuffer(2, length, rate) : null;\n }\n if (typeof opt.decay !== 'undefined') {\n decay = opt.decay;\n }\n if (typeof opt.reverse !== 'undefined') {\n reverse = opt.reverse;\n }\n\n if (!impulseResponse) {\n reverb.buffer = null;\n return;\n }\n\n const left = impulseResponse.getChannelData(0);\n const right = impulseResponse.getChannelData(1);\n let n, e;\n\n for (let i = 0; i < length; i++) {\n n = reverse ? length - i : i;\n e = Math.pow(1 - n / length, decay);\n left[i] = (Math.random() * 2 - 1) * e;\n right[i] = (Math.random() * 2 - 1) * e;\n }\n\n reverb.buffer = impulseResponse;\n };\n\n node.update({\n time: time,\n decay: decay,\n reverse: reverse\n });\n\n Object.defineProperties(node, {\n time: {\n get: function() {\n return time;\n },\n set: function(value) {\n if (value === time) {\n return;\n }\n this.update({\n time: value\n });\n }\n },\n decay: {\n get: function() {\n return decay;\n },\n set: function(value) {\n if (value === decay) {\n return;\n }\n this.update({\n decay: value\n });\n }\n },\n reverse: {\n get: function() {\n return reverse;\n },\n set: function(value) {\n if (value === reverse) {\n return;\n }\n this.update({\n reverse: !!value\n });\n }\n }\n });\n\n return node;\n}\n","import Analyser from './effect/analyser';\nimport Distortion from './effect/distortion';\nimport Echo from './effect/echo';\nimport FakeContext from './effect/fake-context';\nimport Filter from './effect/filter';\nimport Flanger from './effect/flanger';\nimport Panner from './effect/panner';\nimport Phaser from './effect/phaser';\nimport Recorder from './effect/recorder';\nimport Reverb from './effect/reverb';\n\nexport default function Effect(context) {\n context = context || new FakeContext();\n const panning = new Panner(context);\n\n let api = null,\n destination,\n nodeList = [],\n sourceNode;\n\n function connect(a, b) {\n //console.log('> connect', (a.name || a.constructor.name), 'to', (b.name || b.constructor.name));\n\n const output = a._output || a;\n //console.log('> disconnect output: ', (a.name || a.constructor.name));\n output.disconnect();\n //console.log('> connect output: ',(a.name || a.constructor.name), 'to input:', (b.name || b.constructor.name));\n output.connect(b);\n }\n\n function connectToDestination(node) {\n const l = nodeList.length;\n const lastNode = l ? nodeList[l - 1] : sourceNode;\n\n if (lastNode) {\n connect(lastNode, node);\n }\n\n destination = node;\n }\n\n function updateConnections() {\n if (!sourceNode) {\n return;\n }\n\n //console.log('updateConnections:', nodeList.length);\n\n let node,\n prev;\n\n for (let i = 0; i < nodeList.length; i++) {\n node = nodeList[i];\n //console.log(i, node);\n prev = i === 0 ? sourceNode : nodeList[i - 1];\n connect(prev, node);\n }\n\n if (destination) {\n connectToDestination(destination);\n }\n }\n\n function has(node) {\n if (!node) {\n return false;\n }\n return nodeList.indexOf(node) > -1;\n }\n\n function add(node) {\n if (!node) {\n return null;\n }\n if (has(node)) {\n return node;\n }\n nodeList.push(node);\n updateConnections();\n return node;\n }\n\n function remove(node) {\n if (!node) {\n return null;\n }\n if (!has(node)) {\n return node;\n }\n const l = nodeList.length;\n for (let i = 0; i < l; i++) {\n if (node === nodeList[i]) {\n nodeList.splice(i, 1);\n break;\n }\n }\n const output = node._output || node;\n output.disconnect();\n updateConnections();\n return node;\n }\n\n function toggle(node, force) {\n force = !!force;\n const hasNode = has(node);\n if (arguments.length > 1 && hasNode === force) {\n return api;\n }\n if (hasNode) {\n remove(node);\n } else {\n add(node);\n }\n return api;\n }\n\n function removeAll() {\n while (nodeList.length) {\n nodeList.pop()\n .disconnect();\n }\n updateConnections();\n return api;\n }\n\n function destroy() {\n removeAll();\n context = null;\n destination = null;\n nodeList = [];\n if (sourceNode) {\n sourceNode.disconnect();\n }\n sourceNode = null;\n }\n\n /*\n * Effects\n */\n\n function analyser(config) {\n return add(new Analyser(context, config));\n }\n\n // lowers the volume of the loudest parts of the signal and raises the volume of the softest parts\n function compressor(options) {\n const node = context.createDynamicsCompressor();\n\n node.update = function(config) {\n // min decibels to start compressing at from -100 to 0\n node.threshold.value = typeof config.threshold !== 'undefined' ? config.threshold : -24;\n // decibel value to start curve to compressed value from 0 to 40\n node.knee.value = typeof config.knee !== 'undefined' ? config.knee : 30;\n // amount of change per decibel from 1 to 20\n node.ratio.value = typeof config.ratio !== 'undefined' ? config.ratio : 12;\n // gain reduction currently applied by compressor from -20 to 0\n // node.reduction.value = typeof config.reduction !== 'undefined' ? config.reduction : -10;)\n // seconds to reduce gain by 10db from 0 to 1 - how quickly signal adapted when volume increased\n node.attack.value = typeof config.attack !== 'undefined' ? config.attack : 0.0003;\n // seconds to increase gain by 10db from 0 to 1 - how quickly signal adapted when volume redcuced\n node.release.value = typeof config.release !== 'undefined' ? config.release : 0.25;\n };\n\n node.update(options || {});\n\n return add(node);\n }\n\n function convolver(impulseResponse) {\n // impulseResponse is an audio file buffer\n const node = context.createConvolver();\n node.buffer = impulseResponse;\n return add(node);\n }\n\n function delay(time) {\n const node = context.createDelay();\n if (typeof time !== 'undefined') {\n node.delayTime.value = time;\n }\n return add(node);\n }\n\n function echo(config) {\n return add(new Echo(context, config));\n }\n\n function distortion(amount) {\n // Float32Array defining curve (values are interpolated)\n //node.curve\n // up-sample before applying curve for better resolution result 'none', '2x' or '4x'\n //node.oversample = '2x';\n return add(new Distortion(context, amount));\n }\n\n function filter(type, frequency, q, gain) {\n return add(new Filter(context, {type, frequency, q, gain}));\n }\n\n function lowpass(frequency, peak) {\n return filter('lowpass', {frequency, q: peak});\n }\n\n function highpass(frequency, peak) {\n return filter('highpass', {frequency, q: peak});\n }\n\n function bandpass(frequency, width) {\n return filter('bandpass', {frequency, q: width});\n }\n\n function lowshelf(frequency, gain) {\n return filter('lowshelf', {frequency, q: 0, gain});\n }\n\n function highshelf(frequency, gain) {\n return filter('highshelf', {frequency, q: 0, gain});\n }\n\n function peaking(frequency, width, gain) {\n return filter('peaking', {frequency, q: width, gain});\n }\n\n function notch(frequency, width, gain) {\n return filter('notch', {frequency, q: width, gain});\n }\n\n function allpass(frequency, sharpness) {\n return filter('allpass', {frequency, q: sharpness});\n }\n\n function flanger(config) {\n return add(new Flanger(context, config));\n }\n\n function gainNode(value) {\n const node = context.createGain();\n if (typeof value !== 'undefined') {\n node.gain.value = value;\n }\n return node;\n }\n\n function panner() {\n return add(new Panner(context));\n }\n\n function phaser(config) {\n return add(new Phaser(context, config));\n }\n\n function recorder(passThrough) {\n return add(new Recorder(context, passThrough));\n }\n\n function reverb(seconds, decay, reverse) {\n return add(new Reverb(context, seconds, decay, reverse));\n }\n\n function script(config = {}) {\n // bufferSize 256 - 16384 (pow 2)\n const bufferSize = config.bufferSize || 1024;\n const inputChannels = typeof config.inputChannels === 'undefined' ? 0 : config.inputChannels;\n const outputChannels = typeof config.outputChannels === 'undefined' ? 1 : config.outputChannels;\n\n const node = context.createScriptProcessor(bufferSize, inputChannels, outputChannels);\n\n const thisArg = config.thisArg || config.context || node;\n const callback = config.callback || function() {};\n\n // available props:\n /*\n event.inputBuffer\n event.outputBuffer\n event.playbackTime\n */\n // Example: generate noise\n /*\n const output = event.outputBuffer.getChannelData(0);\n const l = output.length;\n for (let i = 0; i < l; i++) {\n output[i] = Math.random();\n }\n */\n node.onaudioprocess = callback.bind(thisArg);\n\n return add(node);\n }\n\n function setSource(node) {\n sourceNode = node;\n updateConnections();\n return node;\n }\n\n function setDestination(node) {\n connectToDestination(node);\n return node;\n }\n\n //\n\n api = {\n context,\n nodeList,\n panning,\n\n has,\n add,\n remove,\n toggle,\n removeAll,\n destroy,\n setSource,\n setDestination,\n\n analyser,\n compressor,\n convolver,\n delay,\n echo,\n distortion,\n filter,\n lowpass,\n highpass,\n bandpass,\n lowshelf,\n highshelf,\n peaking,\n notch,\n allpass,\n flanger,\n gain: gainNode,\n panner,\n phaser,\n recorder,\n reverb,\n script\n };\n\n return Object.freeze(api);\n}\n","import Effect from './effect';\n\nexport default function Group(context, destination) {\n const sounds = [];\n const effect = new Effect(context);\n const gain = effect.gain();\n let preMuteVolume = 1;\n let group = null;\n\n if (context) {\n effect.setSource(gain);\n effect.setDestination(destination || context.destination);\n }\n\n /*\n * Add / remove\n */\n\n function find(soundOrId, callback) {\n let found;\n\n if (!soundOrId && soundOrId !== 0) {\n return found;\n }\n\n sounds.some(function(sound) {\n if (sound === soundOrId || sound.id === soundOrId) {\n found = sound;\n return true;\n }\n return false;\n });\n\n if (found && callback) {\n return callback(found);\n }\n\n return found;\n }\n\n function remove(soundOrId) {\n find(soundOrId, (sound) => sounds.splice(sounds.indexOf(sound), 1));\n return group;\n }\n\n function add(sound) {\n sound.gain.disconnect();\n sound.gain.connect(gain);\n\n sounds.push(sound);\n\n sound.once('destroy', remove);\n\n return group;\n }\n\n /*\n * Controls\n */\n\n function play(delay, offset) {\n sounds.forEach((sound) => sound.play(delay, offset));\n return group;\n }\n\n function pause() {\n sounds.forEach(function(sound) {\n if (sound.playing) {\n sound.pause();\n }\n });\n return group;\n }\n\n function resume() {\n sounds.forEach(function(sound) {\n if (sound.paused) {\n sound.play();\n }\n });\n return group;\n }\n\n function stop() {\n sounds.forEach((sound) => sound.stop());\n return group;\n }\n\n function seek(percent) {\n sounds.forEach((sound) => sound.seek(percent));\n return group;\n }\n\n function mute() {\n preMuteVolume = group.volume;\n group.volume = 0;\n return group;\n }\n\n function unMute() {\n group.volume = preMuteVolume || 1;\n return group;\n }\n\n function setVolume(value) {\n group.volume = value;\n return group;\n }\n\n function fade(volume, duration) {\n if (context) {\n const param = gain.gain;\n const time = context.currentTime;\n\n param.cancelScheduledValues(time);\n param.setValueAtTime(param.value, time);\n // param.setValueAtTime(volume, time + duration);\n param.linearRampToValueAtTime(volume, time + duration);\n // param.setTargetAtTime(volume, time, duration);\n // param.exponentialRampToValueAtTime(Math.max(volume, 0.0001), time + duration);\n } else {\n sounds.forEach(function(sound) {\n sound.fade(volume, duration);\n });\n }\n\n return group;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n while (sounds.length) {\n sounds.pop()\n .destroy();\n }\n }\n\n /*\n * Api\n */\n\n group = {\n add,\n find,\n remove,\n play,\n pause,\n resume,\n stop,\n seek,\n setVolume,\n mute,\n unMute,\n fade,\n destroy\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(group, {\n effect: {\n value: effect\n },\n gain: {\n value: gain\n },\n sounds: {\n value: sounds\n },\n volume: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n if (isNaN(value)) {\n return;\n }\n\n if (context) {\n gain.gain.cancelScheduledValues(context.currentTime);\n gain.gain.value = value;\n gain.gain.setValueAtTime(value, context.currentTime);\n } else {\n gain.gain.value = value;\n }\n sounds.forEach(function(sound) {\n if (!sound.context) {\n sound.groupVolume = value;\n }\n });\n }\n }\n });\n\n return group;\n}\n\nGroup.Effect = Effect;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","import events from 'events';\nconst {EventEmitter} = events;\n\nexport default class Emitter extends EventEmitter {\n constructor() {\n super();\n }\n\n off (type, listener) {\n if (listener) {\n return this.removeListener(type, listener);\n }\n if (type) {\n return this.removeAllListeners(type);\n }\n return this.removeAllListeners();\n }\n}\n","import Emitter from './emitter';\n\nexport default function Loader(url) {\n const ERROR_STATE = ['', 'ABORTED', 'NETWORK', 'DECODE', 'SRC_NOT_SUPPORTED'];\n const emitter = new Emitter();\n let progress = 0,\n audioContext,\n isTouchLocked,\n request,\n timeout,\n data;\n\n // clean up\n\n function removeListeners() {\n emitter.off('error');\n emitter.off('progress');\n emitter.off('complete');\n emitter.off('loaded');\n\n if (data && typeof data.removeEventListener === 'function') {\n data.removeEventListener('canplaythrough', readyHandler);\n data.removeEventListener('error', errorHandler);\n }\n\n if (request) {\n request.removeEventListener('progress', progressHandler);\n request.removeEventListener('load', loadHandler);\n request.removeEventListener('error', errorHandler);\n }\n }\n\n function dispatchComplete(buffer) {\n emitter.emit('progress', 1);\n emitter.emit('loaded', buffer);\n emitter.emit('complete', buffer);\n\n removeListeners();\n }\n\n function progressHandler(event) {\n if (event.lengthComputable) {\n progress = event.loaded / event.total;\n emitter.emit('progress', progress);\n }\n }\n\n // error\n\n function errorHandler(event) {\n window.clearTimeout(timeout);\n\n let message = event;\n\n if (data && data.error) {\n message = 'Media Error: ' + ERROR_STATE[data.error.code] + ' ' + url;\n }\n\n if (request) {\n message = 'XHR Error: ' + request.status + ' ' + request.statusText + ' ' + url;\n }\n\n emitter.emit('error', message);\n\n removeListeners();\n }\n\n function decodeArrayBuffer(arraybuffer) {\n audioContext.decodeAudioData(arraybuffer, (buffer) => {\n data = buffer;\n request = null;\n progress = 1;\n dispatchComplete(buffer);\n },\n errorHandler\n );\n }\n\n function loadHandler() {\n decodeArrayBuffer(request.response);\n }\n\n function readyHandler() {\n window.clearTimeout(timeout);\n if (!data) {\n return;\n }\n progress = 1;\n dispatchComplete(data);\n }\n\n function cancel() {\n removeListeners();\n\n if (request && request.readyState !== 4) {\n request.abort();\n }\n request = null;\n\n window.clearTimeout(timeout);\n }\n\n function destroy() {\n cancel();\n request = null;\n data = null;\n audioContext = null;\n }\n\n // audio buffer\n\n function loadArrayBuffer() {\n if (url instanceof window.ArrayBuffer) {\n decodeArrayBuffer(url);\n return;\n }\n request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'arraybuffer';\n request.addEventListener('progress', progressHandler);\n request.addEventListener('load', loadHandler);\n request.addEventListener('error', errorHandler);\n request.send();\n }\n\n // audio element\n\n function loadAudioElement() {\n if (!data || !data.tagName) {\n data = document.createElement('audio');\n }\n\n if (!isTouchLocked) {\n // timeout because sometimes canplaythrough doesn't fire\n window.clearTimeout(timeout);\n timeout = window.setTimeout(readyHandler, 2000);\n data.addEventListener('canplaythrough', readyHandler, false);\n }\n\n data.addEventListener('error', errorHandler, false);\n data.preload = 'auto';\n data.src = url;\n data.load();\n\n if (isTouchLocked) {\n dispatchComplete(data);\n }\n }\n\n function start() {\n if (audioContext) {\n loadArrayBuffer();\n } else {\n loadAudioElement();\n }\n }\n\n // reload\n\n function load(newUrl) {\n url = newUrl;\n start();\n }\n\n const api = {\n on: emitter.on.bind(emitter),\n once: emitter.once.bind(emitter),\n off: emitter.off.bind(emitter),\n load,\n start,\n cancel,\n destroy\n };\n\n Object.defineProperties(api, {\n data: {\n get: function() {\n return data;\n }\n },\n progress: {\n get: function() {\n return progress;\n }\n },\n audioContext: {\n set: function(value) {\n audioContext = value;\n }\n },\n isTouchLocked: {\n set: function(value) {\n isTouchLocked = value;\n }\n }\n });\n\n return Object.freeze(api);\n}\n\nLoader.Group = function() {\n const emitter = new Emitter();\n const queue = [];\n let numLoaded = 0,\n numTotal = 0,\n currentLoader;\n\n function progressHandler(progress) {\n const loaded = numLoaded + progress;\n emitter.emit('progress', loaded / numTotal);\n }\n\n function completeHandler() {\n numLoaded++;\n removeListeners();\n emitter.emit('progress', numLoaded / numTotal);\n next();\n }\n\n function errorHandler(e) {\n console.error.call(console, e);\n removeListeners();\n emitter.emit('error', e);\n next();\n }\n\n function next() {\n if (queue.length === 0) {\n currentLoader = null;\n emitter.emit('complete');\n return;\n }\n\n currentLoader = queue.pop();\n currentLoader.on('progress', progressHandler);\n currentLoader.once('loaded', completeHandler);\n currentLoader.once('error', errorHandler);\n currentLoader.start();\n }\n\n function removeListeners() {\n currentLoader.off('progress', progressHandler);\n currentLoader.off('loaded', completeHandler);\n currentLoader.off('error', errorHandler);\n }\n\n function add(loader) {\n queue.push(loader);\n numTotal++;\n return loader;\n }\n\n function start() {\n numTotal = queue.length;\n next();\n }\n\n return Object.freeze({\n on: emitter.on.bind(emitter),\n once: emitter.once.bind(emitter),\n off: emitter.off.bind(emitter),\n add,\n start\n });\n};\n","export default function BufferSource(buffer, context, onEnded) {\n const api = {};\n let ended = false,\n endedCallback = onEnded,\n loop = false,\n paused = false,\n pausedAt = 0,\n playbackRate = 1,\n playing = false,\n sourceNode = null,\n startedAt = 0;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createBufferSource();\n sourceNode.buffer = buffer;\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function stop() {\n if (sourceNode) {\n sourceNode.onended = null;\n try {\n sourceNode.disconnect();\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n function endedHandler() {\n stop();\n ended = true;\n if (typeof endedCallback === 'function') {\n endedCallback(api);\n }\n }\n\n function play(delay, offset = 0) {\n if (playing) {\n return;\n }\n\n delay = delay ? context.currentTime + delay : 0;\n if (offset) {\n pausedAt = 0;\n }\n if (pausedAt) {\n offset = pausedAt;\n }\n while (offset > api.duration) {\n offset = offset % api.duration;\n }\n\n createSourceNode();\n sourceNode.onended = endedHandler;\n sourceNode.start(delay, offset);\n\n sourceNode.loop = loop;\n sourceNode.playbackRate.value = playbackRate;\n\n startedAt = context.currentTime - offset;\n ended = false;\n paused = false;\n pausedAt = 0;\n playing = true;\n }\n\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n buffer = null;\n context = null;\n endedCallback = null;\n sourceNode = null;\n }\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n stop: {\n value: stop\n },\n destroy: {\n value: destroy\n },\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n let time = context.currentTime - startedAt;\n if (time > api.duration) {\n time = time % api.duration;\n }\n return time;\n }\n return 0;\n }\n },\n duration: {\n get: function() {\n return buffer ? buffer.duration : 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n if (sourceNode) {\n sourceNode.loop = loop;\n }\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (sourceNode) {\n sourceNode.playbackRate.value = playbackRate;\n }\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n get: function() {\n return api.duration ? api.currentTime / api.duration : 0;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function MediaSource(el, context, onEnded) {\n const api = {};\n let ended = false,\n endedCallback = onEnded,\n delayTimeout,\n fadeTimeout,\n loop = false,\n paused = false,\n playbackRate = 1,\n playing = false,\n sourceNode = null,\n groupVolume = 1,\n volume = 1;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createMediaElementSource(el);\n }\n return sourceNode;\n }\n\n /*\n * Load\n */\n\n function load(url) {\n el.src = url;\n el.load();\n ended = false;\n paused = false;\n playing = false;\n }\n\n /*\n * Controls\n */\n\n function readyHandler() {\n el.removeEventListener('canplaythrough', readyHandler);\n if (playing) {\n el.play();\n }\n }\n\n /*\n * Ended handler\n */\n\n function endedHandler() {\n\n if (loop) {\n el.currentTime = 0;\n // fixes bug where server doesn't support seek:\n if (el.currentTime > 0) {\n el.load();\n }\n el.play();\n\n return;\n }\n\n ended = true;\n paused = false;\n playing = false;\n\n if (typeof endedCallback === 'function') {\n endedCallback(api);\n }\n }\n\n function play(delay, offset) {\n clearTimeout(delayTimeout);\n\n el.volume = volume * groupVolume;\n el.playbackRate = playbackRate;\n\n if (offset) {\n el.currentTime = offset;\n }\n\n if (delay) {\n delayTimeout = setTimeout(play, delay);\n } else {\n // el.load();\n el.play();\n }\n\n ended = false;\n paused = false;\n playing = true;\n\n el.removeEventListener('ended', endedHandler);\n el.addEventListener('ended', endedHandler, false);\n\n console.debug('el.readyState', el.readyState);\n if (el.readyState < 1) {\n el.removeEventListener('canplaythrough', readyHandler);\n el.addEventListener('canplaythrough', readyHandler, false);\n el.load();\n el.play();\n }\n }\n\n function pause() {\n clearTimeout(delayTimeout);\n\n if (!el) {\n return;\n }\n\n el.pause();\n playing = false;\n paused = true;\n }\n\n function stop() {\n clearTimeout(delayTimeout);\n\n if (!el) {\n return;\n }\n\n el.pause();\n\n try {\n el.currentTime = 0;\n // fixes bug where server doesn't support seek:\n if (el.currentTime > 0) {\n el.load();\n }\n } catch (e) {}\n\n playing = false;\n paused = false;\n }\n\n /*\n * Fade for no webaudio\n */\n\n function fade(toVolume, duration) {\n if (context) {\n return api;\n }\n\n function ramp(value, step) {\n fadeTimeout = window.setTimeout(() => {\n api.volume = api.volume + (value - api.volume) * 0.2;\n if (Math.abs(api.volume - value) > 0.05) {\n ramp(value, step);\n return;\n }\n api.volume = value;\n }, step * 1000);\n }\n\n window.clearTimeout(fadeTimeout);\n ramp(toVolume, duration / 10);\n\n return api;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n el.removeEventListener('ended', endedHandler);\n el.removeEventListener('canplaythrough', readyHandler);\n stop();\n el = null;\n context = null;\n endedCallback = null;\n sourceNode = null;\n }\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n stop: {\n value: stop\n },\n load: {\n value: load\n },\n fade: {\n value: fade\n },\n destroy: {\n value: destroy\n },\n currentTime: {\n get: function() {\n return el ? el.currentTime : 0;\n }\n },\n duration: {\n get: function() {\n return el ? el.duration : 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (el) {\n el.playbackRate = playbackRate;\n }\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n get: function() {\n return el && el.duration ? el.currentTime / el.duration : 0;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n },\n volume: {\n get: function() {\n return volume;\n },\n set: function(value) {\n window.clearTimeout(fadeTimeout);\n volume = value;\n if (el) {\n el.volume = volume * groupVolume;\n }\n }\n },\n groupVolume: {\n get: function() {\n return groupVolume;\n },\n set: function(value) {\n groupVolume = value;\n if (el) {\n el.volume = volume * groupVolume;\n }\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function MicrophoneSource(stream, context) {\n let ended = false,\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // MicrophoneSourceNode\n startedAt = 0;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createMediaStreamSource(stream);\n // HACK: stops moz garbage collection killing the stream\n // see https://support.mozilla.org/en-US/questions/984179\n if (navigator.mozGetUserMedia) {\n window.mozHack = sourceNode;\n }\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play(delay) {\n delay = delay ? context.currentTime + delay : 0;\n\n createSourceNode();\n sourceNode.start(delay);\n\n startedAt = context.currentTime - pausedAt;\n ended = false;\n playing = true;\n paused = false;\n pausedAt = 0;\n }\n\n function stop() {\n if (sourceNode) {\n try {\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n sourceNode = null;\n stream = null;\n window.mozHack = null;\n }\n\n /*\n * Api\n */\n\n const api = {\n play,\n pause,\n stop,\n destroy,\n\n duration: 0,\n progress: 0\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function OscillatorSource(type, context) {\n let ended = false,\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // OscillatorSourceNode\n startedAt = 0,\n frequency = 200,\n api = null;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createOscillator();\n sourceNode.type = type;\n sourceNode.frequency.value = frequency;\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play(delay) {\n delay = delay || 0;\n if (delay) {\n delay = context.currentTime + delay;\n }\n\n createSourceNode();\n sourceNode.start(delay);\n\n if (pausedAt) {\n startedAt = context.currentTime - pausedAt;\n } else {\n startedAt = context.currentTime;\n }\n\n ended = false;\n playing = true;\n paused = false;\n pausedAt = 0;\n }\n\n function stop() {\n if (sourceNode) {\n try {\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n sourceNode = null;\n }\n\n /*\n * Api\n */\n\n api = {\n play: play,\n pause: pause,\n stop: stop,\n destroy: destroy\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n duration: {\n value: 0\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n frequency: {\n get: function() {\n return frequency;\n },\n set: function(value) {\n frequency = value;\n if (sourceNode) {\n sourceNode.frequency.value = value;\n }\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n value: 0\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function ScriptSource(data, context) {\n const bufferSize = data.bufferSize || 1024;\n const channels = data.channels || 1;\n let ended = false,\n onProcess = data.callback.bind(data.thisArg || this),\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // ScriptSourceNode\n startedAt = 0,\n api = null;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createScriptProcessor(bufferSize, 0, channels);\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play() {\n createSourceNode();\n sourceNode.onaudioprocess = onProcess;\n\n startedAt = context.currentTime - pausedAt;\n ended = false;\n paused = false;\n pausedAt = 0;\n playing = true;\n }\n\n function onPaused(event) {\n const buffer = event.outputBuffer;\n for (let i = 0; i < buffer.numberOfChannels; i++) {\n const channel = buffer.getChannelData(i);\n for (let j = 0; j < channel.length; j++) {\n channel[j] = 0;\n }\n }\n }\n\n function stop() {\n if (sourceNode) {\n sourceNode.onaudioprocess = onPaused;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n onProcess = null;\n sourceNode = null;\n }\n\n /*\n * Api\n */\n\n api = {\n play,\n pause,\n stop,\n destroy,\n\n duration: 0,\n progress: 0\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function waveform() {\n let buffer,\n wave;\n\n return function(audioBuffer, length) {\n if (!window.Float32Array || !window.AudioBuffer) {\n return [];\n }\n\n const sameBuffer = buffer === audioBuffer;\n const sameLength = wave && wave.length === length;\n if (sameBuffer && sameLength) {\n return wave;\n }\n\n //console.time('waveData');\n if (!wave || wave.length !== length) {\n wave = new Float32Array(length);\n }\n\n if (!audioBuffer) {\n return wave;\n }\n\n // cache for repeated calls\n buffer = audioBuffer;\n\n const chunk = Math.floor(buffer.length / length),\n resolution = 5, // 10\n incr = Math.max(Math.floor(chunk / resolution), 1);\n let greatest = 0;\n\n for (let i = 0; i < buffer.numberOfChannels; i++) {\n // check each channel\n const channel = buffer.getChannelData(i);\n for (let j = 0; j < length; j++) {\n // get highest value within the chunk\n for (let k = j * chunk, l = k + chunk; k < l; k += incr) {\n // select highest value from channels\n let a = channel[k];\n if (a < 0) {\n a = -a;\n }\n if (a > wave[j]) {\n wave[j] = a;\n }\n // update highest overall for scaling\n if (a > greatest) {\n greatest = a;\n }\n }\n }\n }\n // scale up\n const scale = 1 / greatest;\n for (let i = 0; i < wave.length; i++) {\n wave[i] *= scale;\n }\n //console.timeEnd('waveData');\n\n return wave;\n };\n}\n","import BufferSource from './source/buffer-source';\nimport Effect from './effect';\nimport Emitter from './utils/emitter';\nimport file from './utils/file';\nimport Loader from './utils/loader';\nimport MediaSource from './source/media-source';\nimport MicrophoneSource from './source/microphone-source';\nimport OscillatorSource from './source/oscillator-source';\nimport ScriptSource from './source/script-source';\nimport waveform from './utils/waveform.js';\n\nexport default function Sound(context, destination) {\n let id,\n data,\n effect = new Effect(context),\n gain = effect.gain(),\n wave = waveform(),\n isTouchLocked = false,\n loader,\n loop = false,\n playbackRate = 1,\n playWhenReady,\n source;\n\n let sound = null;\n\n if (context) {\n effect.setDestination(gain);\n gain.connect(destination || context.destination);\n }\n\n /*\n * Create source\n */\n\n function createSource(value) {\n data = value;\n\n if (file.isAudioBuffer(data)) {\n source = new BufferSource(data, context, () => sound.emit('ended', sound));\n } else if (file.isMediaElement(data)) {\n source = new MediaSource(data, context, () => sound.emit('ended', sound));\n } else if (file.isMediaStream(data)) {\n source = new MicrophoneSource(data, context);\n } else if (file.isOscillatorType((data && data.type) || data)) {\n source = new OscillatorSource(data.type || data, context);\n } else if (file.isScriptConfig(data)) {\n source = new ScriptSource(data, context);\n } else {\n throw new Error('Cannot detect data type: ' + data);\n }\n\n effect.setSource(source.sourceNode);\n\n sound.emit('ready', sound);\n\n if (playWhenReady) {\n playWhenReady();\n }\n }\n\n /*\n * Load\n */\n\n function load(config) {\n const src = file.getSupportedFile(config.src || config.url || config.data || config);\n\n if (source && data && data.tagName) {\n source.load(src);\n } else {\n loader = loader || new Loader(src);\n loader.audioContext = !!config.asMediaElement ? null : context;\n loader.isTouchLocked = isTouchLocked;\n loader.once('loaded', function(fileData) {\n createSource(fileData);\n sound.emit('loaded', sound);\n });\n }\n return sound;\n }\n\n /*\n * Controls\n */\n\n function play(delay, offset) {\n if (!source || isTouchLocked) {\n playWhenReady = function() {\n if (source) {\n play(delay, offset);\n }\n };\n return sound;\n }\n playWhenReady = null;\n effect.setSource(source.sourceNode);\n\n // update volume needed for no webaudio\n if (!context) {\n sound.volume = gain.gain.value;\n }\n\n source.play(delay, offset);\n\n if (source.hasOwnProperty('loop')) {\n source.loop = loop;\n }\n\n sound.emit('play', sound);\n\n return sound;\n }\n\n function pause() {\n source && source.pause();\n sound.emit('pause', sound);\n return sound;\n }\n\n function stop(delay) {\n source && source.stop(delay || 0);\n sound.emit('stop', sound);\n return sound;\n }\n\n function seek(percent) {\n if (source) {\n source.stop();\n play(0, source.duration * percent);\n }\n return sound;\n }\n\n function fade(volume, duration) {\n if (!source) {\n return sound;\n }\n\n const param = gain.gain;\n\n if (context) {\n const time = context.currentTime;\n param.cancelScheduledValues(time);\n param.setValueAtTime(param.value, time);\n param.linearRampToValueAtTime(volume, time + duration);\n } else if (typeof source.fade === 'function') {\n source.fade(volume, duration);\n param.value = volume;\n }\n\n return sound;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n source && source.destroy();\n effect && effect.destroy();\n gain && gain.disconnect();\n loader && loader.destroy();\n sound.off('loaded');\n sound.off('ended');\n gain = null;\n context = null;\n data = null;\n playWhenReady = null;\n source = null;\n effect = null;\n loader = null;\n wave = null;\n sound.emit('destroy', sound);\n sound.off('destroy');\n }\n\n sound = Object.create(Emitter.prototype, {\n _events: {\n value: {}\n },\n constructor: {\n value: Sound\n },\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n load: {\n value: load\n },\n seek: {\n value: seek\n },\n stop: {\n value: stop\n },\n fade: {\n value: fade\n },\n destroy: {\n value: destroy\n },\n context: {\n value: context\n },\n currentTime: {\n get: function() {\n return source ? source.currentTime : 0;\n },\n set: function(value) {\n // const silent = sound.playing;\n source && source.stop();\n // play(0, value, silent);\n play(0, value);\n }\n },\n data: {\n get: function() {\n return data;\n },\n set: function(value) {\n if (!value) {\n return;\n }\n createSource(value);\n }\n },\n duration: {\n get: function() {\n return source ? source.duration : 0;\n }\n },\n effect: {\n value: effect\n },\n ended: {\n get: function() {\n return !!source && source.ended;\n }\n },\n frequency: {\n get: function() {\n return source ? source.frequency : 0;\n },\n set: function(value) {\n if (source && source.hasOwnProperty('frequency')) {\n source.frequency = value;\n }\n }\n },\n gain: {\n value: gain\n },\n id: {\n get: function() {\n return id;\n },\n set: function(value) {\n id = value;\n }\n },\n isTouchLocked: {\n set: function(value) {\n isTouchLocked = value;\n if (loader) {\n loader.isTouchLocked = value;\n }\n if (!value && playWhenReady) {\n playWhenReady();\n }\n }\n },\n loader: {\n get: function() {\n return loader;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n\n if (source && source.hasOwnProperty('loop') && source.loop !== loop) {\n source.loop = loop;\n }\n }\n },\n paused: {\n get: function() {\n return !!source && source.paused;\n }\n },\n playing: {\n get: function() {\n return !!source && source.playing;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (source) {\n source.playbackRate = playbackRate;\n }\n }\n },\n progress: {\n get: function() {\n return source ? source.progress : 0;\n }\n },\n sourceNode: {\n get: function() {\n return source ? source.sourceNode : null;\n }\n },\n volume: {\n get: function() {\n if (context) {\n return gain.gain.value;\n }\n if (source && source.hasOwnProperty('volume')) {\n return source.volume;\n }\n return 1;\n },\n set: function(value) {\n if (isNaN(value)) {\n return;\n }\n\n const param = gain.gain;\n\n if (context) {\n const time = context.currentTime;\n param.cancelScheduledValues(time);\n param.value = value;\n param.setValueAtTime(value, time);\n } else {\n param.value = value;\n\n if (source && source.hasOwnProperty('volume')) {\n source.volume = value;\n }\n }\n }\n },\n // for media element source\n groupVolume: {\n get: function() {\n return source.groupVolume;\n },\n set: function(value) {\n if (source && source.hasOwnProperty('groupVolume')) {\n source.groupVolume = value;\n }\n }\n },\n waveform: {\n value: function(length) {\n if (!data) {\n sound.once('ready', () => wave(data, length));\n }\n return wave(data, length);\n }\n },\n userData: {\n value: {}\n }\n });\n\n return Object.freeze(sound);\n}\n\n// expose for unit tests\nSound.__source = {\n BufferSource,\n MediaSource,\n MicrophoneSource,\n OscillatorSource,\n ScriptSource\n};\n","import Group from '../group';\n\nexport default function SoundGroup(context, destination) {\n const group = new Group(context, destination);\n const sounds = group.sounds;\n let playbackRate = 1,\n loop = false,\n src;\n\n function getSource() {\n if (!sounds.length) {\n return;\n }\n\n src = sounds.slice(0)\n .sort((a, b) => b.duration - a.duration)[0];\n }\n\n const add = group.add;\n group.add = function(sound) {\n add(sound);\n getSource();\n return group;\n };\n\n const remove = group.rmeove;\n group.remove = function(soundOrId) {\n remove(soundOrId);\n getSource();\n return group;\n };\n\n Object.defineProperties(group, {\n currentTime: {\n get: function() {\n return src ? src.currentTime : 0;\n },\n set: function(value) {\n this.stop();\n this.play(0, value);\n }\n },\n duration: {\n get: function() {\n return src ? src.duration : 0;\n }\n },\n // ended: {\n // get: function() {\n // return src ? src.ended : false;\n // }\n // },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n sounds.forEach(function(sound) {\n sound.loop = loop;\n });\n }\n },\n paused: {\n get: function() {\n // return src ? src.paused : false;\n return !!src && src.paused;\n }\n },\n progress: {\n get: function() {\n return src ? src.progress : 0;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n sounds.forEach(function(sound) {\n sound.playbackRate = playbackRate;\n });\n }\n },\n playing: {\n get: function() {\n // return src ? src.playing : false;\n return !!src && src.playing;\n }\n }\n });\n\n return group;\n}\n","export default function Microphone(connected, denied, error) {\n navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n error = error || function() {};\n\n const isSupported = !!navigator.getUserMedia;\n const api = {};\n let stream = null;\n\n function connect() {\n if (!isSupported) {\n return api;\n }\n\n navigator.getUserMedia({\n audio: true\n }, function(micStream) {\n stream = micStream;\n connected(stream);\n }, function(e) {\n if (denied && e.name === 'PermissionDeniedError' || e === 'PERMISSION_DENIED') {\n // console.log('Permission denied. Reset by clicking the camera icon with the red cross.');\n denied();\n } else {\n error(e.message || e);\n }\n });\n return api;\n }\n\n function disconnect() {\n if (stream) {\n stream.stop();\n stream = null;\n }\n return api;\n }\n\n Object.defineProperties(api, {\n connect: {\n value: connect\n },\n disconnect: {\n value: disconnect\n },\n isSupported: {\n value: isSupported\n },\n stream: {\n get: function() {\n return stream;\n }\n }\n });\n\n return Object.freeze(api);\n}\n","const halfPI = Math.PI / 2;\nconst twoPI = Math.PI * 2;\n\nexport default function waveformer(config) {\n\n const style = config.style || 'fill', // 'fill' or 'line'\n shape = config.shape || 'linear', // 'circular' or 'linear'\n color = config.color || 0,\n bgColor = config.bgColor,\n lineWidth = config.lineWidth || 1,\n percent = config.percent || 1,\n originX = config.x || 0,\n originY = config.y || 0,\n transform = config.transform;\n\n let canvas = config.canvas,\n width = config.width || (canvas && canvas.width),\n height = config.height || (canvas && canvas.height);\n\n let ctx = null, currentColor, i, x, y,\n radius, innerRadius, centerX, centerY;\n\n if (!canvas && !config.context) {\n canvas = document.createElement('canvas');\n width = width || canvas.width;\n height = height || canvas.height;\n canvas.width = height;\n canvas.height = height;\n }\n\n if (shape === 'circular') {\n radius = config.radius || Math.min(height / 2, width / 2);\n innerRadius = config.innerRadius || radius / 2;\n centerX = originX + width / 2;\n centerY = originY + height / 2;\n }\n\n ctx = config.context || canvas.getContext('2d');\n\n function clear() {\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fillRect(originX, originY, width, height);\n } else {\n ctx.clearRect(originX, originY, width, height);\n }\n\n ctx.lineWidth = lineWidth;\n\n currentColor = null;\n\n if (typeof color !== 'function') {\n ctx.strokeStyle = color;\n ctx.beginPath();\n }\n }\n\n function updateColor(position, length, value) {\n if (typeof color === 'function') {\n const newColor = color(position, length, value);\n if (newColor !== currentColor) {\n currentColor = newColor;\n ctx.stroke();\n ctx.strokeStyle = currentColor;\n ctx.beginPath();\n }\n }\n }\n\n function getValue(value, position, length) {\n if (typeof transform === 'function') {\n return transform(value, position, length);\n }\n return value;\n }\n\n function getWaveform(value, length) {\n if (value && typeof value.waveform === 'function') {\n return value.waveform(length);\n }\n if (value) {\n return value;\n }\n if (config.waveform) {\n return config.waveform;\n }\n if (config.sound) {\n return config.sound.waveform(length);\n }\n return null;\n }\n\n function update(wave) {\n\n clear();\n\n if (shape === 'circular') {\n const waveform = getWaveform(wave, 360);\n const length = Math.floor(waveform.length * percent);\n\n const step = twoPI / length;\n let angle, magnitude, sine, cosine;\n\n for (i = 0; i < length; i++) {\n const value = getValue(waveform[i], i, length);\n updateColor(i, length, value);\n\n angle = i * step - halfPI;\n cosine = Math.cos(angle);\n sine = Math.sin(angle);\n\n if (style === 'fill') {\n x = centerX + innerRadius * cosine;\n y = centerY + innerRadius * sine;\n ctx.moveTo(x, y);\n }\n\n magnitude = innerRadius + (radius - innerRadius) * value;\n x = centerX + magnitude * cosine;\n y = centerY + magnitude * sine;\n\n if (style === 'line' && i === 0) {\n ctx.moveTo(x, y);\n }\n\n ctx.lineTo(x, y);\n }\n\n if (style === 'line') {\n ctx.closePath();\n }\n } else {\n\n const waveform = getWaveform(wave, width);\n let length = Math.min(waveform.length, width - lineWidth / 2);\n length = Math.floor(length * percent);\n\n for (i = 0; i < length; i++) {\n const value = getValue(waveform[i], i, length);\n updateColor(i, length, value);\n\n if (style === 'line' && i > 0) {\n ctx.lineTo(x, y);\n }\n\n x = originX + i;\n y = originY + height - Math.round(height * value);\n y = Math.floor(Math.min(y, originY + height - lineWidth / 2));\n\n if (style === 'fill') {\n ctx.moveTo(x, y);\n ctx.lineTo(x, originY + height);\n } else {\n ctx.lineTo(x, y);\n }\n }\n }\n ctx.stroke();\n }\n\n update.canvas = canvas;\n\n if (config.waveform || config.sound) {\n update();\n }\n\n return update;\n}\n","import Microphone from './microphone';\nimport waveformer from './waveformer';\n\n/*\n * audio ctx\n */\nlet ctx;\nlet offlineCtx;\n\nfunction getContext() {\n if (ctx) {\n return ctx;\n }\n\n const Ctx = window.AudioContext || window.webkitAudioContext;\n\n ctx = (Ctx ? new Ctx() : null);\n\n // Handles bug in Safari 9 OSX where AudioContext instance starts in 'suspended' state\n\n const isSuspended = ctx && ctx.state === 'suspended';\n\n if (isSuspended && typeof ctx.resume === 'function') {\n window.setTimeout(function() {\n ctx.resume();\n }, 1000);\n }\n\n return ctx;\n}\n\n/*\nIn contrast with a standard AudioContext, an OfflineAudioContext doesn't render\nthe audio to the device hardware;\ninstead, it generates it, as fast as it can, and outputs the result to an AudioBuffer.\n*/\nfunction getOfflineContext(numOfChannels, length, sampleRate) {\n if (offlineCtx) {\n return offlineCtx;\n }\n numOfChannels = numOfChannels || 2;\n sampleRate = sampleRate || 44100;\n length = sampleRate || numOfChannels;\n\n const OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\n offlineCtx = (OfflineCtx ? new OfflineCtx(numOfChannels, length, sampleRate) : null);\n\n return offlineCtx;\n}\n\n\n/*\n * clone audio buffer\n */\n\nfunction cloneBuffer(buffer) {\n if (!ctx) {\n return buffer;\n }\n\n const numChannels = buffer.numberOfChannels,\n cloned = ctx.createBuffer(numChannels, buffer.length, buffer.sampleRate);\n for (let i = 0; i < numChannels; i++) {\n cloned.getChannelData(i)\n .set(buffer.getChannelData(i));\n }\n return cloned;\n}\n\n/*\n * reverse audio buffer\n */\n\nfunction reverseBuffer(buffer) {\n const numChannels = buffer.numberOfChannels;\n for (let i = 0; i < numChannels; i++) {\n Array.prototype.reverse.call(buffer.getChannelData(i));\n }\n return buffer;\n}\n\n/*\n * ramp audio param\n */\n\nfunction ramp(param, fromValue, toValue, duration, linear) {\n if (!ctx) {\n return;\n }\n\n param.setValueAtTime(fromValue, ctx.currentTime);\n\n if (linear) {\n param.linearRampToValueAtTime(toValue, ctx.currentTime + duration);\n } else {\n param.exponentialRampToValueAtTime(toValue, ctx.currentTime + duration);\n }\n}\n\n/*\n * get frequency from min to max by passing 0 to 1\n */\n\nfunction getFrequency(value) {\n if (!ctx) {\n return 0;\n }\n // get frequency by passing number from 0 to 1\n // Clamp the frequency between the minimum value (40 Hz) and half of the\n // sampling rate.\n const minValue = 40;\n const maxValue = ctx.sampleRate / 2;\n // Logarithm (base 2) to compute how many octaves fall in the range.\n const numberOfOctaves = Math.log(maxValue / minValue) / Math.LN2;\n // Compute a multiplier from 0 to 1 based on an exponential scale.\n const multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n // Get back to the frequency value between min and max.\n return maxValue * multiplier;\n}\n\n/*\n * microphone util\n */\n\nfunction microphone(connected, denied, error) {\n return new Microphone(connected, denied, error);\n}\n\n/*\n * Format seconds as timecode string\n */\n\nfunction timeCode(seconds, delim = ':') {\n // const h = Math.floor(seconds / 3600);\n // const m = Math.floor((seconds % 3600) / 60);\n const m = Math.floor(seconds / 60);\n const s = Math.floor((seconds % 3600) % 60);\n // const hr = (h < 10 ? '0' + h + delim : h + delim);\n const mn = (m < 10 ? '0' + m : m) + delim;\n const sc = (s < 10 ? '0' + s : s);\n // return hr + mn + sc;\n return mn + sc;\n}\n\nexport default Object.freeze({\n getContext,\n getOfflineContext,\n cloneBuffer,\n reverseBuffer,\n ramp,\n getFrequency,\n microphone,\n timeCode,\n waveformer\n});\n","import browser from './lib/utils/browser';\nimport file from './lib/utils/file';\nimport Group from './lib/group';\nimport Loader from './lib/utils/loader';\nimport Sound from './lib/sound';\nimport SoundGroup from './lib/utils/sound-group';\nimport utils from './lib/utils/utils';\n\nfunction Sono() {\n const VERSION = '0.1.8';\n const context = utils.getContext();\n const destination = (context ? context.destination : null);\n const group = new Group(context, destination);\n\n let api = null;\n let isTouchLocked = false;\n\n /*\n * Get Sound by id\n */\n\n function getSound(id) {\n return group.find(id);\n }\n\n /*\n * Create group\n */\n\n function createGroup(sounds) {\n const soundGroup = new SoundGroup(context, group.gain);\n if (sounds) {\n sounds.forEach((sound) => soundGroup.add(sound));\n }\n return soundGroup;\n }\n\n /*\n * Loading\n */\n\n function add(config) {\n const soundContext = config && config.webAudio === false ? null : context;\n const sound = new Sound(soundContext, group.gain);\n sound.isTouchLocked = isTouchLocked;\n if (config) {\n sound.id = config.id || config.name || '';\n sound.loop = !!config.loop;\n sound.volume = config.volume;\n }\n group.add(sound);\n return sound;\n }\n\n function queue(config, loaderGroup) {\n const sound = add(config)\n .load(config);\n\n if (loaderGroup) {\n loaderGroup.add(sound.loader);\n }\n return sound;\n }\n\n function load(config) {\n const src = config.src || config.url || config.data || config;\n let sound, loader;\n\n if (file.containsURL(src)) {\n sound = queue(config);\n loader = sound.loader;\n } else if (Array.isArray(src) && file.containsURL(src[0].src || src[0].url)) {\n sound = [];\n loader = new Loader.Group();\n src.forEach((url) => sound.push(queue(url, loader)));\n } else {\n const errorMessage = 'sono.load: No audio file URLs found in config.';\n if (config.onError) {\n config.onError('[ERROR] ' + errorMessage);\n } else {\n throw new Error(errorMessage);\n }\n return null;\n }\n if (config.onProgress) {\n loader.on('progress', (progress) => config.onProgress(progress));\n }\n if (config.onComplete) {\n loader.once('complete', function() {\n loader.off('progress');\n config.onComplete(sound);\n });\n }\n loader.once('error', function(err) {\n loader.off('error');\n if (config.onError) {\n config.onError(err);\n } else {\n console.error.call(console, '[ERROR] sono.load: ' + err);\n }\n });\n loader.start();\n\n return sound;\n }\n\n /*\n * Create Sound\n *\n * Accepted values for param config:\n * Object config e.g. { id:'foo', url:['foo.ogg', 'foo.mp3'] }\n * Array (of files e.g. ['foo.ogg', 'foo.mp3'])\n * ArrayBuffer\n * HTMLMediaElement\n * Filename string (e.g. 'foo.ogg')\n * Oscillator type string (i.e. 'sine', 'square', 'sawtooth', 'triangle')\n * ScriptProcessor config object (e.g. { bufferSize: 1024, channels: 1, callback: fn })\n */\n\n function createSound(config) {\n // try to load if config contains URLs\n if (file.containsURL(config)) {\n return load(config);\n }\n\n const sound = add(config);\n sound.data = config.data || config;\n\n return sound;\n }\n\n /*\n * Destroy\n */\n\n function destroySound(soundOrId) {\n group.find(soundOrId, (sound) => sound.destroy());\n return api;\n }\n\n function destroyAll() {\n group.destroy();\n return api;\n }\n\n /*\n * Controls\n */\n\n function mute() {\n group.mute();\n return api;\n }\n\n function unMute() {\n group.unMute();\n return api;\n }\n\n function fade(volume, duration) {\n group.fade(volume, duration);\n return api;\n }\n\n function pauseAll() {\n group.pause();\n return api;\n }\n\n function resumeAll() {\n group.resume();\n return api;\n }\n\n function stopAll() {\n group.stop();\n return api;\n }\n\n function play(id, delay, offset) {\n group.find(id, (sound) => sound.play(delay, offset));\n return api;\n }\n\n function pause(id) {\n group.find(id, (sound) => sound.pause());\n return api;\n }\n\n function stop(id) {\n group.find(id, (sound) => sound.stop());\n return api;\n }\n\n /*\n * Mobile touch lock\n */\n\n isTouchLocked = browser.handleTouchLock(context, function() {\n isTouchLocked = false;\n group.sounds.forEach((sound) => (sound.isTouchLocked = false));\n });\n\n /*\n * Page visibility events\n */\n\n (function() {\n const pageHiddenPaused = [];\n\n // pause currently playing sounds and store refs\n function onHidden() {\n group.sounds.forEach(function(sound) {\n if (sound.playing) {\n sound.pause();\n pageHiddenPaused.push(sound);\n }\n });\n }\n\n // play sounds that got paused when page was hidden\n function onShown() {\n while (pageHiddenPaused.length) {\n pageHiddenPaused.pop()\n .play();\n }\n }\n\n browser.handlePageVisibility(onHidden, onShown);\n }());\n\n /*\n * Log version & device support info\n */\n\n function log() {\n const title = 'sono ' + VERSION,\n info = 'Supported:' + api.isSupported +\n ' WebAudioAPI:' + api.hasWebAudio +\n ' TouchLocked:' + isTouchLocked +\n ' State:' + (context && context.state) +\n ' Extensions:' + file.extensions;\n\n if (navigator.userAgent.indexOf('Chrome') > -1) {\n const args = [\n '%c ♫ ' + title +\n ' ♫ %c ' + info + ' ',\n 'color: #FFFFFF; background: #379F7A',\n 'color: #1F1C0D; background: #E0FBAC'\n ];\n console.log.apply(console, args);\n } else if (window.console && window.console.log.call) {\n console.log.call(console, title + ' ' + info);\n }\n }\n\n api = {\n createSound,\n destroySound,\n destroyAll,\n getSound,\n createGroup,\n file,\n load,\n mute,\n unMute,\n fade,\n pauseAll,\n resumeAll,\n stopAll,\n play,\n pause,\n stop,\n log,\n\n canPlay: file.canPlay,\n context,\n getOfflineContext: utils.getOfflineContext,\n effect: group.effect,\n extensions: file.extensions,\n hasWebAudio: !!context,\n isSupported: file.extensions.length > 0,\n gain: group.gain,\n utils,\n VERSION,\n\n Sound,\n Group\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n isTouchLocked: {\n get: function() {\n return isTouchLocked;\n }\n },\n sounds: {\n get: function() {\n return group.sounds.slice(0);\n }\n },\n volume: {\n get: function() {\n return group.volume;\n },\n set: function(value) {\n group.volume = value;\n }\n }\n });\n\n return Object.freeze(api);\n}\n\nexport default new Sono();\n"],"names":["browser","handlePageVisibility","onHidden","onShown","hidden","visibilityChange","document","mozHidden","msHidden","webkitHidden","onChange","addEventListener","handleTouchLock","context","onUnlock","ua","navigator","userAgent","locked","match","unlock","state","resume","then","buffer","createBuffer","source","createBufferSource","connect","destination","start","stop","disconnect","body","removeEventListener","extensions","canPlay","tests","el","createElement","forEach","test","canPlayType","type","indexOf","ext","push","getFileExtension","url","slice","length","toLowerCase","split","lastIndexOf","a","pop","getSupportedFile","fileNames","name","Array","isArray","i","keys","some","key","isAudioBuffer","data","window","AudioBuffer","isArrayBuffer","ArrayBuffer","isMediaElement","HTMLMediaElement","isMediaStream","getAudioTracks","MediaStreamTrack","isOscillatorType","isScriptConfig","bufferSize","channels","callback","isURL","containsURL","config","src","Analyser","node","createAnalyser","fftSize","freqFloat","float","waveFloat","waveform","frequencies","smoothingTimeConstant","smoothing","minDecibels","maxDecibels","amplitudeBlob","Blob","pitchBlob","amplitudeBlobURL","URL","createObjectURL","amplitudeWorker","Worker","pitchBlobURL","pitchWorker","amplitudeCallback","noteStrings","pitchCallback","pitchCallbackObject","noteFromPitch","frequency","noteNum","Math","log","round","frequencyFromNoteNumber","note","pow","centsOffFromPitch","floor","onmessage","e","Hz","detune","hertz","noteIndex","detuneCents","needsUpdate","arr","Uint8Array","Float32Array","createArray","getWaveform","arguments","getFloatTimeDomainData","getByteTimeDomainData","getPitch","f","set","postMessage","sampleRate","getFrequencies","frequencyBinCount","getFloatFrequencyData","getByteFrequencyData","getAmplitude","byteLength","update","defineProperties","value","number","defaultValue","isNaN","n","Distortion","amount","createWaveShaper","curve","k","deg","PI","x","abs","Echo","input","createGain","delay","createDelay","gain","output","delayTime","feedback","_output","FakeContext","startTime","Date","now","fn","param","fakeNode","currentTime","Filter","minFrequency","maxFrequency","createBiquadFilter","getFrequency","numberOfOctaves","LN2","multiplier","q","Q","setByPercent","percent","MonoFlanger","lfo","createOscillator","StereoFlanger","splitter","createChannelSplitter","merger","createChannelMerger","feedbackL","feedbackR","lfoGainL","lfoGainR","delayL","delayR","Flanger","stereo","Panner","createPanner","panningModel","defaults","distanceModel","refDistance","maxDistance","rolloffFactor","coneInnerAngle","coneOuterAngle","coneOuterGain","setPosition","setOrientation","vecPool","y","z","v","pool","instance","globalUp","get","angle45","angle90","cross","b","ax","ay","az","bx","by","bz","normalize","vec3","sqrt","invScalar","pannerNode","fw","up","dispose","nodeOrListener","vec","sin","setSourcePosition","setSourceOrientation","setListenerPosition","listener","setListenerOrientation","getDefaults","setDefaults","Phaser","stages","filters","filter","lfoGain","first","last","Recorder","passThrough","bufferLength","buffersL","buffersR","startedAt","stoppedAt","script","isRecording","mergeBuffers","buffers","offset","getBuffer","recordingLength","getChannelData","destroyScriptProcessor","onaudioprocess","createScriptProcessor","event","inputL","inputBuffer","inputR","outputL","outputBuffer","outputR","getDuration","Reverb","rate","time","decay","reverse","impulseResponse","reverb","createConvolver","opt","left","right","random","Effect","panning","api","nodeList","sourceNode","connectToDestination","l","lastNode","updateConnections","prev","has","add","remove","splice","toggle","force","hasNode","removeAll","destroy","analyser","compressor","options","createDynamicsCompressor","threshold","knee","ratio","attack","release","convolver","echo","distortion","lowpass","peak","highpass","bandpass","width","lowshelf","highshelf","peaking","notch","allpass","sharpness","flanger","gainNode","panner","phaser","recorder","seconds","inputChannels","outputChannels","thisArg","bind","setSource","setDestination","Object","freeze","Group","sounds","effect","preMuteVolume","group","find","soundOrId","found","sound","id","once","play","pause","playing","paused","seek","mute","volume","unMute","setVolume","fade","duration","cancelScheduledValues","setValueAtTime","linearRampToValueAtTime","groupVolume","EventEmitter","events","Emitter","off","removeListener","removeAllListeners","Loader","ERROR_STATE","emitter","progress","audioContext","isTouchLocked","request","timeout","removeListeners","readyHandler","errorHandler","progressHandler","loadHandler","dispatchComplete","emit","lengthComputable","loaded","total","clearTimeout","message","error","code","status","statusText","decodeArrayBuffer","arraybuffer","decodeAudioData","response","cancel","readyState","abort","loadArrayBuffer","XMLHttpRequest","open","responseType","send","loadAudioElement","tagName","setTimeout","preload","load","newUrl","on","queue","numLoaded","numTotal","currentLoader","completeHandler","call","console","next","loader","BufferSource","onEnded","ended","endedCallback","loop","pausedAt","playbackRate","createSourceNode","onended","elapsed","endedHandler","MediaSource","delayTimeout","fadeTimeout","createMediaElementSource","debug","toVolume","ramp","step","MicrophoneSource","stream","createMediaStreamSource","mozGetUserMedia","mozHack","OscillatorSource","ScriptSource","onProcess","onPaused","numberOfChannels","channel","j","wave","audioBuffer","sameBuffer","sameLength","chunk","resolution","max","greatest","incr","scale","Sound","playWhenReady","createSource","file","Error","asMediaElement","fileData","hasOwnProperty","create","prototype","__source","SoundGroup","getSource","sort","rmeove","Microphone","connected","denied","getUserMedia","webkitGetUserMedia","msGetUserMedia","isSupported","micStream","halfPI","twoPI","waveformer","style","shape","color","bgColor","lineWidth","originX","originY","transform","canvas","height","ctx","currentColor","radius","innerRadius","centerX","centerY","min","getContext","clear","fillStyle","fillRect","clearRect","strokeStyle","beginPath","updateColor","position","newColor","stroke","getValue","angle","magnitude","sine","cosine","cos","moveTo","lineTo","closePath","offlineCtx","Ctx","AudioContext","webkitAudioContext","isSuspended","getOfflineContext","numOfChannels","OfflineCtx","OfflineAudioContext","webkitOfflineAudioContext","cloneBuffer","numChannels","cloned","reverseBuffer","fromValue","toValue","linear","exponentialRampToValueAtTime","minValue","maxValue","microphone","timeCode","delim","m","s","mn","sc","Sono","VERSION","utils","getSound","createGroup","soundGroup","soundContext","webAudio","loaderGroup","errorMessage","onError","onProgress","onComplete","err","createSound","destroySound","destroyAll","pauseAll","resumeAll","stopAll","pageHiddenPaused","title","info","hasWebAudio","args","apply"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/lib/utils/browser.js","../src/lib/utils/file.js","../src/lib/effect/analyser.js","../src/lib/utils/validify.js","../src/lib/effect/distortion.js","../src/lib/effect/echo.js","../src/lib/effect/fake-context.js","../src/lib/effect/filter.js","../src/lib/effect/flanger.js","../src/lib/effect/panner.js","../src/lib/effect/phaser.js","../src/lib/effect/recorder.js","../src/lib/effect/reverb.js","../src/lib/effect.js","../src/lib/group.js","../node_modules/events/events.js","../src/lib/utils/emitter.js","../src/lib/utils/loader.js","../src/lib/source/buffer-source.js","../src/lib/source/media-source.js","../src/lib/source/microphone-source.js","../src/lib/source/oscillator-source.js","../src/lib/source/script-source.js","../src/lib/utils/waveform.js","../src/lib/sound.js","../src/lib/utils/sound-group.js","../src/lib/utils/microphone.js","../src/lib/utils/waveformer.js","../src/lib/utils/utils.js","../src/sono.js"],"sourcesContent":["const browser = {};\n\nbrowser.handlePageVisibility = function(onHidden, onShown) {\n let hidden,\n visibilityChange;\n\n if (typeof document.hidden !== 'undefined') {\n hidden = 'hidden';\n visibilityChange = 'visibilitychange';\n } else if (typeof document.mozHidden !== 'undefined') {\n hidden = 'mozHidden';\n visibilityChange = 'mozvisibilitychange';\n } else if (typeof document.msHidden !== 'undefined') {\n hidden = 'msHidden';\n visibilityChange = 'msvisibilitychange';\n } else if (typeof document.webkitHidden !== 'undefined') {\n hidden = 'webkitHidden';\n visibilityChange = 'webkitvisibilitychange';\n }\n\n function onChange() {\n if (document[hidden]) {\n onHidden();\n } else {\n onShown();\n }\n }\n\n if (typeof visibilityChange !== 'undefined') {\n document.addEventListener(visibilityChange, onChange, false);\n }\n};\n\nbrowser.handleTouchLock = function(context, onUnlock) {\n const ua = navigator.userAgent,\n locked = !!ua.match(\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|SymbianOS/i);\n\n function unlock() {\n if (context && context.state === 'suspended') {\n context.resume()\n .then(function() {\n const buffer = context.createBuffer(1, 1, 44100);\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n source.start(0);\n source.stop(0);\n source.disconnect();\n\n document.body.removeEventListener('touchend', unlock);\n onUnlock();\n });\n } else {\n document.body.removeEventListener('touchend', unlock);\n onUnlock();\n }\n }\n\n if (locked) {\n document.body.addEventListener('touchend', unlock, false);\n }\n\n return locked;\n};\n\nexport default browser;\n","const extensions = [];\nconst canPlay = {};\n\n/*\n * Initial tests\n */\n\nconst tests = [{\n ext: 'ogg',\n type: 'audio/ogg; codecs=\"vorbis\"'\n}, {\n ext: 'mp3',\n type: 'audio/mpeg;'\n}, {\n ext: 'opus',\n type: 'audio/ogg; codecs=\"opus\"'\n}, {\n ext: 'wav',\n type: 'audio/wav; codecs=\"1\"'\n}, {\n ext: 'm4a',\n type: 'audio/x-m4a;'\n}, {\n ext: 'm4a',\n type: 'audio/aac;'\n}];\n\nlet el = document.createElement('audio');\nif (el) {\n tests.forEach(function(test) {\n const canPlayType = !!el.canPlayType(test.type);\n if (canPlayType && extensions.indexOf(test.ext) === -1) {\n extensions.push(test.ext);\n }\n canPlay[test.ext] = canPlayType;\n });\n el = null;\n}\n\n/*\n * find a supported file\n */\n\nfunction getFileExtension(url) {\n if (typeof url !== 'string') {\n return '';\n }\n // from DataURL\n if (url.slice(0, 5) === 'data:') {\n const match = url.match(/data:audio\\/(ogg|mp3|opus|wav|m4a)/i);\n if (match && match.length > 1) {\n return match[1].toLowerCase();\n }\n }\n // from Standard URL\n url = url.split('?')[0];\n url = url.slice(url.lastIndexOf('/') + 1);\n\n const a = url.split('.');\n if (a.length === 1 || (a[0] === '' && a.length === 2)) {\n return '';\n }\n return a.pop()\n .toLowerCase();\n}\n\nfunction getSupportedFile(fileNames) {\n let name;\n\n if (Array.isArray(fileNames)) {\n // if array get the first one that works\n for (let i = 0; i < fileNames.length; i++) {\n name = fileNames[i];\n const ext = getFileExtension(name);\n if (extensions.indexOf(ext) > -1) {\n break;\n }\n }\n } else if (typeof fileNames === 'object') {\n // if not array and is object\n Object.keys(fileNames)\n .some(function(key) {\n name = fileNames[key];\n const ext = getFileExtension(name);\n return extensions.indexOf(ext) > -1;\n });\n }\n // if string just return\n return name || fileNames;\n}\n\n/*\n * infer file types\n */\n\nfunction isAudioBuffer(data) {\n return !!(data &&\n window.AudioBuffer &&\n data instanceof window.AudioBuffer);\n}\n\nfunction isArrayBuffer(data) {\n return !!(data &&\n window.ArrayBuffer &&\n data instanceof window.ArrayBuffer);\n}\n\nfunction isMediaElement(data) {\n return !!(data &&\n window.HTMLMediaElement &&\n data instanceof window.HTMLMediaElement);\n}\n\nfunction isMediaStream(data) {\n return !!(data &&\n typeof data.getAudioTracks === 'function' &&\n data.getAudioTracks()\n .length &&\n window.MediaStreamTrack &&\n data.getAudioTracks()[0] instanceof window.MediaStreamTrack);\n}\n\nfunction isOscillatorType(data) {\n return !!(data && typeof data === 'string' &&\n (data === 'sine' || data === 'square' ||\n data === 'sawtooth' || data === 'triangle'));\n}\n\nfunction isScriptConfig(data) {\n return !!(data && typeof data === 'object' &&\n data.bufferSize && data.channels && data.callback);\n}\n\nfunction isURL(data) {\n return !!(data && typeof data === 'string' &&\n (data.indexOf('.') > -1 || data.slice(0, 5) === 'data:'));\n}\n\nfunction containsURL(config) {\n if (!config || isMediaElement(config)) {\n return false;\n }\n // string, array or object with src/url/data property that is string, array or arraybuffer\n const src = config.src || config.url || config.data || config;\n return isURL(src) || isArrayBuffer(src) || (Array.isArray(src) && isURL(src[0]));\n}\n\nexport default {\n canPlay,\n containsURL,\n extensions,\n getFileExtension,\n getSupportedFile,\n isAudioBuffer,\n isMediaElement,\n isMediaStream,\n isOscillatorType,\n isScriptConfig,\n isURL\n};\n","export default function Analyser(context, config) {\n config = config || {};\n\n const node = context.createAnalyser();\n\n let fftSize = config.fftSize || 512,\n freqFloat = !!config.float,\n waveFloat = !!config.float,\n waveform,\n frequencies;\n\n node.fftSize = fftSize; // frequencyBinCount will be half this value\n node.smoothingTimeConstant = config.smoothing || config.smoothingTimeConstant || node.smoothingTimeConstant;\n node.minDecibels = config.minDecibels || node.minDecibels;\n node.maxDecibels = config.maxDecibels || node.maxDecibels;\n\n //the worker returns a normalized value\n //first a sum of all magnitudes devided by the byteLength, then devide by half the fft (1channel)\n const amplitudeBlob = new Blob([\n 'onmessage=function(e){var data=e.data;var f=new Float32Array(data.b);for(var i=0;i0.9)&&(correlation>lastCorrelation)){foundGoodCorrelation=true;if (correlation>best_correlation){best_correlation=correlation;best_offset=offset}}else if (foundGoodCorrelation){var shift=(correlations[best_offset+1]-correlations[best_offset-1])/correlations[best_offset];postMessage(sampleRate/(best_offset+(8*shift)))}lastCorrelation=correlation}if (best_correlation>0.01){postMessage(sampleRate/best_offset)}else{postMessage(-1)}}};'\n ]);\n const amplitudeBlobURL = URL.createObjectURL(amplitudeBlob);\n const amplitudeWorker = new Worker(amplitudeBlobURL);\n const pitchBlobURL = URL.createObjectURL(pitchBlob);\n const pitchWorker = new Worker(pitchBlobURL);\n\n let amplitudeCallback = null;\n const noteStrings = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];\n let pitchCallback = null;\n const pitchCallbackObject = {\n hertz: null, //number\n note: null, //string\n noteIndex: null, //int\n detuneCents: null, //number\n detune: null //string\n };\n\n function noteFromPitch(frequency) {\n const noteNum = 12 * (Math.log(frequency / 440) / Math.log(2));\n return Math.round(noteNum) + 69;\n }\n\n function frequencyFromNoteNumber(note) {\n return 440 * Math.pow(2, (note - 69) / 12);\n }\n\n function centsOffFromPitch(frequency, note) {\n return Math.floor(1200 * Math.log(frequency / frequencyFromNoteNumber(note)) / Math.log(2));\n }\n\n amplitudeWorker.onmessage = function(e) {\n if (amplitudeCallback) {\n amplitudeCallback(e.data);\n }\n };\n\n pitchWorker.onmessage = function(e) {\n if (pitchCallback) {\n const Hz = e.data;\n if (Hz !== -1) {\n const note = noteFromPitch(Hz);\n const detune = centsOffFromPitch(Hz, note);\n pitchCallbackObject.hertz = Hz;\n pitchCallbackObject.noteIndex = note % 12;\n pitchCallbackObject.note = noteStrings[note % 12];\n pitchCallbackObject.detuneCents = detune;\n if (detune === 0) {\n pitchCallbackObject.detune = '';\n } else if (detune < 0) {\n pitchCallbackObject.detune = 'flat';\n } else {\n pitchCallbackObject.detune = 'sharp';\n }\n }\n pitchCallback(pitchCallbackObject);\n }\n };\n\n function needsUpdate(arr, float) {\n if (!arr) {\n return true;\n }\n if (node.fftSize !== fftSize) {\n return true;\n }\n if (float && arr instanceof Uint8Array) {\n return true;\n }\n return !float && arr instanceof Float32Array;\n }\n\n function createArray(float, length) {\n return float ? new Float32Array(length) : new Uint8Array(length);\n }\n\n node.getWaveform = function(float) {\n if (!arguments.length) {\n float = waveFloat;\n }\n\n if (needsUpdate(waveform, float)) {\n fftSize = node.fftSize;\n waveFloat = float;\n waveform = createArray(float, fftSize);\n }\n if (float && this.getFloatTimeDomainData) {\n this.getFloatTimeDomainData(waveform);\n } else {\n this.getByteTimeDomainData(waveform);\n }\n\n return waveform;\n };\n\n node.getPitch = function(callback) {\n pitchCallback = pitchCallback || callback;\n const f = new Float32Array(node.fftSize);\n f.set(node.getWaveform(true));\n pitchWorker.postMessage({\n sampleRate: context.sampleRate,\n b: f.buffer\n }, [f.buffer]);\n };\n\n node.getFrequencies = function(float) {\n if (!arguments.length) {\n float = freqFloat;\n }\n\n if (needsUpdate(frequencies, float)) {\n fftSize = node.fftSize;\n freqFloat = float;\n frequencies = createArray(float, node.frequencyBinCount);\n }\n\n if (float) {\n this.getFloatFrequencyData(frequencies);\n } else {\n this.getByteFrequencyData(frequencies);\n }\n\n return frequencies;\n };\n\n node.getAmplitude = function(callback) {\n amplitudeCallback = amplitudeCallback || callback;\n const f = new Float32Array(node.fftSize);\n f.set(node.getFrequencies(true));\n amplitudeWorker.postMessage({\n sum: 0,\n length: f.byteLength,\n numSamples: node.fftSize / 2,\n b: f.buffer\n }, [f.buffer]);\n };\n\n node.update = function() {\n node.getWaveform();\n node.getFrequencies();\n };\n\n Object.defineProperties(node, {\n smoothing: {\n get: function() {\n return node.smoothingTimeConstant;\n },\n set: function(value) {\n node.smoothingTimeConstant = value;\n }\n }\n });\n\n return node;\n}\n","function number(value, defaultValue) {\n if (arguments.length < 2) {\n defaultValue = 0;\n }\n if (typeof value !== 'number' || isNaN(value)) {\n return defaultValue;\n }\n return value;\n}\n\nexport {number};\n","import {number} from '../utils/validify.js';\n\nconst n = 22050;\n\nexport default function Distortion(context, amount) {\n\n amount = number(amount, 1);\n\n const node = context.createWaveShaper();\n const curve = new Float32Array(n);\n\n // create waveShaper distortion curve from 0 to 1\n node.update = function(value) {\n amount = value;\n if (amount <= 0) {\n amount = 0;\n this.curve = null;\n return;\n }\n const k = value * 100;\n const deg = Math.PI / 180;\n let x;\n\n for (let i = 0; i < n; i++) {\n x = i * 2 / n - 1;\n curve[i] = (3 + k) * x * 20 * deg / (Math.PI + k * Math.abs(x));\n }\n\n this.curve = curve;\n };\n\n Object.defineProperties(node, {\n amount: {\n get: function() {\n return amount;\n },\n set: function(value) {\n this.update(value);\n }\n }\n });\n\n if (typeof amount !== 'undefined') {\n node.update(amount);\n }\n\n return node;\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Echo(context, config) {\n config = config || {};\n\n const input = context.createGain();\n const delay = context.createDelay();\n const gain = context.createGain();\n const output = context.createGain();\n\n delay.delayTime.value = number(config.delayTime, 0.5);\n gain.gain.value = number(config.feedback, 0.5);\n\n input.connect(delay);\n input.connect(output);\n delay.connect(gain);\n gain.connect(delay);\n gain.connect(output);\n\n const node = input;\n node.name = 'Echo';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delay.delayTime.value;\n },\n set: function(value) {\n delay.delayTime.value = value;\n }\n },\n feedback: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n gain.gain.value = value;\n }\n }\n });\n\n return node;\n}\n","export default function FakeContext() {\n\n const startTime = Date.now();\n\n function fn() {}\n\n function param() {\n return {\n value: 1,\n defaultValue: 1,\n linearRampToValueAtTime: fn,\n setValueAtTime: fn,\n exponentialRampToValueAtTime: fn,\n setTargetAtTime: fn,\n setValueCurveAtTime: fn,\n cancelScheduledValues: fn\n };\n }\n\n function fakeNode() {\n return {\n connect: fn,\n disconnect: fn,\n // analyser\n frequencyBinCount: 0,\n smoothingTimeConstant: 0,\n fftSize: 0,\n minDecibels: 0,\n maxDecibels: 0,\n getByteTimeDomainData: fn,\n getByteFrequencyData: fn,\n getFloatTimeDomainData: fn,\n getFloatFrequencyData: fn,\n // gain\n gain: param(),\n // panner\n panningModel: 0,\n setPosition: fn,\n setOrientation: fn,\n setVelocity: fn,\n distanceModel: 0,\n refDistance: 0,\n maxDistance: 0,\n rolloffFactor: 0,\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n // filter:\n type: 0,\n frequency: param(),\n Q: param(),\n detune: param(),\n // delay\n delayTime: param(),\n // convolver\n buffer: 0,\n // compressor\n threshold: param(),\n knee: param(),\n ratio: param(),\n attack: param(),\n release: param(),\n reduction: param(),\n // distortion\n oversample: 0,\n curve: 0,\n // buffer\n sampleRate: 1,\n length: 0,\n duration: 0,\n numberOfChannels: 0,\n getChannelData: function() {\n return [];\n },\n copyFromChannel: fn,\n copyToChannel: fn,\n // listener\n dopplerFactor: 0,\n speedOfSound: 0,\n // osc\n start: fn\n };\n }\n\n // ie9\n if (!window.Uint8Array) {\n window.Uint8Array = window.Float32Array = Array;\n }\n\n return {\n createAnalyser: fakeNode,\n createBuffer: fakeNode,\n createBiquadFilter: fakeNode,\n createChannelMerger: fakeNode,\n createChannelSplitter: fakeNode,\n createDynamicsCompressor: fakeNode,\n createConvolver: fakeNode,\n createDelay: fakeNode,\n createGain: fakeNode,\n createOscillator: fakeNode,\n createPanner: fakeNode,\n createScriptProcessor: fakeNode,\n createWaveShaper: fakeNode,\n listener: fakeNode(),\n get currentTime() {\n return (Date.now() - startTime) / 1000;\n }\n };\n}\n","// https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode\n// For lowpass and highpass Q indicates how peaked the frequency is around the cutoff.\n// The greater the value is, the greater is the peak\n\nexport default function Filter(context, config = {}) {\n // Frequency between 40Hz and half of the sampling rate\n const minFrequency = 40;\n const maxFrequency = context.sampleRate / 2;\n\n const node = context.createBiquadFilter();\n node.type = config.type;\n\n function getFrequency(value) {\n // Logarithm (base 2) to compute how many octaves fall in the range.\n const numberOfOctaves = Math.log(maxFrequency / minFrequency) / Math.LN2;\n // Compute a multiplier from 0 to 1 based on an exponential scale.\n const multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n // Get back to the frequency value between min and max.\n return maxFrequency * multiplier;\n }\n\n node.set = function(frequency, q, gain) {\n if (typeof frequency !== 'undefined' && typeof frequency === 'number') {\n node.frequency.value = frequency;\n }\n if (typeof q !== 'undefined' && typeof q === 'number') {\n node.Q.value = q;\n }\n if (typeof gain !== 'undefined' && typeof gain === 'number') {\n node.gain.value = gain;\n }\n return node;\n };\n\n // set filter frequency based on value from 0 to 1\n node.setByPercent = function(percent, q, gain) {\n return node.set(getFrequency(percent), q, gain);\n };\n\n return node.set(config.frequency, config.q, config.gain);\n}\n","import {number} from '../utils/validify.js';\n\nfunction MonoFlanger(context, config) {\n const input = context.createGain();\n const delay = context.createDelay();\n const feedback = context.createGain();\n const lfo = context.createOscillator();\n const gain = context.createGain();\n const output = context.createGain();\n\n delay.delayTime.value = number(config.delay, 0.005); // 5-25ms delay (0.005 > 0.025)\n feedback.gain.value = number(config.feedback, 0.5); // 0 > 1\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.002); // 0.05 > 5\n gain.gain.value = number(config.gain, 0.25); // 0.0005 > 0.005\n\n input.connect(output);\n input.connect(delay);\n delay.connect(output);\n delay.connect(feedback);\n feedback.connect(input);\n\n lfo.connect(gain);\n gain.connect(delay.delayTime);\n lfo.start(0);\n\n const node = input;\n node.name = 'Flanger';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delay.delayTime.value;\n },\n set: function(value) {\n delay.delayTime.value = value;\n }\n },\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n gain.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedback.gain.value;\n },\n set: function(value) {\n feedback.gain.value = value;\n }\n }\n });\n\n return node;\n}\n\nfunction StereoFlanger(context, config) {\n const input = context.createGain();\n const splitter = context.createChannelSplitter(2);\n const merger = context.createChannelMerger(2);\n const feedbackL = context.createGain();\n const feedbackR = context.createGain();\n const lfo = context.createOscillator();\n const lfoGainL = context.createGain();\n const lfoGainR = context.createGain();\n const delayL = context.createDelay();\n const delayR = context.createDelay();\n const output = context.createGain();\n\n feedbackL.gain.value = feedbackR.gain.value = number(config.feedback, 0.5);\n delayL.delayTime.value = delayR.delayTime.value = number(config.delay, 0.003);\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.5);\n lfoGainL.gain.value = number(config.gain, 0.005);\n lfoGainR.gain.value = 0 - lfoGainL.gain.value;\n\n input.connect(splitter);\n\n splitter.connect(delayL, 0);\n splitter.connect(delayR, 1);\n\n delayL.connect(feedbackL);\n delayR.connect(feedbackR);\n\n feedbackL.connect(delayR);\n feedbackR.connect(delayL);\n\n delayL.connect(merger, 0, 0);\n delayR.connect(merger, 0, 1);\n\n merger.connect(output);\n input.connect(output);\n\n lfo.connect(lfoGainL);\n lfo.connect(lfoGainR);\n lfoGainL.connect(delayL.delayTime);\n lfoGainR.connect(delayR.delayTime);\n lfo.start(0);\n\n const node = input;\n node.name = 'StereoFlanger';\n node._output = output;\n\n Object.defineProperties(node, {\n delay: {\n get: function() {\n return delayL.delayTime.value;\n },\n set: function(value) {\n delayL.delayTime.value = delayR.delayTime.value = value;\n }\n },\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return lfoGainL.gain.value;\n },\n set: function(value) {\n lfoGainL.gain.value = lfoGainR.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedbackL.gain.value;\n },\n set: function(value) {\n feedbackL.gain.value = feedbackR.gain.value = value;\n }\n }\n });\n\n return node;\n}\n\nexport default function Flanger(context, config) {\n config = config || {};\n return config.stereo ? new StereoFlanger(context, config) : new MonoFlanger(context, config);\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Panner(context) {\n const node = context.createPanner();\n\n // Default for stereo is 'HRTF' can also be 'equalpower'\n node.panningModel = Panner.defaults.panningModel;\n\n // Distance model and attributes\n // Can be 'linear' 'inverse' 'exponential'\n node.distanceModel = Panner.defaults.distanceModel;\n node.refDistance = Panner.defaults.refDistance;\n node.maxDistance = Panner.defaults.maxDistance;\n node.rolloffFactor = Panner.defaults.rolloffFactor;\n node.coneInnerAngle = Panner.defaults.coneInnerAngle;\n node.coneOuterAngle = Panner.defaults.coneOuterAngle;\n node.coneOuterGain = Panner.defaults.coneOuterGain;\n // set to defaults (needed in Firefox)\n node.setPosition(0, 0, 1);\n node.setOrientation(0, 0, 0);\n\n // simple vec3 object pool\n const vecPool = {\n pool: [],\n get: function(x, y, z) {\n const v = this.pool.length ? this.pool.pop() : {\n x: 0,\n y: 0,\n z: 0\n };\n // check if a vector has been passed in\n if (typeof x !== 'undefined' && isNaN(x) && 'x' in x && 'y' in x && 'z' in x) {\n v.x = number(x.x);\n v.y = number(x.y);\n v.z = number(x.z);\n } else {\n v.x = number(x);\n v.y = number(y);\n v.z = number(z);\n }\n return v;\n },\n dispose: function(instance) {\n this.pool.push(instance);\n }\n };\n\n const globalUp = vecPool.get(0, 1, 0),\n angle45 = Math.PI / 4,\n angle90 = Math.PI / 2;\n\n // cross product of 2 vectors\n function cross(a, b) {\n const ax = a.x,\n ay = a.y,\n az = a.z;\n const bx = b.x,\n by = b.y,\n bz = b.z;\n a.x = ay * bz - az * by;\n a.y = az * bx - ax * bz;\n a.z = ax * by - ay * bx;\n }\n\n // normalise to unit vector\n function normalize(vec3) {\n if (vec3.x === 0 && vec3.y === 0 && vec3.z === 0) {\n return vec3;\n }\n const length = Math.sqrt(vec3.x * vec3.x + vec3.y * vec3.y + vec3.z * vec3.z);\n const invScalar = 1 / length;\n vec3.x *= invScalar;\n vec3.y *= invScalar;\n vec3.z *= invScalar;\n return vec3;\n }\n\n // set the orientation of the source (where the audio is coming from)\n function setOrientation(pannerNode, fw) {\n // calculate up vec ( up = (forward cross (0, 1, 0)) cross forward )\n const up = vecPool.get(fw.x, fw.y, fw.z);\n cross(up, globalUp);\n cross(up, fw);\n normalize(up);\n normalize(fw);\n // set the audio context's listener position to match the camera position\n pannerNode.setOrientation(fw.x, fw.y, fw.z, up.x, up.y, up.z);\n // return the vecs to the pool\n vecPool.dispose(fw);\n vecPool.dispose(up);\n }\n\n function setPosition(nodeOrListener, vec) {\n nodeOrListener.setPosition(vec.x, vec.y, vec.z);\n vecPool.dispose(vec);\n }\n\n\n node.set = function(x, y, z) {\n const v = vecPool.get(x, y, z);\n\n if (arguments.length === 1 && v.x) {\n // pan left to right with value from -1 to 1\n x = v.x;\n\n if (x > 1) {\n x = 1;\n }\n if (x < -1) {\n x = -1;\n }\n\n // creates a nice curve with z\n x = x * angle45;\n z = x + angle90;\n\n if (z > angle90) {\n z = Math.PI - z;\n }\n\n v.x = Math.sin(x);\n v.z = Math.sin(z);\n }\n setPosition(node, v);\n };\n\n // set the position the audio is coming from)\n node.setSourcePosition = function(x, y, z) {\n setPosition(node, vecPool.get(x, y, z));\n };\n\n // set the direction the audio is coming from)\n node.setSourceOrientation = function(x, y, z) {\n setOrientation(node, vecPool.get(x, y, z));\n };\n\n // set the position of who or what is hearing the audio (could be camera or some character)\n node.setListenerPosition = function(x, y, z) {\n setPosition(context.listener, vecPool.get(x, y, z));\n };\n\n // set the position of who or what is hearing the audio (could be camera or some character)\n node.setListenerOrientation = function(x, y, z) {\n setOrientation(context.listener, vecPool.get(x, y, z));\n };\n\n node.getDefaults = function() {\n return Panner.defaults;\n };\n\n node.setDefaults = function(defaults) {\n Object.keys(defaults)\n .forEach(function(key) {\n Panner.defaults[key] = defaults[key];\n });\n };\n\n return node;\n}\n\nPanner.defaults = {\n panningModel: 'HRTF',\n distanceModel: 'linear',\n refDistance: 1,\n maxDistance: 1000,\n rolloffFactor: 1,\n coneInnerAngle: 360,\n coneOuterAngle: 0,\n coneOuterGain: 0\n};\n","import {number} from '../utils/validify.js';\n\nexport default function Phaser(context, config = {}) {\n const stages = number(config.stages, 8);\n const filters = [];\n let filter;\n\n const input = context.createGain();\n const feedback = context.createGain();\n const lfo = context.createOscillator();\n const lfoGain = context.createGain();\n const output = context.createGain();\n\n feedback.gain.value = number(config.feedback, 0.5);\n\n lfo.type = 'sine';\n lfo.frequency.value = number(config.frequency, 0.5);\n lfoGain.gain.value = number(config.gain, 300);\n\n for (let i = 0; i < stages; i++) {\n filter = context.createBiquadFilter();\n filter.type = 'allpass';\n filter.frequency.value = 1000 * i;\n //filter.Q.value = 10;\n if (i > 0) {\n filters[i - 1].connect(filter);\n }\n lfoGain.connect(filter.frequency);\n\n filters.push(filter);\n }\n\n const first = filters[0];\n const last = filters[filters.length - 1];\n\n input.connect(first);\n input.connect(output);\n last.connect(output);\n last.connect(feedback);\n feedback.connect(first);\n lfo.connect(lfoGain);\n lfo.start(0);\n\n const node = input;\n node.name = 'Phaser';\n node._output = output;\n\n Object.defineProperties(node, {\n lfoFrequency: {\n get: function() {\n return lfo.frequency.value;\n },\n set: function(value) {\n lfo.frequency.value = value;\n }\n },\n lfoGain: {\n get: function() {\n return lfoGain.gain.value;\n },\n set: function(value) {\n lfoGain.gain.value = value;\n }\n },\n feedback: {\n get: function() {\n return feedback.gain.value;\n },\n set: function(value) {\n feedback.gain.value = value;\n }\n }\n });\n\n return node;\n}\n","export default function Recorder(context, passThrough) {\n const bufferLength = 4096,\n buffersL = [],\n buffersR = [];\n let startedAt = 0,\n stoppedAt = 0;\n\n const input = context.createGain();\n const output = context.createGain();\n let script;\n\n const node = input;\n node.name = 'Recorder';\n node._output = output;\n\n node.isRecording = false;\n\n function mergeBuffers(buffers, length) {\n const buffer = new Float32Array(length);\n let offset = 0;\n for (let i = 0; i < buffers.length; i++) {\n buffer.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return buffer;\n }\n\n function getBuffer() {\n if (!buffersL.length) {\n return context.createBuffer(2, bufferLength, context.sampleRate);\n }\n const recordingLength = buffersL.length * bufferLength;\n const buffer = context.createBuffer(2, recordingLength, context.sampleRate);\n buffer.getChannelData(0)\n .set(mergeBuffers(buffersL, recordingLength));\n buffer.getChannelData(1)\n .set(mergeBuffers(buffersR, recordingLength));\n return buffer;\n }\n\n function destroyScriptProcessor() {\n if (script) {\n script.onaudioprocess = null;\n input.disconnect();\n script.disconnect();\n }\n }\n\n function createScriptProcessor() {\n destroyScriptProcessor();\n\n script = context.createScriptProcessor(bufferLength, 2, 2);\n input.connect(script);\n script.connect(context.destination);\n script.connect(output);\n\n\n script.onaudioprocess = function(event) {\n const inputL = event.inputBuffer.getChannelData(0);\n const inputR = event.inputBuffer.getChannelData(1);\n\n if (passThrough) {\n const outputL = event.outputBuffer.getChannelData(0);\n const outputR = event.outputBuffer.getChannelData(1);\n outputL.set(inputL);\n outputR.set(inputR);\n }\n\n if (node.isRecording) {\n buffersL.push(new Float32Array(inputL));\n buffersR.push(new Float32Array(inputR));\n }\n };\n }\n\n node.start = function() {\n createScriptProcessor();\n buffersL.length = 0;\n buffersR.length = 0;\n startedAt = context.currentTime;\n stoppedAt = 0;\n this.isRecording = true;\n };\n\n node.stop = function() {\n stoppedAt = context.currentTime;\n this.isRecording = false;\n destroyScriptProcessor();\n return getBuffer();\n };\n\n node.getDuration = function() {\n if (!this.isRecording) {\n return stoppedAt - startedAt;\n }\n return context.currentTime - startedAt;\n };\n\n return node;\n}\n","import {number} from '../utils/validify.js';\n\nexport default function Reverb(context, config = {}) {\n const rate = context.sampleRate;\n\n let time = number(config.time, 1);\n let decay = number(config.decay, 5);\n let reverse = !!config.reverse;\n let length;\n let impulseResponse;\n\n const input = context.createGain();\n const reverb = context.createConvolver();\n const output = context.createGain();\n\n input.connect(reverb);\n input.connect(output);\n reverb.connect(output);\n\n const node = input;\n node.name = 'Reverb';\n node._output = output;\n\n node.update = function(opt) {\n if (typeof opt.time !== 'undefined') {\n time = opt.time;\n length = Math.floor(rate * time);\n impulseResponse = length ? context.createBuffer(2, length, rate) : null;\n }\n if (typeof opt.decay !== 'undefined') {\n decay = opt.decay;\n }\n if (typeof opt.reverse !== 'undefined') {\n reverse = opt.reverse;\n }\n\n if (!impulseResponse) {\n reverb.buffer = null;\n return;\n }\n\n const left = impulseResponse.getChannelData(0);\n const right = impulseResponse.getChannelData(1);\n let n, e;\n\n for (let i = 0; i < length; i++) {\n n = reverse ? length - i : i;\n e = Math.pow(1 - n / length, decay);\n left[i] = (Math.random() * 2 - 1) * e;\n right[i] = (Math.random() * 2 - 1) * e;\n }\n\n reverb.buffer = impulseResponse;\n };\n\n node.update({\n time: time,\n decay: decay,\n reverse: reverse\n });\n\n Object.defineProperties(node, {\n time: {\n get: function() {\n return time;\n },\n set: function(value) {\n if (value === time) {\n return;\n }\n this.update({\n time: value\n });\n }\n },\n decay: {\n get: function() {\n return decay;\n },\n set: function(value) {\n if (value === decay) {\n return;\n }\n this.update({\n decay: value\n });\n }\n },\n reverse: {\n get: function() {\n return reverse;\n },\n set: function(value) {\n if (value === reverse) {\n return;\n }\n this.update({\n reverse: !!value\n });\n }\n }\n });\n\n return node;\n}\n","import Analyser from './effect/analyser';\nimport Distortion from './effect/distortion';\nimport Echo from './effect/echo';\nimport FakeContext from './effect/fake-context';\nimport Filter from './effect/filter';\nimport Flanger from './effect/flanger';\nimport Panner from './effect/panner';\nimport Phaser from './effect/phaser';\nimport Recorder from './effect/recorder';\nimport Reverb from './effect/reverb';\n\nexport default function Effect(context) {\n context = context || new FakeContext();\n const panning = new Panner(context);\n\n let api = null,\n destination,\n nodeList = [],\n sourceNode;\n\n function connect(a, b) {\n //console.log('> connect', (a.name || a.constructor.name), 'to', (b.name || b.constructor.name));\n\n const output = a._output || a;\n //console.log('> disconnect output: ', (a.name || a.constructor.name));\n output.disconnect();\n //console.log('> connect output: ',(a.name || a.constructor.name), 'to input:', (b.name || b.constructor.name));\n output.connect(b);\n }\n\n function connectToDestination(node) {\n const l = nodeList.length;\n const lastNode = l ? nodeList[l - 1] : sourceNode;\n\n if (lastNode) {\n connect(lastNode, node);\n }\n\n destination = node;\n }\n\n function updateConnections() {\n if (!sourceNode) {\n return;\n }\n\n //console.log('updateConnections:', nodeList.length);\n\n let node,\n prev;\n\n for (let i = 0; i < nodeList.length; i++) {\n node = nodeList[i];\n //console.log(i, node);\n prev = i === 0 ? sourceNode : nodeList[i - 1];\n connect(prev, node);\n }\n\n if (destination) {\n connectToDestination(destination);\n }\n }\n\n function has(node) {\n if (!node) {\n return false;\n }\n return nodeList.indexOf(node) > -1;\n }\n\n function add(node) {\n if (!node) {\n return null;\n }\n if (has(node)) {\n return node;\n }\n nodeList.push(node);\n updateConnections();\n return node;\n }\n\n function remove(node) {\n if (!node) {\n return null;\n }\n if (!has(node)) {\n return node;\n }\n const l = nodeList.length;\n for (let i = 0; i < l; i++) {\n if (node === nodeList[i]) {\n nodeList.splice(i, 1);\n break;\n }\n }\n const output = node._output || node;\n output.disconnect();\n updateConnections();\n return node;\n }\n\n function toggle(node, force) {\n force = !!force;\n const hasNode = has(node);\n if (arguments.length > 1 && hasNode === force) {\n return api;\n }\n if (hasNode) {\n remove(node);\n } else {\n add(node);\n }\n return api;\n }\n\n function removeAll() {\n while (nodeList.length) {\n nodeList.pop()\n .disconnect();\n }\n updateConnections();\n return api;\n }\n\n function destroy() {\n removeAll();\n context = null;\n destination = null;\n nodeList = [];\n if (sourceNode) {\n sourceNode.disconnect();\n }\n sourceNode = null;\n }\n\n /*\n * Effects\n */\n\n function analyser(config) {\n return add(new Analyser(context, config));\n }\n\n // lowers the volume of the loudest parts of the signal and raises the volume of the softest parts\n function compressor(options) {\n const node = context.createDynamicsCompressor();\n\n node.update = function(config) {\n // min decibels to start compressing at from -100 to 0\n node.threshold.value = typeof config.threshold !== 'undefined' ? config.threshold : -24;\n // decibel value to start curve to compressed value from 0 to 40\n node.knee.value = typeof config.knee !== 'undefined' ? config.knee : 30;\n // amount of change per decibel from 1 to 20\n node.ratio.value = typeof config.ratio !== 'undefined' ? config.ratio : 12;\n // gain reduction currently applied by compressor from -20 to 0\n // node.reduction.value = typeof config.reduction !== 'undefined' ? config.reduction : -10;)\n // seconds to reduce gain by 10db from 0 to 1 - how quickly signal adapted when volume increased\n node.attack.value = typeof config.attack !== 'undefined' ? config.attack : 0.0003;\n // seconds to increase gain by 10db from 0 to 1 - how quickly signal adapted when volume redcuced\n node.release.value = typeof config.release !== 'undefined' ? config.release : 0.25;\n };\n\n node.update(options || {});\n\n return add(node);\n }\n\n function convolver(impulseResponse) {\n // impulseResponse is an audio file buffer\n const node = context.createConvolver();\n node.buffer = impulseResponse;\n return add(node);\n }\n\n function delay(time) {\n const node = context.createDelay();\n if (typeof time !== 'undefined') {\n node.delayTime.value = time;\n }\n return add(node);\n }\n\n function echo(config) {\n return add(new Echo(context, config));\n }\n\n function distortion(amount) {\n // Float32Array defining curve (values are interpolated)\n //node.curve\n // up-sample before applying curve for better resolution result 'none', '2x' or '4x'\n //node.oversample = '2x';\n return add(new Distortion(context, amount));\n }\n\n function filter(type, frequency, q, gain) {\n return add(new Filter(context, {type, frequency, q, gain}));\n }\n\n function lowpass(frequency, peak) {\n return filter('lowpass', {frequency, q: peak});\n }\n\n function highpass(frequency, peak) {\n return filter('highpass', {frequency, q: peak});\n }\n\n function bandpass(frequency, width) {\n return filter('bandpass', {frequency, q: width});\n }\n\n function lowshelf(frequency, gain) {\n return filter('lowshelf', {frequency, q: 0, gain});\n }\n\n function highshelf(frequency, gain) {\n return filter('highshelf', {frequency, q: 0, gain});\n }\n\n function peaking(frequency, width, gain) {\n return filter('peaking', {frequency, q: width, gain});\n }\n\n function notch(frequency, width, gain) {\n return filter('notch', {frequency, q: width, gain});\n }\n\n function allpass(frequency, sharpness) {\n return filter('allpass', {frequency, q: sharpness});\n }\n\n function flanger(config) {\n return add(new Flanger(context, config));\n }\n\n function gainNode(value) {\n const node = context.createGain();\n if (typeof value !== 'undefined') {\n node.gain.value = value;\n }\n return node;\n }\n\n function panner() {\n return add(new Panner(context));\n }\n\n function phaser(config) {\n return add(new Phaser(context, config));\n }\n\n function recorder(passThrough) {\n return add(new Recorder(context, passThrough));\n }\n\n function reverb(seconds, decay, reverse) {\n return add(new Reverb(context, seconds, decay, reverse));\n }\n\n function script(config = {}) {\n // bufferSize 256 - 16384 (pow 2)\n const bufferSize = config.bufferSize || 1024;\n const inputChannels = typeof config.inputChannels === 'undefined' ? 0 : config.inputChannels;\n const outputChannels = typeof config.outputChannels === 'undefined' ? 1 : config.outputChannels;\n\n const node = context.createScriptProcessor(bufferSize, inputChannels, outputChannels);\n\n const thisArg = config.thisArg || config.context || node;\n const callback = config.callback || function() {};\n\n // available props:\n /*\n event.inputBuffer\n event.outputBuffer\n event.playbackTime\n */\n // Example: generate noise\n /*\n const output = event.outputBuffer.getChannelData(0);\n const l = output.length;\n for (let i = 0; i < l; i++) {\n output[i] = Math.random();\n }\n */\n node.onaudioprocess = callback.bind(thisArg);\n\n return add(node);\n }\n\n function setSource(node) {\n sourceNode = node;\n updateConnections();\n return node;\n }\n\n function setDestination(node) {\n connectToDestination(node);\n return node;\n }\n\n //\n\n api = {\n context,\n nodeList,\n panning,\n\n has,\n add,\n remove,\n toggle,\n removeAll,\n destroy,\n setSource,\n setDestination,\n\n analyser,\n compressor,\n convolver,\n delay,\n echo,\n distortion,\n filter,\n lowpass,\n highpass,\n bandpass,\n lowshelf,\n highshelf,\n peaking,\n notch,\n allpass,\n flanger,\n gain: gainNode,\n panner,\n phaser,\n recorder,\n reverb,\n script\n };\n\n return Object.freeze(api);\n}\n","import Effect from './effect';\n\nexport default function Group(context, destination) {\n const sounds = [];\n const effect = new Effect(context);\n const gain = effect.gain();\n let preMuteVolume = 1;\n let group = null;\n\n if (context) {\n effect.setSource(gain);\n effect.setDestination(destination || context.destination);\n }\n\n /*\n * Add / remove\n */\n\n function find(soundOrId, callback) {\n let found;\n\n if (!soundOrId && soundOrId !== 0) {\n return found;\n }\n\n sounds.some(function(sound) {\n if (sound === soundOrId || sound.id === soundOrId) {\n found = sound;\n return true;\n }\n return false;\n });\n\n if (found && callback) {\n return callback(found);\n }\n\n return found;\n }\n\n function remove(soundOrId) {\n find(soundOrId, (sound) => sounds.splice(sounds.indexOf(sound), 1));\n return group;\n }\n\n function add(sound) {\n sound.gain.disconnect();\n sound.gain.connect(gain);\n\n sounds.push(sound);\n\n sound.once('destroy', remove);\n\n return group;\n }\n\n /*\n * Controls\n */\n\n function play(delay, offset) {\n sounds.forEach((sound) => sound.play(delay, offset));\n return group;\n }\n\n function pause() {\n sounds.forEach(function(sound) {\n if (sound.playing) {\n sound.pause();\n }\n });\n return group;\n }\n\n function resume() {\n sounds.forEach(function(sound) {\n if (sound.paused) {\n sound.play();\n }\n });\n return group;\n }\n\n function stop() {\n sounds.forEach((sound) => sound.stop());\n return group;\n }\n\n function seek(percent) {\n sounds.forEach((sound) => sound.seek(percent));\n return group;\n }\n\n function mute() {\n preMuteVolume = group.volume;\n group.volume = 0;\n return group;\n }\n\n function unMute() {\n group.volume = preMuteVolume || 1;\n return group;\n }\n\n function setVolume(value) {\n group.volume = value;\n return group;\n }\n\n function fade(volume, duration) {\n if (context) {\n const param = gain.gain;\n const time = context.currentTime;\n\n param.cancelScheduledValues(time);\n param.setValueAtTime(param.value, time);\n // param.setValueAtTime(volume, time + duration);\n param.linearRampToValueAtTime(volume, time + duration);\n // param.setTargetAtTime(volume, time, duration);\n // param.exponentialRampToValueAtTime(Math.max(volume, 0.0001), time + duration);\n } else {\n sounds.forEach(function(sound) {\n sound.fade(volume, duration);\n });\n }\n\n return group;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n while (sounds.length) {\n sounds.pop()\n .destroy();\n }\n }\n\n /*\n * Api\n */\n\n group = {\n add,\n find,\n remove,\n play,\n pause,\n resume,\n stop,\n seek,\n setVolume,\n mute,\n unMute,\n fade,\n destroy\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(group, {\n effect: {\n value: effect\n },\n gain: {\n value: gain\n },\n sounds: {\n value: sounds\n },\n volume: {\n get: function() {\n return gain.gain.value;\n },\n set: function(value) {\n if (isNaN(value)) {\n return;\n }\n\n if (context) {\n gain.gain.cancelScheduledValues(context.currentTime);\n gain.gain.value = value;\n gain.gain.setValueAtTime(value, context.currentTime);\n } else {\n gain.gain.value = value;\n }\n sounds.forEach(function(sound) {\n if (!sound.context) {\n sound.groupVolume = value;\n }\n });\n }\n }\n });\n\n return group;\n}\n\nGroup.Effect = Effect;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","import events from 'events';\nconst {EventEmitter} = events;\n\nexport default class Emitter extends EventEmitter {\n constructor() {\n super();\n }\n\n off (type, listener) {\n if (listener) {\n return this.removeListener(type, listener);\n }\n if (type) {\n return this.removeAllListeners(type);\n }\n return this.removeAllListeners();\n }\n}\n","import Emitter from './emitter';\n\nexport default function Loader(url) {\n const ERROR_STATE = ['', 'ABORTED', 'NETWORK', 'DECODE', 'SRC_NOT_SUPPORTED'];\n const emitter = new Emitter();\n let progress = 0,\n audioContext,\n isTouchLocked,\n request,\n timeout,\n data;\n\n // clean up\n\n function removeListeners() {\n emitter.off('error');\n emitter.off('progress');\n emitter.off('complete');\n emitter.off('loaded');\n\n if (data && typeof data.removeEventListener === 'function') {\n data.removeEventListener('canplaythrough', readyHandler);\n data.removeEventListener('error', errorHandler);\n }\n\n if (request) {\n request.removeEventListener('progress', progressHandler);\n request.removeEventListener('load', loadHandler);\n request.removeEventListener('error', errorHandler);\n }\n }\n\n function dispatchComplete(buffer) {\n emitter.emit('progress', 1);\n emitter.emit('loaded', buffer);\n emitter.emit('complete', buffer);\n\n removeListeners();\n }\n\n function progressHandler(event) {\n if (event.lengthComputable) {\n progress = event.loaded / event.total;\n emitter.emit('progress', progress);\n }\n }\n\n // error\n\n function errorHandler(event) {\n window.clearTimeout(timeout);\n\n let message = event;\n\n if (data && data.error) {\n message = 'Media Error: ' + ERROR_STATE[data.error.code] + ' ' + url;\n }\n\n if (request) {\n message = 'XHR Error: ' + request.status + ' ' + request.statusText + ' ' + url;\n }\n\n emitter.emit('error', message);\n\n removeListeners();\n }\n\n function decodeArrayBuffer(arraybuffer) {\n audioContext.decodeAudioData(arraybuffer, (buffer) => {\n data = buffer;\n request = null;\n progress = 1;\n dispatchComplete(buffer);\n },\n errorHandler\n );\n }\n\n function loadHandler() {\n decodeArrayBuffer(request.response);\n }\n\n function readyHandler() {\n window.clearTimeout(timeout);\n if (!data) {\n return;\n }\n progress = 1;\n dispatchComplete(data);\n }\n\n function cancel() {\n removeListeners();\n\n if (request && request.readyState !== 4) {\n request.abort();\n }\n request = null;\n\n window.clearTimeout(timeout);\n }\n\n function destroy() {\n cancel();\n request = null;\n data = null;\n audioContext = null;\n }\n\n // audio buffer\n\n function loadArrayBuffer() {\n if (url instanceof window.ArrayBuffer) {\n decodeArrayBuffer(url);\n return;\n }\n request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'arraybuffer';\n request.addEventListener('progress', progressHandler);\n request.addEventListener('load', loadHandler);\n request.addEventListener('error', errorHandler);\n request.send();\n }\n\n // audio element\n\n function loadAudioElement() {\n if (!data || !data.tagName) {\n data = document.createElement('audio');\n }\n\n if (!isTouchLocked) {\n // timeout because sometimes canplaythrough doesn't fire\n window.clearTimeout(timeout);\n timeout = window.setTimeout(readyHandler, 2000);\n data.addEventListener('canplaythrough', readyHandler, false);\n }\n\n data.addEventListener('error', errorHandler, false);\n data.preload = 'auto';\n data.src = url;\n data.load();\n\n if (isTouchLocked) {\n dispatchComplete(data);\n }\n }\n\n function start() {\n if (audioContext) {\n loadArrayBuffer();\n } else {\n loadAudioElement();\n }\n }\n\n // reload\n\n function load(newUrl) {\n url = newUrl;\n start();\n }\n\n const api = {\n on: emitter.on.bind(emitter),\n once: emitter.once.bind(emitter),\n off: emitter.off.bind(emitter),\n load,\n start,\n cancel,\n destroy\n };\n\n Object.defineProperties(api, {\n data: {\n get: function() {\n return data;\n }\n },\n progress: {\n get: function() {\n return progress;\n }\n },\n audioContext: {\n set: function(value) {\n audioContext = value;\n }\n },\n isTouchLocked: {\n set: function(value) {\n isTouchLocked = value;\n }\n }\n });\n\n return Object.freeze(api);\n}\n\nLoader.Group = function() {\n const emitter = new Emitter();\n const queue = [];\n let numLoaded = 0,\n numTotal = 0,\n currentLoader;\n\n function progressHandler(progress) {\n const loaded = numLoaded + progress;\n emitter.emit('progress', loaded / numTotal);\n }\n\n function completeHandler() {\n numLoaded++;\n removeListeners();\n emitter.emit('progress', numLoaded / numTotal);\n next();\n }\n\n function errorHandler(e) {\n console.error.call(console, e);\n removeListeners();\n emitter.emit('error', e);\n next();\n }\n\n function next() {\n if (queue.length === 0) {\n currentLoader = null;\n emitter.emit('complete');\n return;\n }\n\n currentLoader = queue.pop();\n currentLoader.on('progress', progressHandler);\n currentLoader.once('loaded', completeHandler);\n currentLoader.once('error', errorHandler);\n currentLoader.start();\n }\n\n function removeListeners() {\n currentLoader.off('progress', progressHandler);\n currentLoader.off('loaded', completeHandler);\n currentLoader.off('error', errorHandler);\n }\n\n function add(loader) {\n queue.push(loader);\n numTotal++;\n return loader;\n }\n\n function start() {\n numTotal = queue.length;\n next();\n }\n\n return Object.freeze({\n on: emitter.on.bind(emitter),\n once: emitter.once.bind(emitter),\n off: emitter.off.bind(emitter),\n add,\n start\n });\n};\n","export default function BufferSource(buffer, context, onEnded) {\n const api = {};\n let ended = false,\n endedCallback = onEnded,\n loop = false,\n paused = false,\n pausedAt = 0,\n playbackRate = 1,\n playing = false,\n sourceNode = null,\n startedAt = 0;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createBufferSource();\n sourceNode.buffer = buffer;\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function stop() {\n if (sourceNode) {\n sourceNode.onended = null;\n try {\n sourceNode.disconnect();\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n function endedHandler() {\n stop();\n ended = true;\n if (typeof endedCallback === 'function') {\n endedCallback(api);\n }\n }\n\n function play(delay, offset = 0) {\n if (playing) {\n return;\n }\n\n delay = delay ? context.currentTime + delay : 0;\n if (offset) {\n pausedAt = 0;\n }\n if (pausedAt) {\n offset = pausedAt;\n }\n while (offset > api.duration) {\n offset = offset % api.duration;\n }\n\n createSourceNode();\n sourceNode.onended = endedHandler;\n sourceNode.start(delay, offset);\n\n sourceNode.loop = loop;\n sourceNode.playbackRate.value = playbackRate;\n\n startedAt = context.currentTime - offset;\n ended = false;\n paused = false;\n pausedAt = 0;\n playing = true;\n }\n\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n buffer = null;\n context = null;\n endedCallback = null;\n sourceNode = null;\n }\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n stop: {\n value: stop\n },\n destroy: {\n value: destroy\n },\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n let time = context.currentTime - startedAt;\n if (time > api.duration) {\n time = time % api.duration;\n }\n return time;\n }\n return 0;\n }\n },\n duration: {\n get: function() {\n return buffer ? buffer.duration : 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n if (sourceNode) {\n sourceNode.loop = loop;\n }\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (sourceNode) {\n sourceNode.playbackRate.value = playbackRate;\n }\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n get: function() {\n return api.duration ? api.currentTime / api.duration : 0;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function MediaSource(el, context, onEnded) {\n const api = {};\n let ended = false,\n endedCallback = onEnded,\n delayTimeout,\n fadeTimeout,\n loop = false,\n paused = false,\n playbackRate = 1,\n playing = false,\n sourceNode = null,\n groupVolume = 1,\n volume = 1;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createMediaElementSource(el);\n }\n return sourceNode;\n }\n\n /*\n * Load\n */\n\n function load(url) {\n el.src = url;\n el.load();\n ended = false;\n paused = false;\n playing = false;\n }\n\n /*\n * Controls\n */\n\n function readyHandler() {\n el.removeEventListener('canplaythrough', readyHandler);\n if (playing) {\n el.play();\n }\n }\n\n /*\n * Ended handler\n */\n\n function endedHandler() {\n\n if (loop) {\n el.currentTime = 0;\n // fixes bug where server doesn't support seek:\n if (el.currentTime > 0) {\n el.load();\n }\n el.play();\n\n return;\n }\n\n ended = true;\n paused = false;\n playing = false;\n\n if (typeof endedCallback === 'function') {\n endedCallback(api);\n }\n }\n\n function play(delay, offset) {\n clearTimeout(delayTimeout);\n\n el.volume = volume * groupVolume;\n el.playbackRate = playbackRate;\n\n if (offset) {\n el.currentTime = offset;\n }\n\n if (delay) {\n delayTimeout = setTimeout(play, delay);\n } else {\n // el.load();\n el.play();\n }\n\n ended = false;\n paused = false;\n playing = true;\n\n el.removeEventListener('ended', endedHandler);\n el.addEventListener('ended', endedHandler, false);\n\n console.debug('el.readyState', el.readyState);\n if (el.readyState < 1) {\n el.removeEventListener('canplaythrough', readyHandler);\n el.addEventListener('canplaythrough', readyHandler, false);\n el.load();\n el.play();\n }\n }\n\n function pause() {\n clearTimeout(delayTimeout);\n\n if (!el) {\n return;\n }\n\n el.pause();\n playing = false;\n paused = true;\n }\n\n function stop() {\n clearTimeout(delayTimeout);\n\n if (!el) {\n return;\n }\n\n el.pause();\n\n try {\n el.currentTime = 0;\n // fixes bug where server doesn't support seek:\n if (el.currentTime > 0) {\n el.load();\n }\n } catch (e) {}\n\n playing = false;\n paused = false;\n }\n\n /*\n * Fade for no webaudio\n */\n\n function fade(toVolume, duration) {\n if (context) {\n return api;\n }\n\n function ramp(value, step) {\n fadeTimeout = window.setTimeout(() => {\n api.volume = api.volume + (value - api.volume) * 0.2;\n if (Math.abs(api.volume - value) > 0.05) {\n ramp(value, step);\n return;\n }\n api.volume = value;\n }, step * 1000);\n }\n\n window.clearTimeout(fadeTimeout);\n ramp(toVolume, duration / 10);\n\n return api;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n el.removeEventListener('ended', endedHandler);\n el.removeEventListener('canplaythrough', readyHandler);\n stop();\n el = null;\n context = null;\n endedCallback = null;\n sourceNode = null;\n }\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n stop: {\n value: stop\n },\n load: {\n value: load\n },\n fade: {\n value: fade\n },\n destroy: {\n value: destroy\n },\n currentTime: {\n get: function() {\n return el ? el.currentTime : 0;\n }\n },\n duration: {\n get: function() {\n return el ? el.duration : 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (el) {\n el.playbackRate = playbackRate;\n }\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n get: function() {\n return el && el.duration ? el.currentTime / el.duration : 0;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n },\n volume: {\n get: function() {\n return volume;\n },\n set: function(value) {\n window.clearTimeout(fadeTimeout);\n volume = value;\n if (el) {\n el.volume = volume * groupVolume;\n }\n }\n },\n groupVolume: {\n get: function() {\n return groupVolume;\n },\n set: function(value) {\n groupVolume = value;\n if (el) {\n el.volume = volume * groupVolume;\n }\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function MicrophoneSource(stream, context) {\n let ended = false,\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // MicrophoneSourceNode\n startedAt = 0;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createMediaStreamSource(stream);\n // HACK: stops moz garbage collection killing the stream\n // see https://support.mozilla.org/en-US/questions/984179\n if (navigator.mozGetUserMedia) {\n window.mozHack = sourceNode;\n }\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play(delay) {\n delay = delay ? context.currentTime + delay : 0;\n\n createSourceNode();\n sourceNode.start(delay);\n\n startedAt = context.currentTime - pausedAt;\n ended = false;\n playing = true;\n paused = false;\n pausedAt = 0;\n }\n\n function stop() {\n if (sourceNode) {\n try {\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n sourceNode = null;\n stream = null;\n window.mozHack = null;\n }\n\n /*\n * Api\n */\n\n const api = {\n play,\n pause,\n stop,\n destroy,\n\n duration: 0,\n progress: 0\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function OscillatorSource(type, context) {\n let ended = false,\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // OscillatorSourceNode\n startedAt = 0,\n frequency = 200,\n api = null;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createOscillator();\n sourceNode.type = type;\n sourceNode.frequency.value = frequency;\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play(delay) {\n delay = delay || 0;\n if (delay) {\n delay = context.currentTime + delay;\n }\n\n createSourceNode();\n sourceNode.start(delay);\n\n if (pausedAt) {\n startedAt = context.currentTime - pausedAt;\n } else {\n startedAt = context.currentTime;\n }\n\n ended = false;\n playing = true;\n paused = false;\n pausedAt = 0;\n }\n\n function stop() {\n if (sourceNode) {\n try {\n sourceNode.stop(0);\n } catch (e) {}\n sourceNode = null;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n sourceNode = null;\n }\n\n /*\n * Api\n */\n\n api = {\n play: play,\n pause: pause,\n stop: stop,\n destroy: destroy\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n duration: {\n value: 0\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n frequency: {\n get: function() {\n return frequency;\n },\n set: function(value) {\n frequency = value;\n if (sourceNode) {\n sourceNode.frequency.value = value;\n }\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n progress: {\n value: 0\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function ScriptSource(data, context) {\n const bufferSize = data.bufferSize || 1024;\n const channels = data.channels || 1;\n let ended = false,\n onProcess = data.callback.bind(data.thisArg || this),\n paused = false,\n pausedAt = 0,\n playing = false,\n sourceNode = null, // ScriptSourceNode\n startedAt = 0,\n api = null;\n\n function createSourceNode() {\n if (!sourceNode && context) {\n sourceNode = context.createScriptProcessor(bufferSize, 0, channels);\n }\n return sourceNode;\n }\n\n /*\n * Controls\n */\n\n function play() {\n createSourceNode();\n sourceNode.onaudioprocess = onProcess;\n\n startedAt = context.currentTime - pausedAt;\n ended = false;\n paused = false;\n pausedAt = 0;\n playing = true;\n }\n\n function onPaused(event) {\n const buffer = event.outputBuffer;\n for (let i = 0; i < buffer.numberOfChannels; i++) {\n const channel = buffer.getChannelData(i);\n for (let j = 0; j < channel.length; j++) {\n channel[j] = 0;\n }\n }\n }\n\n function stop() {\n if (sourceNode) {\n sourceNode.onaudioprocess = onPaused;\n }\n ended = true;\n paused = false;\n pausedAt = 0;\n playing = false;\n startedAt = 0;\n }\n\n function pause() {\n const elapsed = context.currentTime - startedAt;\n stop();\n pausedAt = elapsed;\n playing = false;\n paused = true;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n stop();\n context = null;\n onProcess = null;\n sourceNode = null;\n }\n\n /*\n * Api\n */\n\n api = {\n play,\n pause,\n stop,\n destroy,\n\n duration: 0,\n progress: 0\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n currentTime: {\n get: function() {\n if (pausedAt) {\n return pausedAt;\n }\n if (startedAt) {\n return context.currentTime - startedAt;\n }\n return 0;\n }\n },\n ended: {\n get: function() {\n return ended;\n }\n },\n paused: {\n get: function() {\n return paused;\n }\n },\n playing: {\n get: function() {\n return playing;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n }\n });\n\n return Object.freeze(api);\n}\n","export default function waveform() {\n let buffer,\n wave;\n\n return function(audioBuffer, length) {\n if (!window.Float32Array || !window.AudioBuffer) {\n return [];\n }\n\n const sameBuffer = buffer === audioBuffer;\n const sameLength = wave && wave.length === length;\n if (sameBuffer && sameLength) {\n return wave;\n }\n\n //console.time('waveData');\n if (!wave || wave.length !== length) {\n wave = new Float32Array(length);\n }\n\n if (!audioBuffer) {\n return wave;\n }\n\n // cache for repeated calls\n buffer = audioBuffer;\n\n const chunk = Math.floor(buffer.length / length),\n resolution = 5, // 10\n incr = Math.max(Math.floor(chunk / resolution), 1);\n let greatest = 0;\n\n for (let i = 0; i < buffer.numberOfChannels; i++) {\n // check each channel\n const channel = buffer.getChannelData(i);\n for (let j = 0; j < length; j++) {\n // get highest value within the chunk\n for (let k = j * chunk, l = k + chunk; k < l; k += incr) {\n // select highest value from channels\n let a = channel[k];\n if (a < 0) {\n a = -a;\n }\n if (a > wave[j]) {\n wave[j] = a;\n }\n // update highest overall for scaling\n if (a > greatest) {\n greatest = a;\n }\n }\n }\n }\n // scale up\n const scale = 1 / greatest;\n for (let i = 0; i < wave.length; i++) {\n wave[i] *= scale;\n }\n //console.timeEnd('waveData');\n\n return wave;\n };\n}\n","import BufferSource from './source/buffer-source';\nimport Effect from './effect';\nimport Emitter from './utils/emitter';\nimport file from './utils/file';\nimport Loader from './utils/loader';\nimport MediaSource from './source/media-source';\nimport MicrophoneSource from './source/microphone-source';\nimport OscillatorSource from './source/oscillator-source';\nimport ScriptSource from './source/script-source';\nimport waveform from './utils/waveform.js';\n\nexport default function Sound(context, destination) {\n let id,\n data,\n effect = new Effect(context),\n gain = effect.gain(),\n wave = waveform(),\n isTouchLocked = false,\n loader,\n loop = false,\n playbackRate = 1,\n playWhenReady,\n source;\n\n let sound = null;\n\n if (context) {\n effect.setDestination(gain);\n gain.connect(destination || context.destination);\n }\n\n /*\n * Create source\n */\n\n function createSource(value) {\n data = value;\n\n if (file.isAudioBuffer(data)) {\n source = new BufferSource(data, context, () => sound.emit('ended', sound));\n } else if (file.isMediaElement(data)) {\n source = new MediaSource(data, context, () => sound.emit('ended', sound));\n } else if (file.isMediaStream(data)) {\n source = new MicrophoneSource(data, context);\n } else if (file.isOscillatorType((data && data.type) || data)) {\n source = new OscillatorSource(data.type || data, context);\n } else if (file.isScriptConfig(data)) {\n source = new ScriptSource(data, context);\n } else {\n throw new Error('Cannot detect data type: ' + data);\n }\n\n effect.setSource(source.sourceNode);\n\n sound.emit('ready', sound);\n\n if (playWhenReady) {\n playWhenReady();\n }\n }\n\n /*\n * Load\n */\n\n function load(config) {\n const src = file.getSupportedFile(config.src || config.url || config.data || config);\n\n if (source && data && data.tagName) {\n source.load(src);\n } else {\n loader = loader || new Loader(src);\n loader.audioContext = !!config.asMediaElement ? null : context;\n loader.isTouchLocked = isTouchLocked;\n loader.once('loaded', function(fileData) {\n createSource(fileData);\n sound.emit('loaded', sound);\n });\n }\n return sound;\n }\n\n /*\n * Controls\n */\n\n function play(delay, offset) {\n if (!source || isTouchLocked) {\n playWhenReady = function() {\n if (source) {\n play(delay, offset);\n }\n };\n return sound;\n }\n playWhenReady = null;\n effect.setSource(source.sourceNode);\n\n // update volume needed for no webaudio\n if (!context) {\n sound.volume = gain.gain.value;\n }\n\n source.play(delay, offset);\n\n if (source.hasOwnProperty('loop')) {\n source.loop = loop;\n }\n\n sound.emit('play', sound);\n\n return sound;\n }\n\n function pause() {\n source && source.pause();\n sound.emit('pause', sound);\n return sound;\n }\n\n function stop(delay) {\n source && source.stop(delay || 0);\n sound.emit('stop', sound);\n return sound;\n }\n\n function seek(percent) {\n if (source) {\n source.stop();\n play(0, source.duration * percent);\n }\n return sound;\n }\n\n function fade(volume, duration) {\n if (!source) {\n return sound;\n }\n\n const param = gain.gain;\n\n if (context) {\n const time = context.currentTime;\n param.cancelScheduledValues(time);\n param.setValueAtTime(param.value, time);\n param.linearRampToValueAtTime(volume, time + duration);\n } else if (typeof source.fade === 'function') {\n source.fade(volume, duration);\n param.value = volume;\n }\n\n return sound;\n }\n\n /*\n * Destroy\n */\n\n function destroy() {\n source && source.destroy();\n effect && effect.destroy();\n gain && gain.disconnect();\n loader && loader.destroy();\n sound.off('loaded');\n sound.off('ended');\n gain = null;\n context = null;\n data = null;\n playWhenReady = null;\n source = null;\n effect = null;\n loader = null;\n wave = null;\n sound.emit('destroy', sound);\n sound.off('destroy');\n }\n\n sound = Object.create(Emitter.prototype, {\n _events: {\n value: {}\n },\n constructor: {\n value: Sound\n },\n play: {\n value: play\n },\n pause: {\n value: pause\n },\n load: {\n value: load\n },\n seek: {\n value: seek\n },\n stop: {\n value: stop\n },\n fade: {\n value: fade\n },\n destroy: {\n value: destroy\n },\n context: {\n value: context\n },\n currentTime: {\n get: function() {\n return source ? source.currentTime : 0;\n },\n set: function(value) {\n // const silent = sound.playing;\n source && source.stop();\n // play(0, value, silent);\n play(0, value);\n }\n },\n data: {\n get: function() {\n return data;\n },\n set: function(value) {\n if (!value) {\n return;\n }\n createSource(value);\n }\n },\n duration: {\n get: function() {\n return source ? source.duration : 0;\n }\n },\n effect: {\n value: effect\n },\n ended: {\n get: function() {\n return !!source && source.ended;\n }\n },\n frequency: {\n get: function() {\n return source ? source.frequency : 0;\n },\n set: function(value) {\n if (source && source.hasOwnProperty('frequency')) {\n source.frequency = value;\n }\n }\n },\n gain: {\n value: gain\n },\n id: {\n get: function() {\n return id;\n },\n set: function(value) {\n id = value;\n }\n },\n isTouchLocked: {\n set: function(value) {\n isTouchLocked = value;\n if (loader) {\n loader.isTouchLocked = value;\n }\n if (!value && playWhenReady) {\n playWhenReady();\n }\n }\n },\n loader: {\n get: function() {\n return loader;\n }\n },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n\n if (source && source.hasOwnProperty('loop') && source.loop !== loop) {\n source.loop = loop;\n }\n }\n },\n paused: {\n get: function() {\n return !!source && source.paused;\n }\n },\n playing: {\n get: function() {\n return !!source && source.playing;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n if (source) {\n source.playbackRate = playbackRate;\n }\n }\n },\n progress: {\n get: function() {\n return source ? source.progress : 0;\n }\n },\n sourceNode: {\n get: function() {\n return source ? source.sourceNode : null;\n }\n },\n volume: {\n get: function() {\n if (context) {\n return gain.gain.value;\n }\n if (source && source.hasOwnProperty('volume')) {\n return source.volume;\n }\n return 1;\n },\n set: function(value) {\n if (isNaN(value)) {\n return;\n }\n\n const param = gain.gain;\n\n if (context) {\n const time = context.currentTime;\n param.cancelScheduledValues(time);\n param.value = value;\n param.setValueAtTime(value, time);\n } else {\n param.value = value;\n\n if (source && source.hasOwnProperty('volume')) {\n source.volume = value;\n }\n }\n }\n },\n // for media element source\n groupVolume: {\n get: function() {\n return source.groupVolume;\n },\n set: function(value) {\n if (source && source.hasOwnProperty('groupVolume')) {\n source.groupVolume = value;\n }\n }\n },\n waveform: {\n value: function(length) {\n if (!data) {\n sound.once('ready', () => wave(data, length));\n }\n return wave(data, length);\n }\n },\n userData: {\n value: {}\n }\n });\n\n return Object.freeze(sound);\n}\n\n// expose for unit tests\nSound.__source = {\n BufferSource,\n MediaSource,\n MicrophoneSource,\n OscillatorSource,\n ScriptSource\n};\n","import Group from '../group';\n\nexport default function SoundGroup(context, destination) {\n const group = new Group(context, destination);\n const sounds = group.sounds;\n let playbackRate = 1,\n loop = false,\n src;\n\n function getSource() {\n if (!sounds.length) {\n return;\n }\n\n src = sounds.slice(0)\n .sort((a, b) => b.duration - a.duration)[0];\n }\n\n const add = group.add;\n group.add = function(sound) {\n add(sound);\n getSource();\n return group;\n };\n\n const remove = group.rmeove;\n group.remove = function(soundOrId) {\n remove(soundOrId);\n getSource();\n return group;\n };\n\n Object.defineProperties(group, {\n currentTime: {\n get: function() {\n return src ? src.currentTime : 0;\n },\n set: function(value) {\n this.stop();\n this.play(0, value);\n }\n },\n duration: {\n get: function() {\n return src ? src.duration : 0;\n }\n },\n // ended: {\n // get: function() {\n // return src ? src.ended : false;\n // }\n // },\n loop: {\n get: function() {\n return loop;\n },\n set: function(value) {\n loop = !!value;\n sounds.forEach(function(sound) {\n sound.loop = loop;\n });\n }\n },\n paused: {\n get: function() {\n // return src ? src.paused : false;\n return !!src && src.paused;\n }\n },\n progress: {\n get: function() {\n return src ? src.progress : 0;\n }\n },\n playbackRate: {\n get: function() {\n return playbackRate;\n },\n set: function(value) {\n playbackRate = value;\n sounds.forEach(function(sound) {\n sound.playbackRate = playbackRate;\n });\n }\n },\n playing: {\n get: function() {\n // return src ? src.playing : false;\n return !!src && src.playing;\n }\n }\n });\n\n return group;\n}\n","export default function Microphone(connected, denied, error) {\n navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n error = error || function() {};\n\n const isSupported = !!navigator.getUserMedia;\n const api = {};\n let stream = null;\n\n function connect() {\n if (!isSupported) {\n return api;\n }\n\n navigator.getUserMedia({\n audio: true\n }, function(micStream) {\n stream = micStream;\n connected(stream);\n }, function(e) {\n if (denied && e.name === 'PermissionDeniedError' || e === 'PERMISSION_DENIED') {\n // console.log('Permission denied. Reset by clicking the camera icon with the red cross.');\n denied();\n } else {\n error(e.message || e);\n }\n });\n return api;\n }\n\n function disconnect() {\n if (stream) {\n stream.stop();\n stream = null;\n }\n return api;\n }\n\n Object.defineProperties(api, {\n connect: {\n value: connect\n },\n disconnect: {\n value: disconnect\n },\n isSupported: {\n value: isSupported\n },\n stream: {\n get: function() {\n return stream;\n }\n }\n });\n\n return Object.freeze(api);\n}\n","const halfPI = Math.PI / 2;\nconst twoPI = Math.PI * 2;\n\nexport default function waveformer(config) {\n\n const style = config.style || 'fill', // 'fill' or 'line'\n shape = config.shape || 'linear', // 'circular' or 'linear'\n color = config.color || 0,\n bgColor = config.bgColor,\n lineWidth = config.lineWidth || 1,\n percent = config.percent || 1,\n originX = config.x || 0,\n originY = config.y || 0,\n transform = config.transform;\n\n let canvas = config.canvas,\n width = config.width || (canvas && canvas.width),\n height = config.height || (canvas && canvas.height);\n\n let ctx = null, currentColor, i, x, y,\n radius, innerRadius, centerX, centerY;\n\n if (!canvas && !config.context) {\n canvas = document.createElement('canvas');\n width = width || canvas.width;\n height = height || canvas.height;\n canvas.width = height;\n canvas.height = height;\n }\n\n if (shape === 'circular') {\n radius = config.radius || Math.min(height / 2, width / 2);\n innerRadius = config.innerRadius || radius / 2;\n centerX = originX + width / 2;\n centerY = originY + height / 2;\n }\n\n ctx = config.context || canvas.getContext('2d');\n\n function clear() {\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fillRect(originX, originY, width, height);\n } else {\n ctx.clearRect(originX, originY, width, height);\n }\n\n ctx.lineWidth = lineWidth;\n\n currentColor = null;\n\n if (typeof color !== 'function') {\n ctx.strokeStyle = color;\n ctx.beginPath();\n }\n }\n\n function updateColor(position, length, value) {\n if (typeof color === 'function') {\n const newColor = color(position, length, value);\n if (newColor !== currentColor) {\n currentColor = newColor;\n ctx.stroke();\n ctx.strokeStyle = currentColor;\n ctx.beginPath();\n }\n }\n }\n\n function getValue(value, position, length) {\n if (typeof transform === 'function') {\n return transform(value, position, length);\n }\n return value;\n }\n\n function getWaveform(value, length) {\n if (value && typeof value.waveform === 'function') {\n return value.waveform(length);\n }\n if (value) {\n return value;\n }\n if (config.waveform) {\n return config.waveform;\n }\n if (config.sound) {\n return config.sound.waveform(length);\n }\n return null;\n }\n\n function update(wave) {\n\n clear();\n\n if (shape === 'circular') {\n const waveform = getWaveform(wave, 360);\n const length = Math.floor(waveform.length * percent);\n\n const step = twoPI / length;\n let angle, magnitude, sine, cosine;\n\n for (i = 0; i < length; i++) {\n const value = getValue(waveform[i], i, length);\n updateColor(i, length, value);\n\n angle = i * step - halfPI;\n cosine = Math.cos(angle);\n sine = Math.sin(angle);\n\n if (style === 'fill') {\n x = centerX + innerRadius * cosine;\n y = centerY + innerRadius * sine;\n ctx.moveTo(x, y);\n }\n\n magnitude = innerRadius + (radius - innerRadius) * value;\n x = centerX + magnitude * cosine;\n y = centerY + magnitude * sine;\n\n if (style === 'line' && i === 0) {\n ctx.moveTo(x, y);\n }\n\n ctx.lineTo(x, y);\n }\n\n if (style === 'line') {\n ctx.closePath();\n }\n } else {\n\n const waveform = getWaveform(wave, width);\n let length = Math.min(waveform.length, width - lineWidth / 2);\n length = Math.floor(length * percent);\n\n for (i = 0; i < length; i++) {\n const value = getValue(waveform[i], i, length);\n updateColor(i, length, value);\n\n if (style === 'line' && i > 0) {\n ctx.lineTo(x, y);\n }\n\n x = originX + i;\n y = originY + height - Math.round(height * value);\n y = Math.floor(Math.min(y, originY + height - lineWidth / 2));\n\n if (style === 'fill') {\n ctx.moveTo(x, y);\n ctx.lineTo(x, originY + height);\n } else {\n ctx.lineTo(x, y);\n }\n }\n }\n ctx.stroke();\n }\n\n update.canvas = canvas;\n\n if (config.waveform || config.sound) {\n update();\n }\n\n return update;\n}\n","import Microphone from './microphone';\nimport waveformer from './waveformer';\n\n/*\n * audio ctx\n */\nlet ctx;\nlet offlineCtx;\n\nfunction getContext() {\n if (ctx) {\n return ctx;\n }\n\n const Ctx = window.AudioContext || window.webkitAudioContext;\n\n ctx = (Ctx ? new Ctx() : null);\n\n // Handles bug in Safari 9 OSX where AudioContext instance starts in 'suspended' state\n\n const isSuspended = ctx && ctx.state === 'suspended';\n\n if (isSuspended && typeof ctx.resume === 'function') {\n window.setTimeout(function() {\n ctx.resume();\n }, 1000);\n }\n\n return ctx;\n}\n\n/*\nIn contrast with a standard AudioContext, an OfflineAudioContext doesn't render\nthe audio to the device hardware;\ninstead, it generates it, as fast as it can, and outputs the result to an AudioBuffer.\n*/\nfunction getOfflineContext(numOfChannels, length, sampleRate) {\n if (offlineCtx) {\n return offlineCtx;\n }\n numOfChannels = numOfChannels || 2;\n sampleRate = sampleRate || 44100;\n length = sampleRate || numOfChannels;\n\n const OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\n offlineCtx = (OfflineCtx ? new OfflineCtx(numOfChannels, length, sampleRate) : null);\n\n return offlineCtx;\n}\n\n\n/*\n * clone audio buffer\n */\n\nfunction cloneBuffer(buffer) {\n if (!ctx) {\n return buffer;\n }\n\n const numChannels = buffer.numberOfChannels,\n cloned = ctx.createBuffer(numChannels, buffer.length, buffer.sampleRate);\n for (let i = 0; i < numChannels; i++) {\n cloned.getChannelData(i)\n .set(buffer.getChannelData(i));\n }\n return cloned;\n}\n\n/*\n * reverse audio buffer\n */\n\nfunction reverseBuffer(buffer) {\n const numChannels = buffer.numberOfChannels;\n for (let i = 0; i < numChannels; i++) {\n Array.prototype.reverse.call(buffer.getChannelData(i));\n }\n return buffer;\n}\n\n/*\n * ramp audio param\n */\n\nfunction ramp(param, fromValue, toValue, duration, linear) {\n if (!ctx) {\n return;\n }\n\n param.setValueAtTime(fromValue, ctx.currentTime);\n\n if (linear) {\n param.linearRampToValueAtTime(toValue, ctx.currentTime + duration);\n } else {\n param.exponentialRampToValueAtTime(toValue, ctx.currentTime + duration);\n }\n}\n\n/*\n * get frequency from min to max by passing 0 to 1\n */\n\nfunction getFrequency(value) {\n if (!ctx) {\n return 0;\n }\n // get frequency by passing number from 0 to 1\n // Clamp the frequency between the minimum value (40 Hz) and half of the\n // sampling rate.\n const minValue = 40;\n const maxValue = ctx.sampleRate / 2;\n // Logarithm (base 2) to compute how many octaves fall in the range.\n const numberOfOctaves = Math.log(maxValue / minValue) / Math.LN2;\n // Compute a multiplier from 0 to 1 based on an exponential scale.\n const multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n // Get back to the frequency value between min and max.\n return maxValue * multiplier;\n}\n\n/*\n * microphone util\n */\n\nfunction microphone(connected, denied, error) {\n return new Microphone(connected, denied, error);\n}\n\n/*\n * Format seconds as timecode string\n */\n\nfunction timeCode(seconds, delim = ':') {\n // const h = Math.floor(seconds / 3600);\n // const m = Math.floor((seconds % 3600) / 60);\n const m = Math.floor(seconds / 60);\n const s = Math.floor((seconds % 3600) % 60);\n // const hr = (h < 10 ? '0' + h + delim : h + delim);\n const mn = (m < 10 ? '0' + m : m) + delim;\n const sc = (s < 10 ? '0' + s : s);\n // return hr + mn + sc;\n return mn + sc;\n}\n\nexport default Object.freeze({\n getContext,\n getOfflineContext,\n cloneBuffer,\n reverseBuffer,\n ramp,\n getFrequency,\n microphone,\n timeCode,\n waveformer\n});\n","import browser from './lib/utils/browser';\nimport file from './lib/utils/file';\nimport Group from './lib/group';\nimport Loader from './lib/utils/loader';\nimport Sound from './lib/sound';\nimport SoundGroup from './lib/utils/sound-group';\nimport utils from './lib/utils/utils';\n\nfunction Sono() {\n const VERSION = '0.1.81';\n const context = utils.getContext();\n const destination = (context ? context.destination : null);\n const group = new Group(context, destination);\n\n let api = null;\n let isTouchLocked = false;\n\n /*\n * Get Sound by id\n */\n\n function getSound(id) {\n return group.find(id);\n }\n\n /*\n * Create group\n */\n\n function createGroup(sounds) {\n const soundGroup = new SoundGroup(context, group.gain);\n if (sounds) {\n sounds.forEach((sound) => soundGroup.add(sound));\n }\n return soundGroup;\n }\n\n /*\n * Loading\n */\n\n function add(config) {\n const soundContext = config && config.webAudio === false ? null : context;\n const sound = new Sound(soundContext, group.gain);\n sound.isTouchLocked = isTouchLocked;\n if (config) {\n sound.id = config.id || config.name || '';\n sound.loop = !!config.loop;\n sound.volume = config.volume;\n }\n group.add(sound);\n return sound;\n }\n\n function queue(config, loaderGroup) {\n const sound = add(config)\n .load(config);\n\n if (loaderGroup) {\n loaderGroup.add(sound.loader);\n }\n return sound;\n }\n\n function load(config) {\n const src = config.src || config.url || config.data || config;\n let sound, loader;\n\n if (file.containsURL(src)) {\n sound = queue(config);\n loader = sound.loader;\n } else if (Array.isArray(src) && file.containsURL(src[0].src || src[0].url)) {\n sound = [];\n loader = new Loader.Group();\n src.forEach((url) => sound.push(queue(url, loader)));\n } else {\n const errorMessage = 'sono.load: No audio file URLs found in config.';\n if (config.onError) {\n config.onError('[ERROR] ' + errorMessage);\n } else {\n throw new Error(errorMessage);\n }\n return null;\n }\n if (config.onProgress) {\n loader.on('progress', (progress) => config.onProgress(progress));\n }\n if (config.onComplete) {\n loader.once('complete', function() {\n loader.off('progress');\n config.onComplete(sound);\n });\n }\n loader.once('error', function(err) {\n loader.off('error');\n if (config.onError) {\n config.onError(err);\n } else {\n console.error.call(console, '[ERROR] sono.load: ' + err);\n }\n });\n loader.start();\n\n return sound;\n }\n\n /*\n * Create Sound\n *\n * Accepted values for param config:\n * Object config e.g. { id:'foo', url:['foo.ogg', 'foo.mp3'] }\n * Array (of files e.g. ['foo.ogg', 'foo.mp3'])\n * ArrayBuffer\n * HTMLMediaElement\n * Filename string (e.g. 'foo.ogg')\n * Oscillator type string (i.e. 'sine', 'square', 'sawtooth', 'triangle')\n * ScriptProcessor config object (e.g. { bufferSize: 1024, channels: 1, callback: fn })\n */\n\n function createSound(config) {\n // try to load if config contains URLs\n if (file.containsURL(config)) {\n return load(config);\n }\n\n const sound = add(config);\n sound.data = config.data || config;\n\n return sound;\n }\n\n /*\n * Destroy\n */\n\n function destroySound(soundOrId) {\n group.find(soundOrId, (sound) => sound.destroy());\n return api;\n }\n\n function destroyAll() {\n group.destroy();\n return api;\n }\n\n /*\n * Controls\n */\n\n function mute() {\n group.mute();\n return api;\n }\n\n function unMute() {\n group.unMute();\n return api;\n }\n\n function fade(volume, duration) {\n group.fade(volume, duration);\n return api;\n }\n\n function pauseAll() {\n group.pause();\n return api;\n }\n\n function resumeAll() {\n group.resume();\n return api;\n }\n\n function stopAll() {\n group.stop();\n return api;\n }\n\n function play(id, delay, offset) {\n group.find(id, (sound) => sound.play(delay, offset));\n return api;\n }\n\n function pause(id) {\n group.find(id, (sound) => sound.pause());\n return api;\n }\n\n function stop(id) {\n group.find(id, (sound) => sound.stop());\n return api;\n }\n\n /*\n * Mobile touch lock\n */\n\n isTouchLocked = browser.handleTouchLock(context, function() {\n isTouchLocked = false;\n group.sounds.forEach((sound) => (sound.isTouchLocked = false));\n });\n\n /*\n * Page visibility events\n */\n\n (function() {\n const pageHiddenPaused = [];\n\n // pause currently playing sounds and store refs\n function onHidden() {\n group.sounds.forEach(function(sound) {\n if (sound.playing) {\n sound.pause();\n pageHiddenPaused.push(sound);\n }\n });\n }\n\n // play sounds that got paused when page was hidden\n function onShown() {\n while (pageHiddenPaused.length) {\n pageHiddenPaused.pop()\n .play();\n }\n }\n\n browser.handlePageVisibility(onHidden, onShown);\n }());\n\n /*\n * Log version & device support info\n */\n\n function log() {\n const title = 'sono ' + VERSION,\n info = 'Supported:' + api.isSupported +\n ' WebAudioAPI:' + api.hasWebAudio +\n ' TouchLocked:' + isTouchLocked +\n ' State:' + (context && context.state) +\n ' Extensions:' + file.extensions;\n\n if (navigator.userAgent.indexOf('Chrome') > -1) {\n const args = [\n '%c ♫ ' + title +\n ' ♫ %c ' + info + ' ',\n 'color: #FFFFFF; background: #379F7A',\n 'color: #1F1C0D; background: #E0FBAC'\n ];\n console.log.apply(console, args);\n } else if (window.console && window.console.log.call) {\n console.log.call(console, title + ' ' + info);\n }\n }\n\n api = {\n createSound,\n destroySound,\n destroyAll,\n getSound,\n createGroup,\n file,\n load,\n mute,\n unMute,\n fade,\n pauseAll,\n resumeAll,\n stopAll,\n play,\n pause,\n stop,\n log,\n\n canPlay: file.canPlay,\n context,\n getOfflineContext: utils.getOfflineContext,\n effect: group.effect,\n extensions: file.extensions,\n hasWebAudio: !!context,\n isSupported: file.extensions.length > 0,\n gain: group.gain,\n utils,\n VERSION,\n\n Sound,\n Group\n };\n\n /*\n * Getters & Setters\n */\n\n Object.defineProperties(api, {\n isTouchLocked: {\n get: function() {\n return isTouchLocked;\n }\n },\n sounds: {\n get: function() {\n return group.sounds.slice(0);\n }\n },\n volume: {\n get: function() {\n return group.volume;\n },\n set: function(value) {\n group.volume = value;\n }\n }\n });\n\n return Object.freeze(api);\n}\n\nexport default new Sono();\n"],"names":["browser","handlePageVisibility","onHidden","onShown","hidden","visibilityChange","document","mozHidden","msHidden","webkitHidden","onChange","addEventListener","handleTouchLock","context","onUnlock","ua","navigator","userAgent","locked","match","unlock","state","resume","then","buffer","createBuffer","source","createBufferSource","connect","destination","start","stop","disconnect","body","removeEventListener","extensions","canPlay","tests","el","createElement","forEach","test","canPlayType","type","indexOf","ext","push","getFileExtension","url","slice","length","toLowerCase","split","lastIndexOf","a","pop","getSupportedFile","fileNames","name","Array","isArray","i","keys","some","key","isAudioBuffer","data","window","AudioBuffer","isArrayBuffer","ArrayBuffer","isMediaElement","HTMLMediaElement","isMediaStream","getAudioTracks","MediaStreamTrack","isOscillatorType","isScriptConfig","bufferSize","channels","callback","isURL","containsURL","config","src","Analyser","node","createAnalyser","fftSize","freqFloat","float","waveFloat","waveform","frequencies","smoothingTimeConstant","smoothing","minDecibels","maxDecibels","amplitudeBlob","Blob","pitchBlob","amplitudeBlobURL","URL","createObjectURL","amplitudeWorker","Worker","pitchBlobURL","pitchWorker","amplitudeCallback","noteStrings","pitchCallback","pitchCallbackObject","noteFromPitch","frequency","noteNum","Math","log","round","frequencyFromNoteNumber","note","pow","centsOffFromPitch","floor","onmessage","e","Hz","detune","hertz","noteIndex","detuneCents","needsUpdate","arr","Uint8Array","Float32Array","createArray","getWaveform","arguments","getFloatTimeDomainData","getByteTimeDomainData","getPitch","f","set","postMessage","sampleRate","getFrequencies","frequencyBinCount","getFloatFrequencyData","getByteFrequencyData","getAmplitude","byteLength","update","defineProperties","value","number","defaultValue","isNaN","n","Distortion","amount","createWaveShaper","curve","k","deg","PI","x","abs","Echo","input","createGain","delay","createDelay","gain","output","delayTime","feedback","_output","FakeContext","startTime","Date","now","fn","param","fakeNode","currentTime","Filter","minFrequency","maxFrequency","createBiquadFilter","getFrequency","numberOfOctaves","LN2","multiplier","q","Q","setByPercent","percent","MonoFlanger","lfo","createOscillator","StereoFlanger","splitter","createChannelSplitter","merger","createChannelMerger","feedbackL","feedbackR","lfoGainL","lfoGainR","delayL","delayR","Flanger","stereo","Panner","createPanner","panningModel","defaults","distanceModel","refDistance","maxDistance","rolloffFactor","coneInnerAngle","coneOuterAngle","coneOuterGain","setPosition","setOrientation","vecPool","y","z","v","pool","instance","globalUp","get","angle45","angle90","cross","b","ax","ay","az","bx","by","bz","normalize","vec3","sqrt","invScalar","pannerNode","fw","up","dispose","nodeOrListener","vec","sin","setSourcePosition","setSourceOrientation","setListenerPosition","listener","setListenerOrientation","getDefaults","setDefaults","Phaser","stages","filters","filter","lfoGain","first","last","Recorder","passThrough","bufferLength","buffersL","buffersR","startedAt","stoppedAt","script","isRecording","mergeBuffers","buffers","offset","getBuffer","recordingLength","getChannelData","destroyScriptProcessor","onaudioprocess","createScriptProcessor","event","inputL","inputBuffer","inputR","outputL","outputBuffer","outputR","getDuration","Reverb","rate","time","decay","reverse","impulseResponse","reverb","createConvolver","opt","left","right","random","Effect","panning","api","nodeList","sourceNode","connectToDestination","l","lastNode","updateConnections","prev","has","add","remove","splice","toggle","force","hasNode","removeAll","destroy","analyser","compressor","options","createDynamicsCompressor","threshold","knee","ratio","attack","release","convolver","echo","distortion","lowpass","peak","highpass","bandpass","width","lowshelf","highshelf","peaking","notch","allpass","sharpness","flanger","gainNode","panner","phaser","recorder","seconds","inputChannels","outputChannels","thisArg","bind","setSource","setDestination","Object","freeze","Group","sounds","effect","preMuteVolume","group","find","soundOrId","found","sound","id","once","play","pause","playing","paused","seek","mute","volume","unMute","setVolume","fade","duration","cancelScheduledValues","setValueAtTime","linearRampToValueAtTime","groupVolume","EventEmitter","events","Emitter","off","removeListener","removeAllListeners","Loader","ERROR_STATE","emitter","progress","audioContext","isTouchLocked","request","timeout","removeListeners","readyHandler","errorHandler","progressHandler","loadHandler","dispatchComplete","emit","lengthComputable","loaded","total","clearTimeout","message","error","code","status","statusText","decodeArrayBuffer","arraybuffer","decodeAudioData","response","cancel","readyState","abort","loadArrayBuffer","XMLHttpRequest","open","responseType","send","loadAudioElement","tagName","setTimeout","preload","load","newUrl","on","queue","numLoaded","numTotal","currentLoader","completeHandler","call","console","next","loader","BufferSource","onEnded","ended","endedCallback","loop","pausedAt","playbackRate","createSourceNode","onended","elapsed","endedHandler","MediaSource","delayTimeout","fadeTimeout","createMediaElementSource","debug","toVolume","ramp","step","MicrophoneSource","stream","createMediaStreamSource","mozGetUserMedia","mozHack","OscillatorSource","ScriptSource","onProcess","onPaused","numberOfChannels","channel","j","wave","audioBuffer","sameBuffer","sameLength","chunk","resolution","max","greatest","incr","scale","Sound","playWhenReady","createSource","file","Error","asMediaElement","fileData","hasOwnProperty","create","prototype","__source","SoundGroup","getSource","sort","rmeove","Microphone","connected","denied","getUserMedia","webkitGetUserMedia","msGetUserMedia","isSupported","micStream","halfPI","twoPI","waveformer","style","shape","color","bgColor","lineWidth","originX","originY","transform","canvas","height","ctx","currentColor","radius","innerRadius","centerX","centerY","min","getContext","clear","fillStyle","fillRect","clearRect","strokeStyle","beginPath","updateColor","position","newColor","stroke","getValue","angle","magnitude","sine","cosine","cos","moveTo","lineTo","closePath","offlineCtx","Ctx","AudioContext","webkitAudioContext","isSuspended","getOfflineContext","numOfChannels","OfflineCtx","OfflineAudioContext","webkitOfflineAudioContext","cloneBuffer","numChannels","cloned","reverseBuffer","fromValue","toValue","linear","exponentialRampToValueAtTime","minValue","maxValue","microphone","timeCode","delim","m","s","mn","sc","Sono","VERSION","utils","getSound","createGroup","soundGroup","soundContext","webAudio","loaderGroup","errorMessage","onError","onProgress","onComplete","err","createSound","destroySound","destroyAll","pauseAll","resumeAll","stopAll","pageHiddenPaused","title","info","hasWebAudio","args","apply"],"mappings":"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"} \ No newline at end of file diff --git a/dist/sono.min.js b/dist/sono.min.js index 14b85c9..c2dece8 100644 --- a/dist/sono.min.js +++ b/dist/sono.min.js @@ -1,2 +1,2 @@ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):e.sono=n()}(this,function(){"use strict";function e(e){if("string"!=typeof e)return"";if("data:"===e.slice(0,5)){var n=e.match(/data:audio\/(ogg|mp3|opus|wav|m4a)/i);if(n&&n.length>1)return n[1].toLowerCase()}e=e.split("?")[0],e=e.slice(e.lastIndexOf("/")+1);var t=e.split(".");return 1===t.length||""===t[0]&&2===t.length?"":t.pop().toLowerCase()}function n(n){var t=void 0;if(Array.isArray(n))for(var r=0;r-1)break}else"object"===("undefined"==typeof n?"undefined":J(n))&&Object.keys(n).some(function(r){t=n[r];var o=e(t);return ne.indexOf(o)>-1});return t||n}function t(e){return!!(e&&window.AudioBuffer&&e instanceof window.AudioBuffer)}function r(e){return!!(e&&window.ArrayBuffer&&e instanceof window.ArrayBuffer)}function o(e){return!!(e&&window.HTMLMediaElement&&e instanceof window.HTMLMediaElement)}function i(e){return!!(e&&"function"==typeof e.getAudioTracks&&e.getAudioTracks().length&&window.MediaStreamTrack&&e.getAudioTracks()[0]instanceof window.MediaStreamTrack)}function u(e){return!(!e||"string"!=typeof e||"sine"!==e&&"square"!==e&&"sawtooth"!==e&&"triangle"!==e)}function a(e){return!!(e&&"object"===("undefined"==typeof e?"undefined":J(e))&&e.bufferSize&&e.channels&&e.callback)}function c(e){return!(!e||"string"!=typeof e||!(e.indexOf(".")>-1||"data:"===e.slice(0,5)))}function s(e){if(!e||o(e))return!1;var n=e.src||e.url||e.data||e;return c(n)||r(n)||Array.isArray(n)&&c(n[0])}function f(e,n){function t(e){var n=12*(Math.log(e/440)/Math.log(2));return Math.round(n)+69}function r(e){return 440*Math.pow(2,(e-69)/12)}function o(e,n){return Math.floor(1200*Math.log(e/r(n))/Math.log(2))}function i(e,n){return!e||(a.fftSize!==c||(!!(n&&e instanceof Uint8Array)||!n&&e instanceof Float32Array))}function u(e,n){return e?new Float32Array(n):new Uint8Array(n)}n=n||{};var a=e.createAnalyser(),c=n.fftSize||512,s=!!n.float,f=!!n.float,l=void 0,d=void 0;a.fftSize=c,a.smoothingTimeConstant=n.smoothing||n.smoothingTimeConstant||a.smoothingTimeConstant,a.minDecibels=n.minDecibels||a.minDecibels,a.maxDecibels=n.maxDecibels||a.maxDecibels;var v=new Blob(["onmessage=function(e){var data=e.data;var f=new Float32Array(data.b);for(var i=0;i0.9)&&(correlation>lastCorrelation)){foundGoodCorrelation=true;if (correlation>best_correlation){best_correlation=correlation;best_offset=offset}}else if (foundGoodCorrelation){var shift=(correlations[best_offset+1]-correlations[best_offset-1])/correlations[best_offset];postMessage(sampleRate/(best_offset+(8*shift)))}lastCorrelation=correlation}if (best_correlation>0.01){postMessage(sampleRate/best_offset)}else{postMessage(-1)}}};"]),g=URL.createObjectURL(v),h=new Worker(g),m=URL.createObjectURL(p),y=new Worker(m),b=null,w=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],T=null,M={hertz:null,note:null,noteIndex:null,detuneCents:null,detune:null};return h.onmessage=function(e){b&&b(e.data)},y.onmessage=function(e){if(T){var n=e.data;if(n!==-1){var r=t(n),i=o(n,r);M.hertz=n,M.noteIndex=r%12,M.note=w[r%12],M.detuneCents=i,0===i?M.detune="":i<0?M.detune="flat":M.detune="sharp"}T(M)}},a.getWaveform=function(e){return arguments.length||(e=f),i(l,e)&&(c=a.fftSize,f=e,l=u(e,c)),e&&this.getFloatTimeDomainData?this.getFloatTimeDomainData(l):this.getByteTimeDomainData(l),l},a.getPitch=function(n){T=T||n;var t=new Float32Array(a.fftSize);t.set(a.getWaveform(!0)),y.postMessage({sampleRate:e.sampleRate,b:t.buffer},[t.buffer])},a.getFrequencies=function(e){return arguments.length||(e=s),i(d,e)&&(c=a.fftSize,s=e,d=u(e,a.frequencyBinCount)),e?this.getFloatFrequencyData(d):this.getByteFrequencyData(d),d},a.getAmplitude=function(e){b=b||e;var n=new Float32Array(a.fftSize);n.set(a.getFrequencies(!0)),h.postMessage({sum:0,length:n.byteLength,numSamples:a.fftSize/2,b:n.buffer},[n.buffer])},a.update=function(){a.getWaveform(),a.getFrequencies()},Object.defineProperties(a,{smoothing:{get:function(){return a.smoothingTimeConstant},set:function(e){a.smoothingTimeConstant=e}}}),a}function l(e,n){return arguments.length<2&&(n=0),"number"!=typeof e||isNaN(e)?n:e}function d(e,n){n=l(n,1);var t=e.createWaveShaper(),r=new Float32Array(ue);return t.update=function(e){if(n=e,n<=0)return n=0,void(this.curve=null);for(var t=100*e,o=Math.PI/180,i=void 0,u=0;u1&&(e=1),e<-1&&(e=-1),e*=c,t=e+s,t>s&&(t=Math.PI-t),r.x=Math.sin(e),r.z=Math.sin(t)),o(i,r)},i.setSourcePosition=function(e,n,t){o(i,u.get(e,n,t))},i.setSourceOrientation=function(e,n,t){r(i,u.get(e,n,t))},i.setListenerPosition=function(n,t,r){o(e.listener,u.get(n,t,r))},i.setListenerOrientation=function(n,t,o){r(e.listener,u.get(n,t,o))},i.getDefaults=function(){return b.defaults},i.setDefaults=function(e){Object.keys(e).forEach(function(n){b.defaults[n]=e[n]})},i}function w(e){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],t=l(n.stages,8),r=[],o=void 0,i=e.createGain(),u=e.createGain(),a=e.createOscillator(),c=e.createGain(),s=e.createGain();u.gain.value=l(n.feedback,.5),a.type="sine",a.frequency.value=l(n.frequency,.5),c.gain.value=l(n.gain,300);for(var f=0;f0&&r[f-1].connect(o),c.connect(o.frequency),r.push(o);var d=r[0],v=r[r.length-1];i.connect(d),i.connect(s),v.connect(s),v.connect(u),u.connect(d),a.connect(c),a.start(0);var p=i;return p.name="Phaser",p._output=s,Object.defineProperties(p,{lfoFrequency:{get:function(){return a.frequency.value},set:function(e){a.frequency.value=e}},lfoGain:{get:function(){return c.gain.value},set:function(e){c.gain.value=e}},feedback:{get:function(){return u.gain.value},set:function(e){u.gain.value=e}}}),p}function T(e,n){function t(e,n){for(var t=new Float32Array(n),r=0,o=0;o-1}function i(e){return e?o(e)?e:(X.push(e),r(),e):null}function u(e){if(!e)return null;if(!o(e))return e;for(var n=X.length,t=0;t1&&t===n?W:(t?u(e):i(e),W)}function c(){for(;X.length;)X.pop().disconnect();return r(),W}function s(){c(),e=null,H=null,X=[],Z&&Z.disconnect(),Z=null}function l(n){return i(new f(e,n))}function h(n){var t=e.createDynamicsCompressor();return t.update=function(e){t.threshold.value="undefined"!=typeof e.threshold?e.threshold:-24,t.knee.value="undefined"!=typeof e.knee?e.knee:30,t.ratio.value="undefined"!=typeof e.ratio?e.ratio:12,t.attack.value="undefined"!=typeof e.attack?e.attack:3e-4,t.release.value="undefined"!=typeof e.release?e.release:.25},t.update(n||{}),i(t)}function m(n){var t=e.createConvolver();return t.buffer=n,i(t)}function A(n){var t=e.createDelay();return"undefined"!=typeof n&&(t.delayTime.value=n),i(t)}function O(n){return i(new v(e,n))}function E(n){return i(new d(e,n))}function S(n,t,r,o){return i(new g(e,{type:n,frequency:t,q:r,gain:o}))}function x(e,n){return S("lowpass",{frequency:e,q:n})}function L(e,n){return S("highpass",{frequency:e,q:n})}function _(e,n){return S("bandpass",{frequency:e,q:n})}function C(e,n){return S("lowshelf",{frequency:e,q:0,gain:n})}function k(e,n){return S("highshelf",{frequency:e,q:0,gain:n})}function D(e,n,t){return S("peaking",{frequency:e,q:n,gain:t})}function P(e,n,t){return S("notch",{frequency:e,q:n,gain:t})}function R(e,n){return S("allpass",{frequency:e,q:n})}function q(n){return i(new y(e,n))}function F(n){var t=e.createGain();return"undefined"!=typeof n&&(t.gain.value=n),t}function z(){return i(new b(e))}function j(n){return i(new w(e,n))}function G(n){return i(new T(e,n))}function B(n,t,r){return i(new M(e,n,t,r))}function V(){var n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=n.bufferSize||1024,r="undefined"==typeof n.inputChannels?0:n.inputChannels,o="undefined"==typeof n.outputChannels?1:n.outputChannels,u=e.createScriptProcessor(t,r,o),a=n.thisArg||n.context||u,c=n.callback||function(){};return u.onaudioprocess=c.bind(a),i(u)}function N(e){return Z=e,r(),e}function I(e){return t(e),e}e=e||new p;var U=new b(e),W=null,H=void 0,X=[],Z=void 0;return W={context:e,nodeList:X,panning:U,has:o,add:i,remove:u,toggle:a,removeAll:c,destroy:s,setSource:N,setDestination:I,analyser:l,compressor:h,convolver:m,delay:A,echo:O,distortion:E,filter:S,lowpass:x,highpass:L,bandpass:_,lowshelf:C,highshelf:k,peaking:D,notch:P,allpass:R,flanger:q,gain:F,panner:z,phaser:j,recorder:G,reverb:B,script:V},Object.freeze(W)}function O(e,n){function t(e,n){var t=void 0;return e||0===e?(g.some(function(n){return(n===e||n.id===e)&&(t=n,!0)}),t&&n?n(t):t):t}function r(e){return t(e,function(e){return g.splice(g.indexOf(e),1)}),b}function o(e){return e.gain.disconnect(),e.gain.connect(m),g.push(e),e.once("destroy",r),b}function i(e,n){return g.forEach(function(t){return t.play(e,n)}),b}function u(){return g.forEach(function(e){e.playing&&e.pause()}),b}function a(){return g.forEach(function(e){e.paused&&e.play()}),b}function c(){return g.forEach(function(e){return e.stop()}),b}function s(e){return g.forEach(function(n){return n.seek(e)}),b}function f(){return y=b.volume,b.volume=0,b}function l(){return b.volume=y||1,b}function d(e){return b.volume=e,b}function v(n,t){if(e){var r=m.gain,o=e.currentTime;r.cancelScheduledValues(o),r.setValueAtTime(r.value,o),r.linearRampToValueAtTime(n,o+t)}else g.forEach(function(e){e.fade(n,t)});return b}function p(){for(;g.length;)g.pop().destroy()}var g=[],h=new A(e),m=h.gain(),y=1,b=null;return e&&(h.setSource(m),h.setDestination(n||e.destination)),b={add:o,find:t,remove:r,play:i,pause:u,resume:a,stop:c,seek:s,setVolume:d,mute:f,unMute:l,fade:v,destroy:p},Object.defineProperties(b,{effect:{value:h},gain:{value:m},sounds:{value:g},volume:{get:function(){return m.gain.value},set:function(n){isNaN(n)||(e?(m.gain.cancelScheduledValues(e.currentTime),m.gain.value=n,m.gain.setValueAtTime(n,e.currentTime)):m.gain.value=n,g.forEach(function(e){e.context||(e.groupVolume=n)}))}}}),b}function E(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function S(e){return"function"==typeof e}function x(e){return"number"==typeof e}function L(e){return"object"==typeof e&&null!==e}function _(e){return void 0===e}function C(e){function n(){g.off("error"),g.off("progress"),g.off("complete"),g.off("loaded"),T&&"function"==typeof T.removeEventListener&&(T.removeEventListener("canplaythrough",a),T.removeEventListener("error",o)),b&&(b.removeEventListener("progress",r),b.removeEventListener("load",u),b.removeEventListener("error",o))}function t(e){g.emit("progress",1),g.emit("loaded",e),g.emit("complete",e),n()}function r(e){e.lengthComputable&&(h=e.loaded/e.total,g.emit("progress",h))}function o(t){window.clearTimeout(w);var r=t;T&&T.error&&(r="Media Error: "+p[T.error.code]+" "+e),b&&(r="XHR Error: "+b.status+" "+b.statusText+" "+e),g.emit("error",r),n()}function i(e){m.decodeAudioData(e,function(e){T=e,b=null,h=1,t(e)},o)}function u(){i(b.response)}function a(){window.clearTimeout(w),T&&(h=1,t(T))}function c(){n(),b&&4!==b.readyState&&b.abort(),b=null,window.clearTimeout(w)}function s(){c(),b=null,T=null,m=null}function f(){return e instanceof window.ArrayBuffer?void i(e):(b=new XMLHttpRequest,b.open("GET",e,!0),b.responseType="arraybuffer",b.addEventListener("progress",r),b.addEventListener("load",u),b.addEventListener("error",o),void b.send())}function l(){T&&T.tagName||(T=document.createElement("audio")),y||(window.clearTimeout(w),w=window.setTimeout(a,2e3),T.addEventListener("canplaythrough",a,!1)),T.addEventListener("error",o,!1),T.preload="auto",T.src=e,T.load(),y&&t(T)}function d(){m?f():l()}function v(n){e=n,d()}var p=["","ABORTED","NETWORK","DECODE","SRC_NOT_SUPPORTED"],g=new se,h=0,m=void 0,y=void 0,b=void 0,w=void 0,T=void 0,M={on:g.on.bind(g),once:g.once.bind(g),off:g.off.bind(g),load:v,start:d,cancel:c,destroy:s};return Object.defineProperties(M,{data:{get:function(){return T}},progress:{get:function(){return h}},audioContext:{set:function(e){m=e}},isTouchLocked:{set:function(e){y=e}}}),Object.freeze(M)}function k(e,n,t){function r(){return!m&&n&&(m=n.createBufferSource(),m.buffer=e),m}function o(){if(m){m.onended=null;try{m.disconnect(),m.stop(0)}catch(e){}m=null}v=!1,p=0,h=!1,y=0}function i(){var e=n.currentTime-y;o(),p=e,h=!1,v=!0}function u(){o(),f=!0,"function"==typeof l&&l(s)}function a(e){var t=arguments.length<=1||void 0===arguments[1]?0:arguments[1];if(!h){for(e=e?n.currentTime+e:0,t&&(p=0),p&&(t=p);t>s.duration;)t%=s.duration;r(),m.onended=u,m.start(e,t),m.loop=d,m.playbackRate.value=g,y=n.currentTime-t,f=!1,v=!1,p=0,h=!0}}function c(){o(),e=null,n=null,l=null,m=null}var s={},f=!1,l=t,d=!1,v=!1,p=0,g=1,h=!1,m=null,y=0;return Object.defineProperties(s,{play:{value:a},pause:{value:i},stop:{value:o},destroy:{value:c},currentTime:{get:function(){if(p)return p;if(y){var e=n.currentTime-y;return e>s.duration&&(e%=s.duration),e}return 0}},duration:{get:function(){return e?e.duration:0}},ended:{get:function(){return f}},loop:{get:function(){return d},set:function(e){d=!!e,m&&(m.loop=d)}},paused:{get:function(){return v}},playbackRate:{get:function(){return g},set:function(e){g=e,m&&(m.playbackRate.value=g)}},playing:{get:function(){return h}},progress:{get:function(){return s.duration?s.currentTime/s.duration:0}},sourceNode:{get:function(){return r()}}}),Object.freeze(s)}function D(e,n,t){function r(){return!T&&n&&(T=n.createMediaElementSource(e)),T}function o(n){e.src=n,e.load(),v=!1,y=!1,w=!1}function i(){e.removeEventListener("canplaythrough",i),w&&e.play()}function u(){return m?(e.currentTime=0,e.currentTime>0&&e.load(),void e.play()):(v=!0,y=!1,w=!1,void("function"==typeof p&&p(d)))}function a(n,t){clearTimeout(g),e.volume=A*M,e.playbackRate=b,t&&(e.currentTime=t),n?g=setTimeout(a,n):e.play(),v=!1,y=!1,w=!0,e.removeEventListener("ended",u),e.addEventListener("ended",u,!1),e.readyState<1&&(e.removeEventListener("canplaythrough",i),e.addEventListener("canplaythrough",i,!1),e.load(),e.play())}function c(){clearTimeout(g),e&&(e.pause(),w=!1,y=!0)}function s(){if(clearTimeout(g),e){e.pause();try{e.currentTime=0,e.currentTime>0&&e.load()}catch(e){}w=!1,y=!1}}function f(e,t){function r(e,n){h=window.setTimeout(function(){return d.volume=d.volume+.2*(e-d.volume),Math.abs(d.volume-e)>.05?void r(e,n):void(d.volume=e)},1e3*n)}return n?d:(window.clearTimeout(h),r(e,t/10),d)}function l(){e.removeEventListener("ended",u),e.removeEventListener("canplaythrough",i),s(),e=null,n=null,p=null,T=null}var d={},v=!1,p=t,g=void 0,h=void 0,m=!1,y=!1,b=1,w=!1,T=null,M=1,A=1;return Object.defineProperties(d,{play:{value:a},pause:{value:c},stop:{value:s},load:{value:o},fade:{value:f},destroy:{value:l},currentTime:{get:function(){return e?e.currentTime:0}},duration:{get:function(){return e?e.duration:0}},ended:{get:function(){return v}},loop:{get:function(){return m},set:function(e){m=!!e}},paused:{get:function(){return y}},playbackRate:{get:function(){return b},set:function(n){b=n,e&&(e.playbackRate=b)}},playing:{get:function(){return w}},progress:{get:function(){return e&&e.duration?e.currentTime/e.duration:0}},sourceNode:{get:function(){return r()}},volume:{get:function(){return A},set:function(n){window.clearTimeout(h),A=n,e&&(e.volume=A*M)}},groupVolume:{get:function(){return M},set:function(n){M=n,e&&(e.volume=A*M)}}}),Object.freeze(d)}function P(e,n){function t(){return!l&&n&&(l=n.createMediaStreamSource(e),navigator.mozGetUserMedia&&(window.mozHack=l)),l}function r(e){e=e?n.currentTime+e:0,t(),l.start(e),d=n.currentTime-s,a=!1,f=!0,c=!1,s=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,s=0,f=!1,d=0}function i(){var e=n.currentTime-d;o(),s=e,f=!1,c=!0}function u(){o(),n=null,l=null,e=null,window.mozHack=null}var a=!1,c=!1,s=0,f=!1,l=null,d=0,v={play:r,pause:i,stop:o,destroy:u,duration:0,progress:0};return Object.defineProperties(v,{currentTime:{get:function(){return s?s:d?n.currentTime-d:0}},ended:{get:function(){return a}},paused:{get:function(){return c}},playing:{get:function(){return f}},sourceNode:{get:function(){return t()}}}),Object.freeze(v)}function R(e,n){function t(){return!l&&n&&(l=n.createOscillator(),l.type=e,l.frequency.value=v),l}function r(e){e=e||0,e&&(e=n.currentTime+e),t(),l.start(e),d=s?n.currentTime-s:n.currentTime,a=!1,f=!0,c=!1,s=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,s=0,f=!1,d=0}function i(){var e=n.currentTime-d;o(),s=e,f=!1,c=!0}function u(){o(),n=null,l=null}var a=!1,c=!1,s=0,f=!1,l=null,d=0,v=200,p=null;return p={play:r,pause:i,stop:o,destroy:u},Object.defineProperties(p,{currentTime:{get:function(){return s?s:d?n.currentTime-d:0}},duration:{value:0},ended:{get:function(){return a}},frequency:{get:function(){return v},set:function(e){v=e,l&&(l.frequency.value=e)}},paused:{get:function(){return c}},playing:{get:function(){return f}},progress:{value:0},sourceNode:{get:function(){return t()}}}),Object.freeze(p)}function q(e,n){function t(){return!g&&n&&(g=n.createScriptProcessor(c,0,s)),g}function r(){t(),g.onaudioprocess=l,h=n.currentTime-v,f=!1,d=!1,v=0,p=!0}function o(e){for(var n=e.outputBuffer,t=0;tn[d]&&(n[d]=g),g>s&&(s=g)}for(var h=1/s,m=0;m0&&y.lineTo(T,M),T=d+w,M=v+m-Math.round(m*k),M=Math.floor(Math.min(M,v+m-f/2)),"fill"===u?(y.moveTo(T,M),y.lineTo(T,v+m)):y.lineTo(T,M)}}y.stroke()}var u=e.style||"fill",a=e.shape||"linear",c=e.color||0,s=e.bgColor,f=e.lineWidth||1,l=e.percent||1,d=e.x||0,v=e.y||0,p=e.transform,g=e.canvas,h=e.width||g&&g.width,m=e.height||g&&g.height,y=null,b=void 0,w=void 0,T=void 0,M=void 0,A=void 0,O=void 0,E=void 0,S=void 0;return g||e.context||(g=document.createElement("canvas"),h=h||g.width,m=m||g.height,g.width=m,g.height=m),"circular"===a&&(A=e.radius||Math.min(m/2,h/2),O=e.innerRadius||A/2,E=d+h/2,S=v+m/2),y=e.context||g.getContext("2d"),i.canvas=g,(e.waveform||e.sound)&&i(),i}function V(){if(de)return de;var e=window.AudioContext||window.webkitAudioContext;de=e?new e:null;var n=de&&"suspended"===de.state;return n&&"function"==typeof de.resume&&window.setTimeout(function(){de.resume()},1e3),de}function N(e,n,t){if(ve)return ve;e=e||2,t=t||44100,n=t||e;var r=window.OfflineAudioContext||window.webkitOfflineAudioContext;return ve=r?new r(e,n,t):null}function I(e){if(!de)return e;for(var n=e.numberOfChannels,t=de.createBuffer(n,e.length,e.sampleRate),r=0;r-1){var t=["%c ♫ "+e+" ♫ %c "+n+" ","color: #FFFFFF; background: #379F7A","color: #1F1C0D; background: #E0FBAC"];console.log.apply(console,t)}else window.console&&window.console.log.call&&console.log.call(console,e+" "+n)}var y="0.1.8",b=pe.getContext(),w=b?b.destination:null,T=new O(b,w),M=null,A=!1;return A=K.handleTouchLock(b,function(){A=!1,T.sounds.forEach(function(e){return e.isTouchLocked=!1})}),function(){function e(){T.sounds.forEach(function(e){e.playing&&(e.pause(),t.push(e))})}function n(){for(;t.length;)t.pop().play()}var t=[];K.handlePageVisibility(e,n)}(),M={createSound:i,destroySound:u,destroyAll:a,getSound:e,createGroup:n,file:ie,load:o,mute:c,unMute:s,fade:f,pauseAll:l,resumeAll:d,stopAll:v,play:p,pause:g,stop:h,log:m,canPlay:ie.canPlay,context:b,getOfflineContext:pe.getOfflineContext,effect:T.effect,extensions:ie.extensions,hasWebAudio:!!b,isSupported:ie.extensions.length>0,gain:T.gain,utils:pe,VERSION:y,Sound:z,Group:O},Object.defineProperties(M,{isTouchLocked:{get:function(){return A}},sounds:{get:function(){return T.sounds.slice(0)}},volume:{get:function(){return T.volume},set:function(e){T.volume=e}}}),Object.freeze(M)}var K={};K.handlePageVisibility=function(e,n){function t(){document[r]?e():n()}var r=void 0,o=void 0;"undefined"!=typeof document.hidden?(r="hidden",o="visibilitychange"):"undefined"!=typeof document.mozHidden?(r="mozHidden",o="mozvisibilitychange"):"undefined"!=typeof document.msHidden?(r="msHidden",o="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(r="webkitHidden",o="webkitvisibilitychange"),"undefined"!=typeof o&&document.addEventListener(o,t,!1)},K.handleTouchLock=function(e,n){function t(){e&&"suspended"===e.state?e.resume().then(function(){var r=e.createBuffer(1,1,22050),o=e.createBufferSource();o.buffer=r,o.connect(e.destination),o.start(0),o.stop(0),o.disconnect(),document.body.removeEventListener("touchend",t),n()}):(document.body.removeEventListener("touchend",t),n())}var r=navigator.userAgent,o=!!r.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|SymbianOS/i);return o&&document.body.addEventListener("touchend",t,!1),o};var J="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},Y=function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")},$=function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(e,n):e.__proto__=n)},ee=function(e,n){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?e:n},ne=[],te={},re=[{ext:"ogg",type:'audio/ogg; codecs="vorbis"'},{ext:"mp3",type:"audio/mpeg;"},{ext:"opus",type:'audio/ogg; codecs="opus"'},{ext:"wav",type:'audio/wav; codecs="1"'},{ext:"m4a",type:"audio/x-m4a;"},{ext:"m4a",type:"audio/aac;"}],oe=document.createElement("audio");oe&&(re.forEach(function(e){var n=!!oe.canPlayType(e.type);n&&ne.indexOf(e.ext)===-1&&ne.push(e.ext),te[e.ext]=n}),oe=null);var ie={canPlay:te,containsURL:s,extensions:ne,getFileExtension:e,getSupportedFile:n,isAudioBuffer:t,isMediaElement:o,isMediaStream:i,isOscillatorType:u,isScriptConfig:a,isURL:c},ue=22050;b.defaults={panningModel:"HRTF",distanceModel:"linear",refDistance:1,maxDistance:1e3,rolloffFactor:1,coneInnerAngle:360,coneOuterAngle:0,coneOuterGain:0},O.Effect=A;var ae=E;E.EventEmitter=E,E.prototype._events=void 0,E.prototype._maxListeners=void 0,E.defaultMaxListeners=10,E.prototype.setMaxListeners=function(e){if(!x(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},E.prototype.emit=function(e){var n,t,r,o,i,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||L(this._events.error)&&!this._events.error.length)){if(n=arguments[1],n instanceof Error)throw n;var a=new Error('Uncaught, unspecified "error" event. ('+n+")");throw a.context=n,a}if(t=this._events[e],_(t))return!1;if(S(t))switch(arguments.length){case 1:t.call(this);break;case 2:t.call(this,arguments[1]);break;case 3:t.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),t.apply(this,o)}else if(L(t))for(o=Array.prototype.slice.call(arguments,1),u=t.slice(),r=u.length,i=0;i0&&this._events[e].length>t&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},E.prototype.on=E.prototype.addListener,E.prototype.once=function(e,n){function t(){this.removeListener(e,t),r||(r=!0,n.apply(this,arguments))}if(!S(n))throw TypeError("listener must be a function");var r=!1;return t.listener=n,this.on(e,t),this},E.prototype.removeListener=function(e,n){var t,r,o,i;if(!S(n))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(t=this._events[e],o=t.length,r=-1,t===n||S(t.listener)&&t.listener===n)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,n);else if(L(t)){for(i=o;i-- >0;)if(t[i]===n||t[i].listener&&t[i].listener===n){r=i;break}if(r<0)return this;1===t.length?(t.length=0,delete this._events[e]):t.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,n)}return this},E.prototype.removeAllListeners=function(e){var n,t;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(n in this._events)"removeListener"!==n&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events={},this}if(t=this._events[e],S(t))this.removeListener(e,t);else if(t)for(;t.length;)this.removeListener(e,t[t.length-1]);return delete this._events[e],this},E.prototype.listeners=function(e){var n;return n=this._events&&this._events[e]?S(this._events[e])?[this._events[e]]:this._events[e].slice():[]},E.prototype.listenerCount=function(e){if(this._events){var n=this._events[e];if(S(n))return 1;if(n)return n.length}return 0},E.listenerCount=function(e,n){return e.listenerCount(n)};var ce=ae.EventEmitter,se=function(e){function n(){return Y(this,n),ee(this,e.call(this))}return $(n,e),n.prototype.off=function(e,n){return n?this.removeListener(e,n):e?this.removeAllListeners(e):this.removeAllListeners()},n}(ce);C.Group=function(){function e(e){var n=s+e;a.emit("progress",n/f)}function n(){s++,o(),a.emit("progress",s/f),r()}function t(e){console.error.call(console,e),o(),a.emit("error",e),r()}function r(){return 0===c.length?(l=null,void a.emit("complete")):(l=c.pop(),l.on("progress",e),l.once("loaded",n),l.once("error",t),void l.start())}function o(){l.off("progress",e),l.off("loaded",n),l.off("error",t)}function i(e){return c.push(e),f++,e}function u(){f=c.length,r()}var a=new se,c=[],s=0,f=0,l=void 0;return Object.freeze({on:a.on.bind(a),once:a.once.bind(a),off:a.off.bind(a),add:i,start:u})},z.__source={BufferSource:k,MediaSource:D,MicrophoneSource:P,OscillatorSource:R,ScriptSource:q};var fe=Math.PI/2,le=2*Math.PI,de=void 0,ve=void 0,pe=Object.freeze({getContext:V,getOfflineContext:N,cloneBuffer:I,reverseBuffer:U,ramp:W,getFrequency:H,microphone:X,timeCode:Z,waveformer:B}),ge=new Q;return ge}); +return"function"==typeof p?p(e,n,t):e}function o(n,t){return n&&"function"==typeof n.waveform?n.waveform(t):n?n:e.waveform?e.waveform:e.sound?e.sound.waveform(t):null}function i(e){if(n(),"circular"===a){var i=o(e,360),c=Math.floor(i.length*l),s=le/c,p=void 0,g=void 0,b=void 0,x=void 0;for(w=0;w0&&y.lineTo(T,M),T=d+w,M=v+m-Math.round(m*k),M=Math.floor(Math.min(M,v+m-f/2)),"fill"===u?(y.moveTo(T,M),y.lineTo(T,v+m)):y.lineTo(T,M)}}y.stroke()}var u=e.style||"fill",a=e.shape||"linear",c=e.color||0,s=e.bgColor,f=e.lineWidth||1,l=e.percent||1,d=e.x||0,v=e.y||0,p=e.transform,g=e.canvas,h=e.width||g&&g.width,m=e.height||g&&g.height,y=null,b=void 0,w=void 0,T=void 0,M=void 0,A=void 0,O=void 0,E=void 0,S=void 0;return g||e.context||(g=document.createElement("canvas"),h=h||g.width,m=m||g.height,g.width=m,g.height=m),"circular"===a&&(A=e.radius||Math.min(m/2,h/2),O=e.innerRadius||A/2,E=d+h/2,S=v+m/2),y=e.context||g.getContext("2d"),i.canvas=g,(e.waveform||e.sound)&&i(),i}function V(){if(de)return de;var e=window.AudioContext||window.webkitAudioContext;de=e?new e:null;var n=de&&"suspended"===de.state;return n&&"function"==typeof de.resume&&window.setTimeout(function(){de.resume()},1e3),de}function N(e,n,t){if(ve)return ve;e=e||2,t=t||44100,n=t||e;var r=window.OfflineAudioContext||window.webkitOfflineAudioContext;return ve=r?new r(e,n,t):null}function I(e){if(!de)return e;for(var n=e.numberOfChannels,t=de.createBuffer(n,e.length,e.sampleRate),r=0;r-1){var t=["%c ♫ "+e+" ♫ %c "+n+" ","color: #FFFFFF; background: #379F7A","color: #1F1C0D; background: #E0FBAC"];console.log.apply(console,t)}else window.console&&window.console.log.call&&console.log.call(console,e+" "+n)}var y="0.1.81",b=pe.getContext(),w=b?b.destination:null,T=new O(b,w),M=null,A=!1;return A=K.handleTouchLock(b,function(){A=!1,T.sounds.forEach(function(e){return e.isTouchLocked=!1})}),function(){function e(){T.sounds.forEach(function(e){e.playing&&(e.pause(),t.push(e))})}function n(){for(;t.length;)t.pop().play()}var t=[];K.handlePageVisibility(e,n)}(),M={createSound:i,destroySound:u,destroyAll:a,getSound:e,createGroup:n,file:ie,load:o,mute:c,unMute:s,fade:f,pauseAll:l,resumeAll:d,stopAll:v,play:p,pause:g,stop:h,log:m,canPlay:ie.canPlay,context:b,getOfflineContext:pe.getOfflineContext,effect:T.effect,extensions:ie.extensions,hasWebAudio:!!b,isSupported:ie.extensions.length>0,gain:T.gain,utils:pe,VERSION:y,Sound:z,Group:O},Object.defineProperties(M,{isTouchLocked:{get:function(){return A}},sounds:{get:function(){return T.sounds.slice(0)}},volume:{get:function(){return T.volume},set:function(e){T.volume=e}}}),Object.freeze(M)}var K={};K.handlePageVisibility=function(e,n){function t(){document[r]?e():n()}var r=void 0,o=void 0;"undefined"!=typeof document.hidden?(r="hidden",o="visibilitychange"):"undefined"!=typeof document.mozHidden?(r="mozHidden",o="mozvisibilitychange"):"undefined"!=typeof document.msHidden?(r="msHidden",o="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(r="webkitHidden",o="webkitvisibilitychange"),"undefined"!=typeof o&&document.addEventListener(o,t,!1)},K.handleTouchLock=function(e,n){function t(){e&&"suspended"===e.state?e.resume().then(function(){var r=e.createBuffer(1,1,44100),o=e.createBufferSource();o.buffer=r,o.connect(e.destination),o.start(0),o.stop(0),o.disconnect(),document.body.removeEventListener("touchend",t),n()}):(document.body.removeEventListener("touchend",t),n())}var r=navigator.userAgent,o=!!r.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Windows Phone|SymbianOS/i);return o&&document.body.addEventListener("touchend",t,!1),o};var J="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},Y=function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")},$=function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(e,n):e.__proto__=n)},ee=function(e,n){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?e:n},ne=[],te={},re=[{ext:"ogg",type:'audio/ogg; codecs="vorbis"'},{ext:"mp3",type:"audio/mpeg;"},{ext:"opus",type:'audio/ogg; codecs="opus"'},{ext:"wav",type:'audio/wav; codecs="1"'},{ext:"m4a",type:"audio/x-m4a;"},{ext:"m4a",type:"audio/aac;"}],oe=document.createElement("audio");oe&&(re.forEach(function(e){var n=!!oe.canPlayType(e.type);n&&ne.indexOf(e.ext)===-1&&ne.push(e.ext),te[e.ext]=n}),oe=null);var ie={canPlay:te,containsURL:s,extensions:ne,getFileExtension:e,getSupportedFile:n,isAudioBuffer:t,isMediaElement:o,isMediaStream:i,isOscillatorType:u,isScriptConfig:a,isURL:c},ue=22050;b.defaults={panningModel:"HRTF",distanceModel:"linear",refDistance:1,maxDistance:1e3,rolloffFactor:1,coneInnerAngle:360,coneOuterAngle:0,coneOuterGain:0},O.Effect=A;var ae=E;E.EventEmitter=E,E.prototype._events=void 0,E.prototype._maxListeners=void 0,E.defaultMaxListeners=10,E.prototype.setMaxListeners=function(e){if(!x(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},E.prototype.emit=function(e){var n,t,r,o,i,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||L(this._events.error)&&!this._events.error.length)){if(n=arguments[1],n instanceof Error)throw n;var a=new Error('Uncaught, unspecified "error" event. ('+n+")");throw a.context=n,a}if(t=this._events[e],_(t))return!1;if(S(t))switch(arguments.length){case 1:t.call(this);break;case 2:t.call(this,arguments[1]);break;case 3:t.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),t.apply(this,o)}else if(L(t))for(o=Array.prototype.slice.call(arguments,1),u=t.slice(),r=u.length,i=0;i0&&this._events[e].length>t&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},E.prototype.on=E.prototype.addListener,E.prototype.once=function(e,n){function t(){this.removeListener(e,t),r||(r=!0,n.apply(this,arguments))}if(!S(n))throw TypeError("listener must be a function");var r=!1;return t.listener=n,this.on(e,t),this},E.prototype.removeListener=function(e,n){var t,r,o,i;if(!S(n))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(t=this._events[e],o=t.length,r=-1,t===n||S(t.listener)&&t.listener===n)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,n);else if(L(t)){for(i=o;i-- >0;)if(t[i]===n||t[i].listener&&t[i].listener===n){r=i;break}if(r<0)return this;1===t.length?(t.length=0,delete this._events[e]):t.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,n)}return this},E.prototype.removeAllListeners=function(e){var n,t;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(n in this._events)"removeListener"!==n&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events={},this}if(t=this._events[e],S(t))this.removeListener(e,t);else if(t)for(;t.length;)this.removeListener(e,t[t.length-1]);return delete this._events[e],this},E.prototype.listeners=function(e){var n;return n=this._events&&this._events[e]?S(this._events[e])?[this._events[e]]:this._events[e].slice():[]},E.prototype.listenerCount=function(e){if(this._events){var n=this._events[e];if(S(n))return 1;if(n)return n.length}return 0},E.listenerCount=function(e,n){return e.listenerCount(n)};var ce=ae.EventEmitter,se=function(e){function n(){return Y(this,n),ee(this,e.call(this))}return $(n,e),n.prototype.off=function(e,n){return n?this.removeListener(e,n):e?this.removeAllListeners(e):this.removeAllListeners()},n}(ce);C.Group=function(){function e(e){var n=s+e;a.emit("progress",n/f)}function n(){s++,o(),a.emit("progress",s/f),r()}function t(e){console.error.call(console,e),o(),a.emit("error",e),r()}function r(){return 0===c.length?(l=null,void a.emit("complete")):(l=c.pop(),l.on("progress",e),l.once("loaded",n),l.once("error",t),void l.start())}function o(){l.off("progress",e),l.off("loaded",n),l.off("error",t)}function i(e){return c.push(e),f++,e}function u(){f=c.length,r()}var a=new se,c=[],s=0,f=0,l=void 0;return Object.freeze({on:a.on.bind(a),once:a.once.bind(a),off:a.off.bind(a),add:i,start:u})},z.__source={BufferSource:k,MediaSource:D,MicrophoneSource:P,OscillatorSource:R,ScriptSource:q};var fe=Math.PI/2,le=2*Math.PI,de=void 0,ve=void 0,pe=Object.freeze({getContext:V,getOfflineContext:N,cloneBuffer:I,reverseBuffer:U,ramp:W,getFrequency:H,microphone:X,timeCode:Z,waveformer:B}),ge=new Q;return ge}); diff --git a/package.json b/package.json index 71305a0..62089ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sono", - "version": "0.1.8", + "version": "0.1.81", "description": "A simple yet powerful JavaScript library for working with Web Audio", "keywords": [ "WebAudio", diff --git a/src/sono.js b/src/sono.js index 5db0dcd..1a6d809 100644 --- a/src/sono.js +++ b/src/sono.js @@ -7,7 +7,7 @@ import SoundGroup from './lib/utils/sound-group'; import utils from './lib/utils/utils'; function Sono() { - const VERSION = '0.1.8'; + const VERSION = '0.1.81'; const context = utils.getContext(); const destination = (context ? context.destination : null); const group = new Group(context, destination);