diff --git a/.eslintrc b/.eslintrc index 0b7c96b..c013e80 100644 --- a/.eslintrc +++ b/.eslintrc @@ -91,7 +91,7 @@ "no-underscore-dangle": 0, "no-unused-expressions": 0, "no-unused-vars": [2, {"vars": "all", "args": "after-used"}], - "no-use-before-define": 2, + "no-use-before-define": 0, "no-useless-concat": 2, "no-var": 2, "no-with": 2, diff --git a/.travis.yml b/.travis.yml index db5b40a..f58a029 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ node_js: addons: firefox: "latest" before_install: - - 'npm install -g karma-cli' + - 'npm i -g karma-cli && npm i -g eslint && npm i -g babel-eslint' before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start diff --git a/README.md b/README.md index abe31a6..a8fb9e1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # sono -[![NPM version](https://badge.fury.io/js/sono.svg)](http://badge.fury.io/js/sono) [![Build Status](https://travis-ci.org/Stinkdigital/sono.svg?branch=master)](https://travis-ci.org/Stinkdigital/sono) +[![NPM version](https://badge.fury.io/js/sono.svg)](http://badge.fury.io/js/sono) [![Build Status](https://travis-ci.org/Stinkstudios/sono.svg?branch=master)](https://travis-ci.org/Stinkstudios/sono) A simple yet powerful JavaScript library for working with Web Audio diff --git a/dist/sono.js b/dist/sono.js index 6096ecd..d2d79a9 100644 --- a/dist/sono.js +++ b/dist/sono.js @@ -2702,6 +2702,221 @@ function BufferSource(buffer, context, onEnded) { return Object.freeze(api); } +function AudioSource(Type, data, context, onEnded) { + var sourceNode = context ? context.createGain() : null; + var api = {}; + var pool = []; + var sources = []; + var numCreated = 0; + var multiPlay = false; + + function createSourceNode() { + return sourceNode; + } + + function disposeSource(src) { + src.stop(); + if (multiPlay) { + pool.push(src); + } + } + + function onSourceEnded(src) { + if (sources.length > 1) { + var index = sources.indexOf(src); + sources.splice(index, 1); + } + disposeSource(src); + onEnded(); + } + + function getSource() { + if (!multiPlay && sources.length) { + return sources[0]; + } + if (pool.length > 0) { + return pool.pop(); + } else { + numCreated++; + if (data.tagName) { + return new Type(data.cloneNode(), context, onSourceEnded); + } + return new Type(data, context, onSourceEnded); + } + } + + function play() { + var src = getSource(); + if (sourceNode) { + src.sourceNode.connect(sourceNode); + } + if (src !== sources[0]) { + sources.push(src); + } + src.play(); + } + + function stop() { + while (sources.length > 1) { + disposeSource(sources.pop()); + } + } + + function pause() { + sources.forEach(function (src) { + return src.pause(); + }); + } + + function load(url) { + stop(); + pool.length = 0; + if (sources.length) { + sources[0].load(url); + } + } + + function fade(volume, duration) { + sources.forEach(function (src) { + return src.fade(volume, duration); + }); + } + + function destroy() { + while (sources.length) { + sources.pop().destroy(); + } + while (pool.length) { + pool.pop().destroy(); + } + sourceNode.disconnect(); + } + + /* + * Getters & Setters + */ + + Object.defineProperties(api, { + play: { + value: play + }, + pause: { + value: pause + }, + stop: { + value: stop + }, + load: { + value: load + }, + fade: { + value: fade + }, + destroy: { + value: destroy + }, + currentTime: { + get: function get() { + return sources[0] && sources[0].currentTime || 0; + } + }, + duration: { + get: function get() { + return sources[0] && sources[0].duration || 0; + } + }, + ended: { + get: function get() { + return sources.every(function (src) { + return src.ended; + }); + } + }, + multiPlay: { + get: function get() { + return multiPlay; + }, + set: function set(value) { + multiPlay = value; + } + }, + loop: { + get: function get() { + return sources[0] && sources[0].loop; + }, + set: function set(value) { + sources.forEach(function (src) { + return src.loop = !!value; + }); + } + }, + paused: { + get: function get() { + return sources[0] && sources[0].paused; + } + }, + playbackRate: { + get: function get() { + return sources[0] && sources[0].playbackRate; + }, + set: function set(value) { + sources.forEach(function (src) { + return src.playbackRate = value; + }); + } + }, + playing: { + get: function get() { + return sources[0] && sources[0].playing; + } + }, + info: { + get: function get() { + return { + pooled: pool.length, + active: sources.length, + created: numCreated + }; + } + }, + progress: { + get: function get() { + return sources[0] && sources[0].progress; + } + }, + sourceNode: { + get: function get() { + return createSourceNode(); + } + }, + volume: { + get: function get() { + return sources[0] && sources[0].volume; + }, + set: function set(value) { + sources.forEach(function (src) { + return src.volume = value; + }); + } + }, + groupVolume: { + get: function get() { + return sources[0] && sources[0].groupVolume; + }, + set: function set(value) { + if (sources[0] && !sources[0].hasOwnProperty('groupVolume')) { + return; + } + sources.forEach(function (src) { + return src.groupVolume = value; + }); + } + } + }); + + return Object.freeze(api); +} + function MediaSource(el, context, onEnded) { var api = {}; var ended = false, @@ -3476,17 +3691,18 @@ function Sound(config) { * Create source */ + function onEnded() { + sound.emit('ended', sound); + } + function createSource(value) { data = value; - if (file.isAudioBuffer(data)) { - source = new BufferSource(data, context, function () { - return sound.emit('ended', sound); - }); - } else if (file.isMediaElement(data)) { - source = new MediaSource(data, context, function () { - return sound.emit('ended', sound); - }); + var isAudioBuffer = file.isAudioBuffer(data); + if (isAudioBuffer || file.isMediaElement(data)) { + var Fn = isAudioBuffer ? BufferSource : MediaSource; + source = new AudioSource(Fn, data, context, onEnded); + source.multiPlay = !!config.multiPlay; } else if (file.isMediaStream(data)) { source = new MicrophoneSource(data, context); } else if (file.isOscillatorType(data && data.type || data)) { @@ -3788,6 +4004,15 @@ function Sound(config) { } } }, + multiPlay: { + get: function get() { + return config.multiPlay; + }, + set: function set(value) { + config.multiPlay = value; + source.multiPlay = value; + } + }, config: { get: function get() { return config; @@ -3819,6 +4044,11 @@ function Sound(config) { return source ? source.progress : 0; } }, + sourceInfo: { + get: function get() { + return source && source.info ? source.info : {}; + } + }, sourceNode: { get: function get() { return source ? source.sourceNode : null; diff --git a/dist/sono.js.map b/dist/sono.js.map index 424fbb1..5eaaeca 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, 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((sound) => {\n if (sound.playing) {\n sound.pause();\n }\n });\n return group;\n }\n\n function resume() {\n sounds.forEach((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((sound) => sound.fade(volume, duration));\n }\n\n return group;\n }\n\n /*\n * Load\n */\n\n function load() {\n sounds.forEach((sound) => sound.load(null, true));\n }\n\n /*\n * Unload\n */\n\n function unload() {\n sounds.forEach((sound) => sound.unload());\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 load,\n unload,\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 value = Math.min(Math.max(value, 0), 1);\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((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, deferLoad) {\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(force = false) {\n if (deferLoad && !force) {\n return;\n }\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(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 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(config) {\n let context = config.context;\n let destination = config.destination;\n let effect = new Effect(context);\n let gain = effect.gain();\n let wave = waveform();\n\n let id = null;\n let data = null;\n let isTouchLocked = false;\n let loader = null;\n let loop = false;\n let playbackRate = 1;\n let playWhenReady = null;\n let source = null;\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 onLoad(fileData) {\n createSource(fileData);\n sound.emit('loaded', sound);\n }\n\n function onLoadError(err) {\n sound.emit('error', sound, err);\n }\n\n function load(newConfig = null, force = false) {\n const skipLoad = !force && !source && !!config.deferLoad;\n\n if (newConfig) {\n const src = file.getSupportedFile(config.src || config.url || config.data || config) || config.src;\n config = Object.assign(config, newConfig, {src});\n }\n\n if (source && data && data.tagName) {\n source.load(config.src);\n } else {\n loader = loader || new Loader(config.src, skipLoad);\n loader.audioContext = !!config.asMediaElement ? null : context;\n loader.isTouchLocked = isTouchLocked;\n loader.off('loaded', onLoad);\n loader.once('loaded', onLoad);\n loader.off('error', onLoadError);\n loader.on('error', onLoadError);\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 if (!!config.deferLoad) {\n if (!loader) {\n load(null, true);\n }\n loader.start(true);\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 sound.emit('fade', sound, volume);\n\n return sound;\n }\n\n function unload() {\n source && source.destroy();\n loader && loader.destroy();\n data = null;\n playWhenReady = null;\n source = null;\n loader = null;\n config.deferLoad = true;\n sound.emit('unload', sound);\n }\n\n function reload() {\n load(null, true);\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.off('loaded');\n loader && loader.off('error');\n loader && loader.destroy();\n sound.off('loaded');\n sound.off('ended');\n sound.off('error');\n gain = null;\n context = null;\n destination = null;\n data = null;\n playWhenReady = null;\n source = null;\n effect = null;\n loader = null;\n wave = null;\n config = 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 unload: {\n value: unload\n },\n reload: {\n value: reload\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 config: {\n get: function() {\n return config;\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 value = Math.min(Math.max(value, 0), 1);\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 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\tif (ctx) {\n\t\treturn ctx;\n\t}\n\n\tconst desiredSampleRate = 44100;\n\n\tconst Ctx = window.AudioContext || window.webkitAudioContext;\n\n\tctx = (Ctx ? new Ctx() : null);\n\n\t// Check if hack is necessary. Only occurs in iOS6+ devices\n\t// and only when you first boot the iPhone, or play a audio/video\n\t// with a different sample rate\n\t// https://github.com/Jam3/ios-safe-audio-context/blob/master/index.js\n\tif (/(iPhone|iPad)/i.test(navigator.userAgent) &&\n\t\tctx.sampleRate !== desiredSampleRate) {\n\t\tconst buffer = ctx.createBuffer(1, 1, desiredSampleRate);\n\t\tconst dummy = ctx.createBufferSource();\n\t\tdummy.buffer = buffer;\n\t\tdummy.connect(ctx.destination);\n\t\tdummy.start(0);\n\t\tdummy.disconnect();\n\n\t\tctx.close() // dispose old context\n\t\tctx = (Ctx ? new Ctx() : null);\n\t}\n\n\t// Handles bug in Safari 9 OSX where AudioContext instance starts in 'suspended' state\n\n\tconst isSuspended = ctx && ctx.state === 'suspended';\n\n\tif (isSuspended && typeof ctx.resume === 'function') {\n\t\twindow.setTimeout(function() {\n\t\t\tctx.resume();\n\t\t}, 1000);\n\t}\n\n\treturn 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\tif (offlineCtx) {\n\t\treturn offlineCtx;\n\t}\n\tnumOfChannels = numOfChannels || 2;\n\tsampleRate = sampleRate || 44100;\n\tlength = sampleRate || numOfChannels;\n\n\tconst OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\n\tofflineCtx = (OfflineCtx ? new OfflineCtx(numOfChannels, length, sampleRate) : null);\n\n\treturn offlineCtx;\n}\n\n\n/*\n * clone audio buffer\n */\n\nfunction cloneBuffer(buffer) {\n\tif (!ctx) {\n\t\treturn buffer;\n\t}\n\n\tconst numChannels = buffer.numberOfChannels,\n\t\tcloned = ctx.createBuffer(numChannels, buffer.length, buffer.sampleRate);\n\tfor (let i = 0; i < numChannels; i++) {\n\t\tcloned.getChannelData(i)\n\t\t\t.set(buffer.getChannelData(i));\n\t}\n\treturn cloned;\n}\n\n/*\n * reverse audio buffer\n */\n\nfunction reverseBuffer(buffer) {\n\tconst numChannels = buffer.numberOfChannels;\n\tfor (let i = 0; i < numChannels; i++) {\n\t\tArray.prototype.reverse.call(buffer.getChannelData(i));\n\t}\n\treturn buffer;\n}\n\n/*\n * ramp audio param\n */\n\nfunction ramp(param, fromValue, toValue, duration, linear) {\n\tif (!ctx) {\n\t\treturn;\n\t}\n\n\tparam.setValueAtTime(fromValue, ctx.currentTime);\n\n\tif (linear) {\n\t\tparam.linearRampToValueAtTime(toValue, ctx.currentTime + duration);\n\t} else {\n\t\tparam.exponentialRampToValueAtTime(toValue, ctx.currentTime + duration);\n\t}\n}\n\n/*\n * get frequency from min to max by passing 0 to 1\n */\n\nfunction getFrequency(value) {\n\tif (!ctx) {\n\t\treturn 0;\n\t}\n\t// get frequency by passing number from 0 to 1\n\t// Clamp the frequency between the minimum value (40 Hz) and half of the\n\t// sampling rate.\n\tconst minValue = 40;\n\tconst maxValue = ctx.sampleRate / 2;\n\t// Logarithm (base 2) to compute how many octaves fall in the range.\n\tconst numberOfOctaves = Math.log(maxValue / minValue) / Math.LN2;\n\t// Compute a multiplier from 0 to 1 based on an exponential scale.\n\tconst multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n\t// Get back to the frequency value between min and max.\n\treturn maxValue * multiplier;\n}\n\n/*\n * microphone util\n */\n\nfunction microphone(connected, denied, error) {\n\treturn new Microphone(connected, denied, error);\n}\n\n/*\n * Format seconds as timecode string\n */\n\nfunction timeCode(seconds, delim = ':') {\n\t// const h = Math.floor(seconds / 3600);\n\t// const m = Math.floor((seconds % 3600) / 60);\n\tconst m = Math.floor(seconds / 60);\n\tconst s = Math.floor((seconds % 3600) % 60);\n\t// const hr = (h < 10 ? '0' + h + delim : h + delim);\n\tconst mn = (m < 10 ? '0' + m : m) + delim;\n\tconst sc = (s < 10 ? '0' + s : s);\n\t// return hr + mn + sc;\n\treturn mn + sc;\n}\n\nexport default Object.freeze({\n\tgetContext,\n\tgetOfflineContext,\n\tcloneBuffer,\n\treverseBuffer,\n\tramp,\n\tgetFrequency,\n\tmicrophone,\n\ttimeCode,\n\twaveformer\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.85';\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 const src = file.getSupportedFile(config.src || config.url || config.data || config);\n const sound = new Sound(Object.assign({}, config || {}, {\n src,\n context: soundContext,\n destination: group.gain\n }));\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).load();\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('[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 create: 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","load","unload","min","max","groupVolume","EventEmitter","events","Emitter","off","removeListener","removeAllListeners","Loader","deferLoad","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","newUrl","on","queue","numLoaded","numTotal","currentLoader","completeHandler","next","loader","BufferSource","onEnded","ended","endedCallback","loop","pausedAt","playbackRate","createSourceNode","onended","elapsed","endedHandler","MediaSource","delayTimeout","fadeTimeout","createMediaElementSource","toVolume","ramp","step","MicrophoneSource","stream","createMediaStreamSource","mozGetUserMedia","mozHack","OscillatorSource","ScriptSource","onProcess","onPaused","numberOfChannels","channel","j","wave","audioBuffer","sameBuffer","sameLength","chunk","resolution","greatest","incr","scale","Sound","playWhenReady","createSource","file","Error","onLoad","fileData","onLoadError","err","newConfig","skipLoad","assign","asMediaElement","hasOwnProperty","reload","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","getContext","clear","fillStyle","fillRect","clearRect","strokeStyle","beginPath","updateColor","position","newColor","stroke","getValue","angle","magnitude","sine","cosine","cos","moveTo","lineTo","closePath","offlineCtx","desiredSampleRate","Ctx","AudioContext","webkitAudioContext","dummy","close","isSuspended","getOfflineContext","numOfChannels","OfflineCtx","OfflineAudioContext","webkitOfflineAudioContext","cloneBuffer","numChannels","cloned","reverseBuffer","call","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","createSound","destroySound","destroyAll","pauseAll","resumeAll","stopAll","pageHiddenPaused","title","info","hasWebAudio","args","apply","console"],"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/audio-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((sound) => {\n if (sound.playing) {\n sound.pause();\n }\n });\n return group;\n }\n\n function resume() {\n sounds.forEach((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((sound) => sound.fade(volume, duration));\n }\n\n return group;\n }\n\n /*\n * Load\n */\n\n function load() {\n sounds.forEach((sound) => sound.load(null, true));\n }\n\n /*\n * Unload\n */\n\n function unload() {\n sounds.forEach((sound) => sound.unload());\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 load,\n unload,\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 value = Math.min(Math.max(value, 0), 1);\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((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, deferLoad) {\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(force = false) {\n if (deferLoad && !force) {\n return;\n }\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(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 AudioSource(Type, data, context, onEnded) {\n const sourceNode = context ? context.createGain() : null;\n const api = {};\n const pool = [];\n const sources = [];\n let numCreated = 0;\n let multiPlay = false;\n\n function createSourceNode() {\n return sourceNode;\n }\n\n function disposeSource(src) {\n src.stop();\n if (multiPlay) {\n pool.push(src);\n }\n }\n\n function onSourceEnded(src) {\n if (sources.length > 1) {\n const index = sources.indexOf(src);\n sources.splice(index, 1);\n }\n disposeSource(src);\n onEnded();\n }\n\n function getSource() {\n if (!multiPlay && sources.length) {\n return sources[0];\n }\n if ( pool.length > 0 ) {\n return pool.pop();\n } else {\n numCreated++;\n if (data.tagName) {\n return new Type(data.cloneNode(), context, onSourceEnded);\n }\n return new Type(data, context, onSourceEnded);\n }\n }\n\n function play() {\n const src = getSource();\n if (sourceNode) {\n src.sourceNode.connect(sourceNode);\n }\n if (src !== sources[0]) {\n sources.push(src);\n }\n src.play();\n }\n\n function stop() {\n while (sources.length > 1) {\n disposeSource(sources.pop());\n }\n }\n\n function pause() {\n sources.forEach((src) => src.pause());\n }\n\n function load(url) {\n stop();\n pool.length = 0;\n if (sources.length) {\n sources[0].load(url);\n }\n }\n\n function fade(volume, duration) {\n sources.forEach((src) => src.fade(volume, duration));\n }\n\n function destroy() {\n while (sources.length) {\n sources.pop().destroy();\n }\n while (pool.length) {\n pool.pop().destroy();\n }\n sourceNode.disconnect();\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 (sources[0] && sources[0].currentTime) || 0;\n }\n },\n duration: {\n get: function() {\n return (sources[0] && sources[0].duration) || 0;\n }\n },\n ended: {\n get: function() {\n return sources.every((src) => src.ended);\n }\n },\n multiPlay: {\n get: function() {\n return multiPlay;\n },\n set: function(value) {\n multiPlay = value;\n }\n },\n loop: {\n get: function() {\n return sources[0] && sources[0].loop;\n },\n set: function(value) {\n sources.forEach((src) => (src.loop = !!value));\n }\n },\n paused: {\n get: function() {\n return sources[0] && sources[0].paused;\n }\n },\n playbackRate: {\n get: function() {\n return sources[0] && sources[0].playbackRate;\n },\n set: function(value) {\n sources.forEach((src) => (src.playbackRate = value));\n }\n },\n playing: {\n get: function() {\n return sources[0] && sources[0].playing;\n }\n },\n info: {\n get: function() {\n return {\n pooled: pool.length,\n active: sources.length,\n created: numCreated\n };\n }\n },\n progress: {\n get: function() {\n return sources[0] && sources[0].progress;\n }\n },\n sourceNode: {\n get: function() {\n return createSourceNode();\n }\n },\n volume: {\n get: function() {\n return sources[0] && sources[0].volume;\n },\n set: function(value) {\n sources.forEach((src) => (src.volume = value));\n }\n },\n groupVolume: {\n get: function() {\n return sources[0] && sources[0].groupVolume;\n },\n set: function(value) {\n if (sources[0] && !sources[0].hasOwnProperty('groupVolume')) {\n return;\n }\n sources.forEach((src) => (src.groupVolume = value));\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 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 AudioSource from './source/audio-source';\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(config) {\n let context = config.context;\n let destination = config.destination;\n let effect = new Effect(context);\n let gain = effect.gain();\n let wave = waveform();\n\n let id = null;\n let data = null;\n let isTouchLocked = false;\n let loader = null;\n let loop = false;\n let playbackRate = 1;\n let playWhenReady = null;\n let source = null;\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 onEnded() {\n sound.emit('ended', sound);\n }\n\n function createSource(value) {\n data = value;\n\n const isAudioBuffer = file.isAudioBuffer(data);\n if (isAudioBuffer || file.isMediaElement(data)) {\n const Fn = isAudioBuffer ? BufferSource : MediaSource;\n source = new AudioSource(Fn, data, context, onEnded);\n source.multiPlay = !!config.multiPlay;\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 onLoad(fileData) {\n createSource(fileData);\n sound.emit('loaded', sound);\n }\n\n function onLoadError(err) {\n sound.emit('error', sound, err);\n }\n\n function load(newConfig = null, force = false) {\n const skipLoad = !force && !source && !!config.deferLoad;\n\n if (newConfig) {\n const src = file.getSupportedFile(config.src || config.url || config.data || config) || config.src;\n config = Object.assign(config, newConfig, {src});\n }\n\n if (source && data && data.tagName) {\n source.load(config.src);\n } else {\n loader = loader || new Loader(config.src, skipLoad);\n loader.audioContext = !!config.asMediaElement ? null : context;\n loader.isTouchLocked = isTouchLocked;\n loader.off('loaded', onLoad);\n loader.once('loaded', onLoad);\n loader.off('error', onLoadError);\n loader.on('error', onLoadError);\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 if (!!config.deferLoad) {\n if (!loader) {\n load(null, true);\n }\n loader.start(true);\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 sound.emit('fade', sound, volume);\n\n return sound;\n }\n\n function unload() {\n source && source.destroy();\n loader && loader.destroy();\n data = null;\n playWhenReady = null;\n source = null;\n loader = null;\n config.deferLoad = true;\n sound.emit('unload', sound);\n }\n\n function reload() {\n load(null, true);\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.off('loaded');\n loader && loader.off('error');\n loader && loader.destroy();\n sound.off('loaded');\n sound.off('ended');\n sound.off('error');\n gain = null;\n context = null;\n destination = null;\n data = null;\n playWhenReady = null;\n source = null;\n effect = null;\n loader = null;\n wave = null;\n config = 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 unload: {\n value: unload\n },\n reload: {\n value: reload\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 multiPlay: {\n get: function() {\n return config.multiPlay;\n },\n set: function(value) {\n config.multiPlay = value;\n source.multiPlay = value;\n }\n },\n config: {\n get: function() {\n return config;\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 sourceInfo: {\n get: function() {\n return source && source.info ? source.info : {};\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 value = Math.min(Math.max(value, 0), 1);\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 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\tif (ctx) {\n\t\treturn ctx;\n\t}\n\n\tconst desiredSampleRate = 44100;\n\n\tconst Ctx = window.AudioContext || window.webkitAudioContext;\n\n\tctx = (Ctx ? new Ctx() : null);\n\n\t// Check if hack is necessary. Only occurs in iOS6+ devices\n\t// and only when you first boot the iPhone, or play a audio/video\n\t// with a different sample rate\n\t// https://github.com/Jam3/ios-safe-audio-context/blob/master/index.js\n\tif (/(iPhone|iPad)/i.test(navigator.userAgent) &&\n\t\tctx.sampleRate !== desiredSampleRate) {\n\t\tconst buffer = ctx.createBuffer(1, 1, desiredSampleRate);\n\t\tconst dummy = ctx.createBufferSource();\n\t\tdummy.buffer = buffer;\n\t\tdummy.connect(ctx.destination);\n\t\tdummy.start(0);\n\t\tdummy.disconnect();\n\n\t\tctx.close() // dispose old context\n\t\tctx = (Ctx ? new Ctx() : null);\n\t}\n\n\t// Handles bug in Safari 9 OSX where AudioContext instance starts in 'suspended' state\n\n\tconst isSuspended = ctx && ctx.state === 'suspended';\n\n\tif (isSuspended && typeof ctx.resume === 'function') {\n\t\twindow.setTimeout(function() {\n\t\t\tctx.resume();\n\t\t}, 1000);\n\t}\n\n\treturn 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\tif (offlineCtx) {\n\t\treturn offlineCtx;\n\t}\n\tnumOfChannels = numOfChannels || 2;\n\tsampleRate = sampleRate || 44100;\n\tlength = sampleRate || numOfChannels;\n\n\tconst OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\n\tofflineCtx = (OfflineCtx ? new OfflineCtx(numOfChannels, length, sampleRate) : null);\n\n\treturn offlineCtx;\n}\n\n\n/*\n * clone audio buffer\n */\n\nfunction cloneBuffer(buffer) {\n\tif (!ctx) {\n\t\treturn buffer;\n\t}\n\n\tconst numChannels = buffer.numberOfChannels,\n\t\tcloned = ctx.createBuffer(numChannels, buffer.length, buffer.sampleRate);\n\tfor (let i = 0; i < numChannels; i++) {\n\t\tcloned.getChannelData(i)\n\t\t\t.set(buffer.getChannelData(i));\n\t}\n\treturn cloned;\n}\n\n/*\n * reverse audio buffer\n */\n\nfunction reverseBuffer(buffer) {\n\tconst numChannels = buffer.numberOfChannels;\n\tfor (let i = 0; i < numChannels; i++) {\n\t\tArray.prototype.reverse.call(buffer.getChannelData(i));\n\t}\n\treturn buffer;\n}\n\n/*\n * ramp audio param\n */\n\nfunction ramp(param, fromValue, toValue, duration, linear) {\n\tif (!ctx) {\n\t\treturn;\n\t}\n\n\tparam.setValueAtTime(fromValue, ctx.currentTime);\n\n\tif (linear) {\n\t\tparam.linearRampToValueAtTime(toValue, ctx.currentTime + duration);\n\t} else {\n\t\tparam.exponentialRampToValueAtTime(toValue, ctx.currentTime + duration);\n\t}\n}\n\n/*\n * get frequency from min to max by passing 0 to 1\n */\n\nfunction getFrequency(value) {\n\tif (!ctx) {\n\t\treturn 0;\n\t}\n\t// get frequency by passing number from 0 to 1\n\t// Clamp the frequency between the minimum value (40 Hz) and half of the\n\t// sampling rate.\n\tconst minValue = 40;\n\tconst maxValue = ctx.sampleRate / 2;\n\t// Logarithm (base 2) to compute how many octaves fall in the range.\n\tconst numberOfOctaves = Math.log(maxValue / minValue) / Math.LN2;\n\t// Compute a multiplier from 0 to 1 based on an exponential scale.\n\tconst multiplier = Math.pow(2, numberOfOctaves * (value - 1.0));\n\t// Get back to the frequency value between min and max.\n\treturn maxValue * multiplier;\n}\n\n/*\n * microphone util\n */\n\nfunction microphone(connected, denied, error) {\n\treturn new Microphone(connected, denied, error);\n}\n\n/*\n * Format seconds as timecode string\n */\n\nfunction timeCode(seconds, delim = ':') {\n\t// const h = Math.floor(seconds / 3600);\n\t// const m = Math.floor((seconds % 3600) / 60);\n\tconst m = Math.floor(seconds / 60);\n\tconst s = Math.floor((seconds % 3600) % 60);\n\t// const hr = (h < 10 ? '0' + h + delim : h + delim);\n\tconst mn = (m < 10 ? '0' + m : m) + delim;\n\tconst sc = (s < 10 ? '0' + s : s);\n\t// return hr + mn + sc;\n\treturn mn + sc;\n}\n\nexport default Object.freeze({\n\tgetContext,\n\tgetOfflineContext,\n\tcloneBuffer,\n\treverseBuffer,\n\tramp,\n\tgetFrequency,\n\tmicrophone,\n\ttimeCode,\n\twaveformer\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.85';\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 const src = file.getSupportedFile(config.src || config.url || config.data || config);\n const sound = new Sound(Object.assign({}, config || {}, {\n src,\n context: soundContext,\n destination: group.gain\n }));\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).load();\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('[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 create: 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","load","unload","min","max","groupVolume","EventEmitter","events","Emitter","off","removeListener","removeAllListeners","Loader","deferLoad","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","newUrl","on","queue","numLoaded","numTotal","currentLoader","completeHandler","next","loader","BufferSource","onEnded","ended","endedCallback","loop","pausedAt","playbackRate","createSourceNode","onended","elapsed","endedHandler","AudioSource","Type","sources","numCreated","multiPlay","disposeSource","onSourceEnded","index","getSource","cloneNode","every","hasOwnProperty","MediaSource","delayTimeout","fadeTimeout","createMediaElementSource","toVolume","ramp","step","MicrophoneSource","stream","createMediaStreamSource","mozGetUserMedia","mozHack","OscillatorSource","ScriptSource","onProcess","onPaused","numberOfChannels","channel","j","wave","audioBuffer","sameBuffer","sameLength","chunk","resolution","greatest","incr","scale","Sound","playWhenReady","createSource","file","Fn","Error","onLoad","fileData","onLoadError","err","newConfig","skipLoad","assign","asMediaElement","reload","create","prototype","info","__source","SoundGroup","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","getContext","clear","fillStyle","fillRect","clearRect","strokeStyle","beginPath","updateColor","position","newColor","stroke","getValue","angle","magnitude","sine","cosine","cos","moveTo","lineTo","closePath","offlineCtx","desiredSampleRate","Ctx","AudioContext","webkitAudioContext","dummy","close","isSuspended","getOfflineContext","numOfChannels","OfflineCtx","OfflineAudioContext","webkitOfflineAudioContext","cloneBuffer","numChannels","cloned","reverseBuffer","call","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","createSound","destroySound","destroyAll","pauseAll","resumeAll","stopAll","pageHiddenPaused","title","hasWebAudio","args","apply","console"],"mappings":"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"} \ No newline at end of file diff --git a/dist/sono.min.js b/dist/sono.min.js index a4d90a0..1239dbb 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 f(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 s(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,f=!!n.float,s=!!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=s),i(l,e)&&(c=a.fftSize,s=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=f),i(d,e)&&(c=a.fftSize,f=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+f,t>f&&(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(),f=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 s=0;s0&&r[s-1].connect(o),c.connect(o.frequency),r.push(o);var d=r[0],v=r[r.length-1];i.connect(d),i.connect(f),v.connect(f),v.connect(u),u.connect(d),a.connect(c),a.start(0);var p=i;return p.name="Phaser",p._output=f,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 f(){c(),e=null,H=null,X=[],Z&&Z.disconnect(),Z=null}function l(n){return i(new s(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 P(e,n,t){return S("peaking",{frequency:e,q:n,gain:t})}function D(e,n,t){return S("notch",{frequency:e,q:n,gain:t})}function q(e,n){return S("allpass",{frequency:e,q:n})}function R(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:f,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:P,notch:D,allpass:q,flanger:R,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?(m.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 m.splice(m.indexOf(e),1)}),T}function o(e){return e.gain.disconnect(),e.gain.connect(b),m.push(e),e.once("destroy",r),T}function i(e,n){return m.forEach(function(t){return t.play(e,n)}),T}function u(){return m.forEach(function(e){e.playing&&e.pause()}),T}function a(){return m.forEach(function(e){e.paused&&e.play()}),T}function c(){return m.forEach(function(e){return e.stop()}),T}function f(e){return m.forEach(function(n){return n.seek(e)}),T}function s(){return w=T.volume,T.volume=0,T}function l(){return T.volume=w||1,T}function d(e){return T.volume=e,T}function v(n,t){if(e){var r=b.gain,o=e.currentTime;r.cancelScheduledValues(o),r.setValueAtTime(r.value,o),r.linearRampToValueAtTime(n,o+t)}else m.forEach(function(e){return e.fade(n,t)});return T}function p(){m.forEach(function(e){return e.load(null,!0)})}function g(){m.forEach(function(e){return e.unload()})}function h(){for(;m.length;)m.pop().destroy()}var m=[],y=new A(e),b=y.gain(),w=1,T=null;return e&&(y.setSource(b),y.setDestination(n||e.destination)),T={add:o,find:t,remove:r,play:i,pause:u,resume:a,stop:c,seek:f,setVolume:d,mute:s,unMute:l,fade:v,load:p,unload:g,destroy:h},Object.defineProperties(T,{effect:{value:y},gain:{value:b},sounds:{value:m},volume:{get:function(){return b.gain.value},set:function(n){isNaN(n)||(n=Math.min(Math.max(n,0),1),e?(b.gain.cancelScheduledValues(e.currentTime),b.gain.value=n,b.gain.setValueAtTime(n,e.currentTime)):b.gain.value=n,m.forEach(function(e){e.context||(e.groupVolume=n)}))}}}),T}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,n){function t(){h.off("error"),h.off("progress"),h.off("complete"),h.off("loaded"),M&&"function"==typeof M.removeEventListener&&(M.removeEventListener("canplaythrough",c),M.removeEventListener("error",i)),w&&(w.removeEventListener("progress",o),w.removeEventListener("load",a),w.removeEventListener("error",i))}function r(e){h.emit("progress",1),h.emit("loaded",e),h.emit("complete",e),t()}function o(e){e.lengthComputable&&(m=e.loaded/e.total,h.emit("progress",m))}function i(n){window.clearTimeout(T);var r=n;M&&M.error&&(r="Media Error: "+g[M.error.code]+" "+e),w&&(r="XHR Error: "+w.status+" "+w.statusText+" "+e),h.emit("error",r),t()}function u(e){y.decodeAudioData(e,function(e){M=e,w=null,m=1,r(e)},i)}function a(){u(w.response)}function c(){window.clearTimeout(T),M&&(m=1,r(M))}function f(){t(),w&&4!==w.readyState&&w.abort(),w=null,window.clearTimeout(T)}function s(){f(),w=null,M=null,y=null}function l(){return e instanceof window.ArrayBuffer?void u(e):(w=new XMLHttpRequest,w.open("GET",e,!0),w.responseType="arraybuffer",w.addEventListener("progress",o),w.addEventListener("load",a),w.addEventListener("error",i),void w.send())}function d(){M&&M.tagName||(M=document.createElement("audio")),b||(window.clearTimeout(T),T=window.setTimeout(c,2e3),M.addEventListener("canplaythrough",c,!1)),M.addEventListener("error",i,!1),M.preload="auto",M.src=e,M.load(),b&&r(M)}function v(){var e=!(arguments.length<=0||void 0===arguments[0])&&arguments[0];n&&!e||(y?l():d())}function p(n){e=n,v()}var g=["","ABORTED","NETWORK","DECODE","SRC_NOT_SUPPORTED"],h=new fe,m=0,y=void 0,b=void 0,w=void 0,T=void 0,M=void 0,A={on:h.on.bind(h),once:h.once.bind(h),off:h.off.bind(h),load:p,start:v,cancel:f,destroy:s};return Object.defineProperties(A,{data:{get:function(){return M}},progress:{get:function(){return m}},audioContext:{set:function(e){y=e}},isTouchLocked:{set:function(e){b=e}}}),Object.freeze(A)}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(),s=!0,"function"==typeof l&&l(f)}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>f.duration;)t%=f.duration;r(),m.onended=u,m.start(e,t),m.loop=d,m.playbackRate.value=g,y=n.currentTime-t,s=!1,v=!1,p=0,h=!0}}function c(){o(),e=null,n=null,l=null,m=null}var f={},s=!1,l=t,d=!1,v=!1,p=0,g=1,h=!1,m=null,y=0;return Object.defineProperties(f,{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>f.duration&&(e%=f.duration),e}return 0}},duration:{get:function(){return e?e.duration:0}},ended:{get:function(){return s}},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 f.duration?f.currentTime/f.duration:0}},sourceNode:{get:function(){return r()}}}),Object.freeze(f)}function P(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 f(){if(clearTimeout(g),e){e.pause();try{e.currentTime=0,e.currentTime>0&&e.load()}catch(e){}w=!1,y=!1}}function s(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),f(),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:f},load:{value:o},fade:{value:s},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 D(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-f,a=!1,s=!0,c=!1,f=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,f=0,s=!1,d=0}function i(){var e=n.currentTime-d;o(),f=e,s=!1,c=!0}function u(){o(),n=null,l=null,e=null,window.mozHack=null}var a=!1,c=!1,f=0,s=!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 f?f:d?n.currentTime-d:0}},ended:{get:function(){return a}},paused:{get:function(){return c}},playing:{get:function(){return s}},sourceNode:{get:function(){return t()}}}),Object.freeze(v)}function q(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=f?n.currentTime-f:n.currentTime,a=!1,s=!0,c=!1,f=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,f=0,s=!1,d=0}function i(){var e=n.currentTime-d;o(),f=e,s=!1,c=!0}function u(){o(),n=null,l=null}var a=!1,c=!1,f=0,s=!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 f?f: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 s}},progress:{value:0},sourceNode:{get:function(){return t()}}}),Object.freeze(p)}function R(e,n){function t(){return!g&&n&&(g=n.createScriptProcessor(c,0,f)),g}function r(){t(),g.onaudioprocess=l,h=n.currentTime-v,s=!1,d=!1,v=0,p=!0}function o(e){for(var n=e.outputBuffer,t=0;tn[d]&&(n[d]=g),g>f&&(f=g)}for(var h=1/f,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-s/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,f=e.bgColor,s=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=44100,n=window.AudioContext||window.webkitAudioContext;if(de=n?new n:null,/(iPhone|iPad)/i.test(navigator.userAgent)&&de.sampleRate!==e){var t=de.createBuffer(1,1,e),r=de.createBufferSource();r.buffer=t,r.connect(de.destination),r.start(0),r.disconnect(),de.close(),de=n?new n:null}var o=de&&"suspended"===de.state;return o&&"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.85",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,create:i,destroySound:u,destroyAll:a,getSound:e,createGroup:n,file:ie,load:o,mute:c,unMute:f,fade:s,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:f,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,fe=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=f+e;a.emit("progress",n/s)}function n(){f++,o(),a.emit("progress",f/s),r()}function t(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),s++,e}function u(){s=c.length,r()}var a=new fe,c=[],f=0,s=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:P,MicrophoneSource:D,OscillatorSource:q,ScriptSource:R};var se=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}); +!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":Y(n))&&Object.keys(n).some(function(r){t=n[r];var o=e(t);return te.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":Y(e))&&e.bufferSize&&e.channels&&e.callback)}function c(e){return!(!e||"string"!=typeof e||!(e.indexOf(".")>-1||"data:"===e.slice(0,5)))}function f(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 s(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,f=!!n.float,s=!!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=s),i(l,e)&&(c=a.fftSize,s=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=f),i(d,e)&&(c=a.fftSize,f=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(ae);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+f,t>f&&(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(),f=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 s=0;s0&&r[s-1].connect(o),c.connect(o.frequency),r.push(o);var d=r[0],v=r[r.length-1];i.connect(d),i.connect(f),v.connect(f),v.connect(u),u.connect(d),a.connect(c),a.start(0);var p=i;return p.name="Phaser",p._output=f,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 f(){c(),e=null,H=null,X=[],Z&&Z.disconnect(),Z=null}function l(n){return i(new s(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 E(n){return i(new v(e,n))}function O(n){return i(new d(e,n))}function x(n,t,r,o){return i(new g(e,{type:n,frequency:t,q:r,gain:o}))}function S(e,n){return x("lowpass",{frequency:e,q:n})}function L(e,n){return x("highpass",{frequency:e,q:n})}function _(e,n){return x("bandpass",{frequency:e,q:n})}function C(e,n){return x("lowshelf",{frequency:e,q:0,gain:n})}function P(e,n){return x("highshelf",{frequency:e,q:0,gain:n})}function k(e,n,t){return x("peaking",{frequency:e,q:n,gain:t})}function D(e,n,t){return x("notch",{frequency:e,q:n,gain:t})}function R(e,n){return x("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:f,setSource:N,setDestination:I,analyser:l,compressor:h,convolver:m,delay:A,echo:E,distortion:O,filter:x,lowpass:S,highpass:L,bandpass:_,lowshelf:C,highshelf:P,peaking:k,notch:D,allpass:R,flanger:q,gain:F,panner:z,phaser:j,recorder:G,reverb:B,script:V},Object.freeze(W)}function E(e,n){function t(e,n){var t=void 0;return e||0===e?(m.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 m.splice(m.indexOf(e),1)}),T}function o(e){return e.gain.disconnect(),e.gain.connect(b),m.push(e),e.once("destroy",r),T}function i(e,n){return m.forEach(function(t){return t.play(e,n)}),T}function u(){return m.forEach(function(e){e.playing&&e.pause()}),T}function a(){return m.forEach(function(e){e.paused&&e.play()}),T}function c(){return m.forEach(function(e){return e.stop()}),T}function f(e){return m.forEach(function(n){return n.seek(e)}),T}function s(){return w=T.volume,T.volume=0,T}function l(){return T.volume=w||1,T}function d(e){return T.volume=e,T}function v(n,t){if(e){var r=b.gain,o=e.currentTime;r.cancelScheduledValues(o),r.setValueAtTime(r.value,o),r.linearRampToValueAtTime(n,o+t)}else m.forEach(function(e){return e.fade(n,t)});return T}function p(){m.forEach(function(e){return e.load(null,!0)})}function g(){m.forEach(function(e){return e.unload()})}function h(){for(;m.length;)m.pop().destroy()}var m=[],y=new A(e),b=y.gain(),w=1,T=null;return e&&(y.setSource(b),y.setDestination(n||e.destination)),T={add:o,find:t,remove:r,play:i,pause:u,resume:a,stop:c,seek:f,setVolume:d,mute:s,unMute:l,fade:v,load:p,unload:g,destroy:h},Object.defineProperties(T,{effect:{value:y},gain:{value:b},sounds:{value:m},volume:{get:function(){return b.gain.value},set:function(n){isNaN(n)||(n=Math.min(Math.max(n,0),1),e?(b.gain.cancelScheduledValues(e.currentTime),b.gain.value=n,b.gain.setValueAtTime(n,e.currentTime)):b.gain.value=n,m.forEach(function(e){e.context||(e.groupVolume=n)}))}}}),T}function O(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function x(e){return"function"==typeof e}function S(e){return"number"==typeof e}function L(e){return"object"==typeof e&&null!==e}function _(e){return void 0===e}function C(e,n){function t(){h.off("error"),h.off("progress"),h.off("complete"),h.off("loaded"),M&&"function"==typeof M.removeEventListener&&(M.removeEventListener("canplaythrough",c),M.removeEventListener("error",i)),w&&(w.removeEventListener("progress",o),w.removeEventListener("load",a),w.removeEventListener("error",i))}function r(e){h.emit("progress",1),h.emit("loaded",e),h.emit("complete",e),t()}function o(e){e.lengthComputable&&(m=e.loaded/e.total,h.emit("progress",m))}function i(n){window.clearTimeout(T);var r=n;M&&M.error&&(r="Media Error: "+g[M.error.code]+" "+e),w&&(r="XHR Error: "+w.status+" "+w.statusText+" "+e),h.emit("error",r),t()}function u(e){y.decodeAudioData(e,function(e){M=e,w=null,m=1,r(e)},i)}function a(){u(w.response)}function c(){window.clearTimeout(T),M&&(m=1,r(M))}function f(){t(),w&&4!==w.readyState&&w.abort(),w=null,window.clearTimeout(T)}function s(){f(),w=null,M=null,y=null}function l(){return e instanceof window.ArrayBuffer?void u(e):(w=new XMLHttpRequest,w.open("GET",e,!0),w.responseType="arraybuffer",w.addEventListener("progress",o),w.addEventListener("load",a),w.addEventListener("error",i),void w.send())}function d(){M&&M.tagName||(M=document.createElement("audio")),b||(window.clearTimeout(T),T=window.setTimeout(c,2e3),M.addEventListener("canplaythrough",c,!1)),M.addEventListener("error",i,!1),M.preload="auto",M.src=e,M.load(),b&&r(M)}function v(){var e=!(arguments.length<=0||void 0===arguments[0])&&arguments[0];n&&!e||(y?l():d())}function p(n){e=n,v()}var g=["","ABORTED","NETWORK","DECODE","SRC_NOT_SUPPORTED"],h=new se,m=0,y=void 0,b=void 0,w=void 0,T=void 0,M=void 0,A={on:h.on.bind(h),once:h.once.bind(h),off:h.off.bind(h),load:p,start:v,cancel:f,destroy:s};return Object.defineProperties(A,{data:{get:function(){return M}},progress:{get:function(){return m}},audioContext:{set:function(e){y=e}},isTouchLocked:{set:function(e){b=e}}}),Object.freeze(A)}function P(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(),s=!0,"function"==typeof l&&l(f)}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>f.duration;)t%=f.duration;r(),m.onended=u,m.start(e,t),m.loop=d,m.playbackRate.value=g,y=n.currentTime-t,s=!1,v=!1,p=0,h=!0}}function c(){o(),e=null,n=null,l=null,m=null}var f={},s=!1,l=t,d=!1,v=!1,p=0,g=1,h=!1,m=null,y=0;return Object.defineProperties(f,{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>f.duration&&(e%=f.duration),e}return 0}},duration:{get:function(){return e?e.duration:0}},ended:{get:function(){return s}},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 f.duration?f.currentTime/f.duration:0}},sourceNode:{get:function(){return r()}}}),Object.freeze(f)}function k(e,n,t,r){function o(){return p}function i(e){e.stop(),b&&h.push(e)}function u(e){if(m.length>1){var n=m.indexOf(e);m.splice(n,1)}i(e),r()}function a(){return!b&&m.length?m[0]:h.length>0?h.pop():(y++,n.tagName?new e(n.cloneNode(),t,u):new e(n,t,u))}function c(){var e=a();p&&e.sourceNode.connect(p),e!==m[0]&&m.push(e),e.play()}function f(){for(;m.length>1;)i(m.pop())}function s(){m.forEach(function(e){return e.pause()})}function l(e){f(),h.length=0,m.length&&m[0].load(e)}function d(e,n){m.forEach(function(t){return t.fade(e,n)})}function v(){for(;m.length;)m.pop().destroy();for(;h.length;)h.pop().destroy();p.disconnect()}var p=t?t.createGain():null,g={},h=[],m=[],y=0,b=!1;return Object.defineProperties(g,{play:{value:c},pause:{value:s},stop:{value:f},load:{value:l},fade:{value:d},destroy:{value:v},currentTime:{get:function(){return m[0]&&m[0].currentTime||0}},duration:{get:function(){return m[0]&&m[0].duration||0}},ended:{get:function(){return m.every(function(e){return e.ended})}},multiPlay:{get:function(){return b},set:function(e){b=e}},loop:{get:function(){return m[0]&&m[0].loop},set:function(e){m.forEach(function(n){return n.loop=!!e})}},paused:{get:function(){return m[0]&&m[0].paused}},playbackRate:{get:function(){return m[0]&&m[0].playbackRate},set:function(e){m.forEach(function(n){return n.playbackRate=e})}},playing:{get:function(){return m[0]&&m[0].playing}},info:{get:function(){return{pooled:h.length,active:m.length,created:y}}},progress:{get:function(){return m[0]&&m[0].progress}},sourceNode:{get:function(){return o()}},volume:{get:function(){return m[0]&&m[0].volume},set:function(e){m.forEach(function(n){return n.volume=e})}},groupVolume:{get:function(){return m[0]&&m[0].groupVolume},set:function(e){m[0]&&!m[0].hasOwnProperty("groupVolume")||m.forEach(function(n){return n.groupVolume=e})}}}),Object.freeze(g)}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 f(){if(clearTimeout(g),e){e.pause();try{e.currentTime=0,e.currentTime>0&&e.load()}catch(e){}w=!1,y=!1}}function s(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),f(),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:f},load:{value:o},fade:{value:s},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 R(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-f,a=!1,s=!0,c=!1,f=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,f=0,s=!1,d=0}function i(){var e=n.currentTime-d;o(),f=e,s=!1,c=!0}function u(){o(),n=null,l=null,e=null,window.mozHack=null}var a=!1,c=!1,f=0,s=!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 f?f:d?n.currentTime-d:0}},ended:{get:function(){return a}},paused:{get:function(){return c}},playing:{get:function(){return s}},sourceNode:{get:function(){return t()}}}),Object.freeze(v)}function q(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=f?n.currentTime-f:n.currentTime,a=!1,s=!0,c=!1,f=0}function o(){if(l){try{l.stop(0)}catch(e){}l=null}a=!0,c=!1,f=0,s=!1,d=0}function i(){var e=n.currentTime-d;o(),f=e,s=!1,c=!0}function u(){o(),n=null,l=null}var a=!1,c=!1,f=0,s=!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 f?f: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 s}},progress:{value:0},sourceNode:{get:function(){return t()}}}),Object.freeze(p)}function F(e,n){function t(){return!g&&n&&(g=n.createScriptProcessor(c,0,f)),g}function r(){t(),g.onaudioprocess=l,h=n.currentTime-v,s=!1,d=!1,v=0,p=!0}function o(e){for(var n=e.outputBuffer,t=0;tn[d]&&(n[d]=g),g>f&&(f=g)}for(var h=1/f,m=0;m0&&y.lineTo(T,M),T=d+w,M=v+m-Math.round(m*P),M=Math.floor(Math.min(M,v+m-s/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,f=e.bgColor,s=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,E=void 0,O=void 0,x=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),E=e.innerRadius||A/2,O=d+h/2,x=v+m/2),y=e.context||g.getContext("2d"),i.canvas=g,(e.waveform||e.sound)&&i(),i}function N(){if(ve)return ve;var e=44100,n=window.AudioContext||window.webkitAudioContext;if(ve=n?new n:null,/(iPhone|iPad)/i.test(navigator.userAgent)&&ve.sampleRate!==e){var t=ve.createBuffer(1,1,e),r=ve.createBufferSource();r.buffer=t,r.connect(ve.destination),r.start(0),r.disconnect(),ve.close(),ve=n?new n:null}var o=ve&&"suspended"===ve.state;return o&&"function"==typeof ve.resume&&window.setTimeout(function(){ve.resume()},1e3),ve}function I(e,n,t){if(pe)return pe;e=e||2,t=t||44100,n=t||e;var r=window.OfflineAudioContext||window.webkitOfflineAudioContext;return pe=r?new r(e,n,t):null}function U(e){if(!ve)return e;for(var n=e.numberOfChannels,t=ve.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.85",b=ge.getContext(),w=b?b.destination:null,T=new E(b,w),M=null,A=!1;return A=J.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=[];J.handlePageVisibility(e,n)}(),M={createSound:i,create:i,destroySound:u,destroyAll:a,getSound:e,createGroup:n,file:ue,load:o,mute:c,unMute:f,fade:s,pauseAll:l,resumeAll:d,stopAll:v,play:p,pause:g,stop:h,log:m,canPlay:ue.canPlay,context:b,getOfflineContext:ge.getOfflineContext,effect:T.effect,extensions:ue.extensions,hasWebAudio:!!b,isSupported:ue.extensions.length>0,gain:T.gain,utils:ge,VERSION:y,Sound:j,Group:E},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 J={};J.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)},J.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 Y="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},$=function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")},ee=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)},ne=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},te=[],re={},oe=[{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;"}],ie=document.createElement("audio");ie&&(oe.forEach(function(e){var n=!!ie.canPlayType(e.type);n&&te.indexOf(e.ext)===-1&&te.push(e.ext),re[e.ext]=n}),ie=null);var ue={canPlay:re,containsURL:f,extensions:te,getFileExtension:e,getSupportedFile:n,isAudioBuffer:t,isMediaElement:o,isMediaStream:i,isOscillatorType:u,isScriptConfig:a,isURL:c},ae=22050;b.defaults={panningModel:"HRTF",distanceModel:"linear",refDistance:1,maxDistance:1e3,rolloffFactor:1,coneInnerAngle:360,coneOuterAngle:0,coneOuterGain:0},E.Effect=A;var ce=O;O.EventEmitter=O,O.prototype._events=void 0,O.prototype._maxListeners=void 0,O.defaultMaxListeners=10,O.prototype.setMaxListeners=function(e){if(!S(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},O.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(x(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},O.prototype.on=O.prototype.addListener,O.prototype.once=function(e,n){function t(){this.removeListener(e,t),r||(r=!0,n.apply(this,arguments))}if(!x(n))throw TypeError("listener must be a function");var r=!1;return t.listener=n,this.on(e,t),this},O.prototype.removeListener=function(e,n){var t,r,o,i;if(!x(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||x(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},O.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],x(t))this.removeListener(e,t);else if(t)for(;t.length;)this.removeListener(e,t[t.length-1]);return delete this._events[e],this},O.prototype.listeners=function(e){var n;return n=this._events&&this._events[e]?x(this._events[e])?[this._events[e]]:this._events[e].slice():[]},O.prototype.listenerCount=function(e){if(this._events){var n=this._events[e];if(x(n))return 1;if(n)return n.length}return 0},O.listenerCount=function(e,n){return e.listenerCount(n)};var fe=ce.EventEmitter,se=function(e){function n(){return $(this,n),ne(this,e.call(this))}return ee(n,e),n.prototype.off=function(e,n){return n?this.removeListener(e,n):e?this.removeAllListeners(e):this.removeAllListeners()},n}(fe);C.Group=function(){function e(e){var n=f+e;a.emit("progress",n/s)}function n(){f++,o(),a.emit("progress",f/s),r()}function t(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),s++,e}function u(){s=c.length,r()}var a=new se,c=[],f=0,s=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})},j.__source={BufferSource:P,MediaSource:D,MicrophoneSource:R,OscillatorSource:q,ScriptSource:F};var le=Math.PI/2,de=2*Math.PI,ve=void 0,pe=void 0,ge=Object.freeze({getContext:N,getOfflineContext:I,cloneBuffer:U,reverseBuffer:W,ramp:H,getFrequency:X,microphone:Z,timeCode:Q,waveformer:V}),he=new K;return he}); diff --git a/examples/css/control.css b/examples/css/control.css index 8c3507b..7c5135d 100644 --- a/examples/css/control.css +++ b/examples/css/control.css @@ -104,6 +104,16 @@ width: var(--control-markWidth); } +.Control-mark--play { + width: 0; + height: 0; + border-top: 30px solid transparent; + border-bottom: 30px solid transparent; + border-left: 40px solid var(--control-markColor); + margin-left: 10px; + margin-top: 20px; +} + .Control-canvas { border: 1px solid #ddd; border-radius: 8px; diff --git a/examples/css/styles.css b/examples/css/styles.css index 5d69dfb..5b48b91 100644 --- a/examples/css/styles.css +++ b/examples/css/styles.css @@ -659,6 +659,16 @@ nav a { width: 10px; } +.Control-mark--play { + width: 0; + height: 0; + border-top: 30px solid transparent; + border-bottom: 30px solid transparent; + border-left: 40px solid white; + margin-left: 10px; + margin-top: 20px; +} + .Control-canvas { border: 1px solid #ddd; border-radius: 8px; diff --git a/examples/js/example.js b/examples/js/example.js index 3830745..8900f2b 100644 --- a/examples/js/example.js +++ b/examples/js/example.js @@ -12,8 +12,8 @@ '
  • Touch locked (mobile): ' + sono.isTouchLocked + '
  • ' + '
  • Supported extensions: ' + sono.extensions.join(', ') + '
  • '; - var baseURL = 'examples/audio/'; - // var baseURL = 'https://dl.dropboxusercontent.com/u/15470024/prototypes/audio/'; + // var baseURL = 'examples/audio/'; + var baseURL = 'https://dl.dropboxusercontent.com/u/15470024/prototypes/audio/'; // var baseURL = 'http://prototypes.stinkdigital.com/webaudio/sono/examples/audio/'; var sound, diff --git a/examples/js/pixi-multi-play.js b/examples/js/pixi-multi-play.js new file mode 100644 index 0000000..a0d4898 --- /dev/null +++ b/examples/js/pixi-multi-play.js @@ -0,0 +1,2 @@ +!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[s]={exports:{}};t[s][0].call(c.exports,function(e){var n=t[s][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;sc;)if(a=u[c++],a!=a)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===n)return e||c||0;return!e&&-1}}},{"./_to-index":54,"./_to-iobject":56,"./_to-length":57}],10:[function(e,t,n){var r=e("./_cof"),o=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),s=function(e,t){try{return e[t]}catch(e){}};t.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=s(t=Object(e),o))?n:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},{"./_cof":11,"./_wks":61}],11:[function(e,t,n){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],12:[function(e,t,n){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],13:[function(e,t,n){"use strict";var r=e("./_object-dp"),o=e("./_property-desc");t.exports=function(e,t,n){t in e?r.f(e,t,o(0,n)):e[t]=n}},{"./_object-dp":40,"./_property-desc":47}],14:[function(e,t,n){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":6}],15:[function(e,t,n){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],16:[function(e,t,n){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":21}],17:[function(e,t,n){var r=e("./_is-object"),o=e("./_global").document,i=r(o)&&r(o.createElement);t.exports=function(e){return i?o.createElement(e):{}}},{"./_global":22,"./_is-object":29}],18:[function(e,t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],19:[function(e,t,n){var r=e("./_global"),o=e("./_core"),i=e("./_hide"),s=e("./_redefine"),a=e("./_ctx"),u="prototype",l=function(e,t,n){var c,f,d,h,p=e&l.F,v=e&l.G,y=e&l.S,_=e&l.P,g=e&l.B,x=v?r:y?r[t]||(r[t]={}):(r[t]||{})[u],m=v?o:o[t]||(o[t]={}),b=m[u]||(m[u]={});v&&(n=t);for(c in n)f=!p&&x&&void 0!==x[c],d=(f?x:n)[c],h=g&&f?a(d,r):_&&"function"==typeof d?a(Function.call,d):d,x&&s(x,c,d,e&l.U),m[c]!=d&&i(m,c,h),_&&b[c]!=d&&(b[c]=d)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},{"./_core":12,"./_ctx":14,"./_global":22,"./_hide":24,"./_redefine":48}],20:[function(e,t,n){var r=e("./_wks")("match");t.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,!"/./"[e](t)}catch(e){}}return!0}},{"./_wks":61}],21:[function(e,t,n){t.exports=function(e){try{return!!e()}catch(e){return!0}}},{}],22:[function(e,t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],23:[function(e,t,n){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],24:[function(e,t,n){var r=e("./_object-dp"),o=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},{"./_descriptors":16,"./_object-dp":40,"./_property-desc":47}],25:[function(e,t,n){t.exports=e("./_global").document&&document.documentElement},{"./_global":22}],26:[function(e,t,n){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":16,"./_dom-create":17,"./_fails":21}],27:[function(e,t,n){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":11}],28:[function(e,t,n){var r=e("./_iterators"),o=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},{"./_iterators":35,"./_wks":61}],29:[function(e,t,n){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],30:[function(e,t,n){var r=e("./_is-object"),o=e("./_cof"),i=e("./_wks")("match");t.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},{"./_cof":11,"./_is-object":29,"./_wks":61}],31:[function(e,t,n){var r=e("./_an-object");t.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},{"./_an-object":8}],32:[function(e,t,n){"use strict";var r=e("./_object-create"),o=e("./_property-desc"),i=e("./_set-to-string-tag"),s={};e("./_hide")(s,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,n){e.prototype=r(s,{next:o(1,n)}),i(e,t+" Iterator")}},{"./_hide":24,"./_object-create":39,"./_property-desc":47,"./_set-to-string-tag":49,"./_wks":61}],33:[function(e,t,n){"use strict";var r=e("./_library"),o=e("./_export"),i=e("./_redefine"),s=e("./_hide"),a=e("./_has"),u=e("./_iterators"),l=e("./_iter-create"),c=e("./_set-to-string-tag"),f=e("./_object-gpo"),d=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),p="@@iterator",v="keys",y="values",_=function(){return this};t.exports=function(e,t,n,g,x,m,b){l(n,t,g);var w,A,j,C=function(e){if(!h&&e in E)return E[e];switch(e){case v:return function(){return new n(this,e)};case y:return function(){return new n(this,e)}}return function(){return new n(this,e)}},k=t+" Iterator",T=x==y,M=!1,E=e.prototype,P=E[d]||E[p]||x&&E[x],O=P||C(x),S=x?T?C("entries"):O:void 0,L="Array"==t?E.entries||P:P;if(L&&(j=f(L.call(new e)),j!==Object.prototype&&(c(j,k,!0),r||a(j,d)||s(j,d,_))),T&&P&&P.name!==y&&(M=!0,O=function(){return P.call(this)}),r&&!b||!h&&!M&&E[d]||s(E,d,O),u[t]=O,u[k]=_,x)if(w={values:T?O:C(y),keys:m?O:C(v),entries:S},b)for(A in w)A in E||i(E,A,w[A]);else o(o.P+o.F*(h||M),t,w);return w}},{"./_export":19,"./_has":23,"./_hide":24,"./_iter-create":32,"./_iterators":35,"./_library":36,"./_object-gpo":43,"./_redefine":48,"./_set-to-string-tag":49,"./_wks":61}],34:[function(e,t,n){var r=e("./_wks")("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}t.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],s=i[r]();s.next=function(){return{done:n=!0}},i[r]=function(){return s},e(i)}catch(e){}return n}},{"./_wks":61}],35:[function(e,t,n){t.exports={}},{}],36:[function(e,t,n){t.exports=!1},{}],37:[function(e,t,n){t.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},{}],38:[function(e,t,n){"use strict";var r=e("./_object-keys"),o=e("./_object-gops"),i=e("./_object-pie"),s=e("./_to-object"),a=e("./_iobject"),u=Object.assign;t.exports=!u||e("./_fails")(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||Object.keys(u({},t)).join("")!=r})?function(e,t){for(var n=s(e),u=arguments.length,l=1,c=o.f,f=i.f;u>l;)for(var d,h=a(arguments[l++]),p=c?r(h).concat(c(h)):r(h),v=p.length,y=0;v>y;)f.call(h,d=p[y++])&&(n[d]=h[d]);return n}:u},{"./_fails":21,"./_iobject":27,"./_object-gops":42,"./_object-keys":45,"./_object-pie":46,"./_to-object":58}],39:[function(e,t,n){var r=e("./_an-object"),o=e("./_object-dps"),i=e("./_enum-bug-keys"),s=e("./_shared-key")("IE_PROTO"),a=function(){},u="prototype",l=function(){var t,n=e("./_dom-create")("iframe"),r=i.length,o="<",s=">";for(n.style.display="none",e("./_html").appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),l=t.F;r--;)delete l[u][i[r]];return l()};t.exports=Object.create||function(e,t){var n;return null!==e?(a[u]=r(e),n=new a,a[u]=null,n[s]=e):n=l(),void 0===t?n:o(n,t)}},{"./_an-object":8,"./_dom-create":17,"./_enum-bug-keys":18,"./_html":25,"./_object-dps":41,"./_shared-key":50}],40:[function(e,t,n){var r=e("./_an-object"),o=e("./_ie8-dom-define"),i=e("./_to-primitive"),s=Object.defineProperty;n.f=e("./_descriptors")?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},{"./_an-object":8,"./_descriptors":16,"./_ie8-dom-define":26,"./_to-primitive":59}],41:[function(e,t,n){var r=e("./_object-dp"),o=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){o(e);for(var n,s=i(t),a=s.length,u=0;a>u;)r.f(e,n=s[u++],t[n]);return e}},{"./_an-object":8,"./_descriptors":16,"./_object-dp":40,"./_object-keys":45}],42:[function(e,t,n){n.f=Object.getOwnPropertySymbols},{}],43:[function(e,t,n){var r=e("./_has"),o=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),s=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},{"./_has":23,"./_shared-key":50,"./_to-object":58}],44:[function(e,t,n){var r=e("./_has"),o=e("./_to-iobject"),i=e("./_array-includes")(!1),s=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var n,a=o(e),u=0,l=[];for(n in a)n!=s&&r(a,n)&&l.push(n);for(;t.length>u;)r(a,n=t[u++])&&(~i(l,n)||l.push(n));return l}},{"./_array-includes":9,"./_has":23,"./_shared-key":50,"./_to-iobject":56}],45:[function(e,t,n){var r=e("./_object-keys-internal"),o=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,o)}},{"./_enum-bug-keys":18,"./_object-keys-internal":44}],46:[function(e,t,n){n.f={}.propertyIsEnumerable},{}],47:[function(e,t,n){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],48:[function(e,t,n){var r=e("./_global"),o=e("./_hide"),i=e("./_has"),s=e("./_uid")("src"),a="toString",u=Function[a],l=(""+u).split(a);e("./_core").inspectSource=function(e){return u.call(e)},(t.exports=function(e,t,n,a){var u="function"==typeof n;u&&(i(n,"name")||o(n,"name",t)),e[t]!==n&&(u&&(i(n,s)||o(n,s,e[t]?""+e[t]:l.join(String(t)))),e===r?e[t]=n:a?e[t]?e[t]=n:o(e,t,n):(delete e[t],o(e,t,n)))})(Function.prototype,a,function(){return"function"==typeof this&&this[s]||u.call(this)})},{"./_core":12,"./_global":22,"./_has":23,"./_hide":24,"./_uid":60}],49:[function(e,t,n){var r=e("./_object-dp").f,o=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":23,"./_object-dp":40,"./_wks":61}],50:[function(e,t,n){var r=e("./_shared")("keys"),o=e("./_uid");t.exports=function(e){return r[e]||(r[e]=o(e))}},{"./_shared":51,"./_uid":60}],51:[function(e,t,n){var r=e("./_global"),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":22}],52:[function(e,t,n){var r=e("./_to-integer"),o=e("./_defined");t.exports=function(e){return function(t,n){var i,s,a=String(o(t)),u=r(n),l=a.length;return u<0||u>=l?e?"":void 0:(i=a.charCodeAt(u),i<55296||i>56319||u+1===l||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):i:e?a.slice(u,u+2):(i-55296<<10)+(s-56320)+65536)}}},{"./_defined":15,"./_to-integer":55}],53:[function(e,t,n){var r=e("./_is-regexp"),o=e("./_defined");t.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(e))}},{"./_defined":15,"./_is-regexp":30}],54:[function(e,t,n){var r=e("./_to-integer"),o=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),e<0?o(e+t,0):i(e,t)}},{"./_to-integer":55}],55:[function(e,t,n){var r=Math.ceil,o=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?o:r)(e)}},{}],56:[function(e,t,n){var r=e("./_iobject"),o=e("./_defined");t.exports=function(e){return r(o(e))}},{"./_defined":15,"./_iobject":27}],57:[function(e,t,n){var r=e("./_to-integer"),o=Math.min;t.exports=function(e){return e>0?o(r(e),9007199254740991):0}},{"./_to-integer":55}],58:[function(e,t,n){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":15}],59:[function(e,t,n){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":29}],60:[function(e,t,n){var r=0,o=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+o).toString(36))}},{}],61:[function(e,t,n){var r=e("./_shared")("wks"),o=e("./_uid"),i=e("./_global").Symbol,s="function"==typeof i,a=t.exports=function(e){return r[e]||(r[e]=s&&i[e]||(s?i:o)("Symbol."+e))};a.store=r},{"./_global":22,"./_shared":51,"./_uid":60}],62:[function(e,t,n){var r=e("./_classof"),o=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[r(e)]}},{"./_classof":10,"./_core":12,"./_iterators":35,"./_wks":61}],63:[function(e,t,n){"use strict";var r=e("./_ctx"),o=e("./_export"),i=e("./_to-object"),s=e("./_iter-call"),a=e("./_is-array-iter"),u=e("./_to-length"),l=e("./_create-property"),c=e("./core.get-iterator-method");o(o.S+o.F*!e("./_iter-detect")(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,o,f,d=i(e),h="function"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,y=void 0!==v,_=0,g=c(d);if(y&&(v=r(v,p>2?arguments[2]:void 0,2)),void 0==g||h==Array&&a(g))for(t=u(d.length),n=new h(t);t>_;_++)l(n,_,y?v(d[_],_):d[_]);else for(f=g.call(d),n=new h;!(o=f.next()).done;_++)l(n,_,y?s(f,v,[o.value,_],!0):o.value);return n.length=_,n}})},{"./_create-property":13,"./_ctx":14,"./_export":19,"./_is-array-iter":28,"./_iter-call":31,"./_iter-detect":34,"./_to-length":57,"./_to-object":58,"./core.get-iterator-method":62}],64:[function(e,t,n){var r=e("./_export");r(r.S,"Math",{sign:e("./_math-sign")})},{"./_export":19,"./_math-sign":37}],65:[function(e,t,n){var r=e("./_export");r(r.S+r.F,"Object",{assign:e("./_object-assign")})},{"./_export":19,"./_object-assign":38}],66:[function(e,t,n){"use strict";var r=e("./_export"),o=e("./_string-context"),i="includes";r(r.P+r.F*e("./_fails-is-regexp")(i),"String",{includes:function(e){return!!~o(this,e,i).indexOf(e,arguments.length>1?arguments[1]:void 0)}})},{"./_export":19,"./_fails-is-regexp":20,"./_string-context":53}],67:[function(e,t,n){"use strict";var r=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":33,"./_string-at":52}],68:[function(e,t,n){"use strict";var r=e("./_export"),o=e("./_array-includes")(!0);r(r.P,"Array",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),e("./_add-to-unscopables")("includes")},{"./_add-to-unscopables":7,"./_array-includes":9,"./_export":19}],69:[function(e,t,n){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function o(e){return"function"==typeof e}function i(e){return"number"==typeof e}function s(e){return"object"==typeof e&&null!==e}function a(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,i,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||s(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(n=this._events[e],a(n))return!1;if(o(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:i=Array.prototype.slice.call(arguments,1),n.apply(this,i)}else if(s(n))for(i=Array.prototype.slice.call(arguments,1),l=n.slice(),r=l.length,u=0;u0&&this._events[e].length>n&&(this._events[e].warned=!0,void 0,"function"==typeof console.trace&&void 0)),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function n(){this.removeListener(e,n),r||(r=!0,t.apply(this,arguments))}if(!o(t))throw TypeError("listener must be a function");var r=!1;return n.listener=t,this.on(e,n),this},r.prototype.removeListener=function(e,t){var n,r,i,a;if(!o(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],i=n.length,r=-1,n===t||o(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(n)){for(a=i;a-- >0;)if(n[a]===t||n[a].listener&&n[a].listener===t){r=a;break}if(r<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;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(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],o(n))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?o(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(o(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],70:[function(e,t,n){"use strict";function r(e,t){for(var n=[],r=0;rAVE: "+a)}function n(e){"undefined"==typeof e&&(e=Date.now()),0===o&&(o=e),e-1e3>o&&(o=e,s=i,i=0,s>1&&(u++,l+=s,a=Math.floor(l/u)),t()),i++}function r(){window.requestAnimationFrame(r),n()}var o=0,i=0,s=0,a=0,u=0,l=0,c=0,f=0;return e||(e=document.createElement("div"),e.setAttribute("id","fps"),e.style.position="absolute",e.style.top="0px",e.style.right="0px",e.style.padding="2px 6px",e.style.zIndex="99999",e.style.background="#000",e.style.color="#fff",e.style.fontSize="10px",document.body.appendChild(e)),{auto:r,update:n}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],73:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){function e(e){var t=Object.keys(c.default).reduce(function(t,n){return c.default[n]===e?n:t},"").toLowerCase();t&&v.emit(t.toLowerCase())}function t(t){t.preventDefault(),y[t.keyCode]=!0,v.emit("keydown",t.keyCode),e(t.keyCode)}function n(e){e.preventDefault(),y[e.keyCode]=!1,v.emit("keyup",e.keyCode)}function r(){document.addEventListener("keydown",t,!1),document.addEventListener("keyup",n,!1)}function o(){document.removeEventListener("keydown",t),document.removeEventListener("keyup",n)}function i(e){return y[e]}function a(){return y[c.default.LEFT]||y[c.default.A]}function l(){return y[c.default.RIGHT]||y[c.default.D]}function f(){return y[c.default.UP]||y[c.default.W]}function d(){return y[c.default.DOWN]||y[c.default.S]}function h(){return y[c.default.SPACE]}function p(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];o(),e&&r()}var v=Object.create(u.default.prototype),y=(0,s.default)(256,!1);return r(),Object.assign(v,{keyboard:c.default,enable:p,isDown:i,left:a,right:l,up:f,down:d,space:h})}Object.defineProperty(n,"__esModule",{value:!0}),n.default=o;var i=e("../array/array"),s=r(i),a=e("../events/emitter"),u=r(a),l=e("./keyboard"),c=r(l)},{"../array/array":70,"../events/emitter":71,"./keyboard":74}],74:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default={A:"A".charCodeAt(0),B:"B".charCodeAt(0),C:"C".charCodeAt(0),D:"D".charCodeAt(0),E:"E".charCodeAt(0),F:"F".charCodeAt(0),G:"G".charCodeAt(0),H:"H".charCodeAt(0),I:"I".charCodeAt(0),J:"J".charCodeAt(0),K:"K".charCodeAt(0),L:"L".charCodeAt(0),M:"M".charCodeAt(0),N:"N".charCodeAt(0),O:"O".charCodeAt(0),P:"P".charCodeAt(0),Q:"Q".charCodeAt(0),R:"R".charCodeAt(0),S:"S".charCodeAt(0),T:"T".charCodeAt(0),U:"U".charCodeAt(0),V:"V".charCodeAt(0),W:"W".charCodeAt(0),X:"X".charCodeAt(0),Y:"Y".charCodeAt(0),Z:"Z".charCodeAt(0),ZERO:"0".charCodeAt(0),ONE:"1".charCodeAt(0),TWO:"2".charCodeAt(0),THREE:"3".charCodeAt(0),FOUR:"4".charCodeAt(0),FIVE:"5".charCodeAt(0),SIX:"6".charCodeAt(0),SEVEN:"7".charCodeAt(0),EIGHT:"8".charCodeAt(0),NINE:"9".charCodeAt(0),NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_ADD:107,NUMPAD_ENTER:108,NUMPAD_SUBTRACT:109,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,COLON:186,EQUALS:187,UNDERSCORE:189,QUESTION_MARK:191,TILDE:192,OPEN_BRACKET:219,BACKWARD_SLASH:220,CLOSED_BRACKET:221,QUOTES:222,BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CONTROL:17,ALT:18,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,INSERT:45,DELETE:46,HELP:47,NUM_LOCK:144}},{}],75:[function(e,t,n){"use strict";function r(){function e(e){return e.next&&(e.next.prev=e.prev),e.prev&&(e.prev.next=e.next),e===u&&(u=e.next),e===l&&(l=e.prev),e.next=e.prev=null,e}function t(t,n){return e(t),t.prev=n,t.next=n.next,n.next?n.next.prev=t:l=t,n.next=t,t}function n(t,n){return e(t),t.prev=n.prev,t.next=n,n.prev?n.prev.next=t:u=t,n.prev=t,t}function o(e){if(u){for(var n=u;n.next;)n=n.next;t(e,n)}else u=l=e;return e}function i(e){for(var t=u;t;)e(t),t=t.next}function s(e){for(var t=r(),n=u;n;)t.add(e(n)),n=n.next;return t}var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],u=void 0,l=void 0;return a.forEach(function(e){return o(e)}),{get first(){return u},getFirst:function(){return u},get last(){return l},getLast:function(){return l},get length(){return this.getCount()},getCount:function(){for(var e=0,t=u;t;)e++,t=t.next;return e},add:o,remove:e,insertAfter:t,insertBefore:n,forEach:i,map:s}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],76:[function(e,t,n){"use strict";function r(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Math.random()>.5?e:t}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],77:[function(e,t,n){"use strict";function r(e,t){return isNaN(t)&&(t=e,e=0),e+Math.random()*(t-e)}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],78:[function(e,t,n){"use strict";function r(e,t){return Math.floor(e+Math.random()*(t-e+1))}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],79:[function(e,t,n){"use strict";function r(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{x:0,y:0},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{x:0,y:0},o=Math.sin(t),i=Math.cos(t);return r.x=(e.x-n.x)*i-(e.y-n.y)*o,r.y=(e.x-n.x)*o+(e.y-n.y)*i,r.x+=n.x,r.y+=n.y,r}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],80:[function(e,t,n){"use strict";function r(e){var t=[],n=0;return{getPool:function(){return t},get:function(){return t.length>0?t.pop():(n++,e())},dispose:function(e){t.push(e)},fill:function(r){for(;t.length1&&void 0!==arguments[1]?arguments[1]:1;if(t>1){for(var n=0;n0&&(this.vx+=r/s*a,this.vy+=o/s*a),this}},{key:"collides",value:function(e){return this.distanceTo(e)<=this.radius+e.radius}},{key:"edgeCollide",value:function(){var e=this._bounds.x+this.radius,t=this._bounds.x+this._bounds.width-this.radius,n=this._bounds.y+this.radius,r=this._bounds.y+this._bounds.height-this.radius;this.xt&&(this.x=t,this.vx=this.vx*this.bounce.x),this.yr&&(this.y=r,this.vy=this.vy*this.bounce.y)}},{key:"edgeWrap",value:function(){var e=this.outerBounds,t=e.left,n=e.right,r=e.top,o=e.bottom;this.xn&&(this.x=t),this.yo&&(this.y=r)}},{key:"edgeKill",value:function(){var e=this.outerBounds,t=e.left,n=e.right,r=e.top,o=e.bottom;(this.xn||this.yo)&&(this.alive=!1)}},{key:"edgeReset",value:function(){var e=this.outerBounds,t=e.left,n=e.right,r=e.top,o=e.bottom;(this.xn||this.yo)&&this.reset()}},{key:"lifeKill",value:function(){this.lifeTime--,this.lifeTime<=0&&(this.alive=!1)}},{key:"speed",get:function(){ +return 0===this.vx&&0===this.vy?0:l(this.vx*this.vx+this.vy*this.vy)},set:function(e){var t=this.angle;this.vx=a(t)*e,this.vy=u(t)*e}},{key:"angle",get:function(){return 0===this.vx&&0===this.vy?0:s(this.vy,this.vx)},set:function(e){var t=this.speed;this.vx=a(e)*t,this.vy=u(e)*t}},{key:"bounds",get:function(){return this._bounds},set:function(e){var t=e.x,n=e.y,r=e.width,o=e.height;this.setBounds(t,n,r,o)}},{key:"left",get:function(){return this.x-this.radius}},{key:"right",get:function(){return this.x+this.radius}},{key:"top",get:function(){return this.y-this.radius}},{key:"bottom",get:function(){return this.y+this.radius}},{key:"outerBounds",get:function(){return this._outerBounds.left=this._bounds.x-this.radius,this._outerBounds.right=this._bounds.x+this._bounds.width+this.radius,this._outerBounds.top=this._bounds.y-this.radius,this._outerBounds.bottom=this._bounds.y+this._bounds.height+this.radius,this._outerBounds}}]),e}();n.default=c},{}],83:[function(e,t,n){"use strict";!function(){var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=window.DOMTokenList.prototype[e];window.DOMTokenList.prototype[e]=function(e){var n=void 0,r=arguments.length;for(n=0;n1&&this.contains(t)===n?n:e.call(this,t)}}(),e=null}()},{}],84:[function(e,t,n){"use strict";!function(e){window.console=window.console||{};var t=["assert","clear","count","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","markTimeline","memory","profile","profileEnd","table","time","timeEnd","timeStamp","timeline","timelineEnd","trace","warn"];t.forEach(function(t){window.console[t]=window.console[t]||e})}(function(){})},{}],85:[function(e,t,n){"use strict";!function(){if(!window.requestAnimationFrame)for(var e=["ms","moz","webkit","o"],t=0;tm&&(U.play("explode"),g=u,m=(0,T.default)(80,160)),K.start()}var u=Date.now();if(R.update(),l.up()?(h=0-Math.PI/16,v.y=0-O*i):l.down()?(h=Math.PI/16,v.y=O*i):(h=0,v.y=0),l.left()?v.x=0-O*i:l.right()?v.x=O*i:v.x=0,f.update(),l.right()||Math.random()>.8){var d=M.create({x:f.x-30,y:f.y,speed:0-f.vx+(0,p.default)(2,4),angle:0-Math.PI+(0,p.default)(0-Math.PI/16,Math.PI/16),lifeTime:30});d.gfx.alpha=1,d.gfx.visible=!0}if(M.update(function(e){e.gfx.position.set(e.x,e.y),e.gfx.alpha=e.lifeTime/30,e.lifeKill(),e.alive||(e.gfx.visible=!1)}),Math.random()<.05){var _=a.create({x:Y+100,y:(0,p.default)(120,W-120),speed:(0,p.default)(4,8),angle:0-Math.PI+(0,p.default)(0-Math.PI/16,Math.PI/16)});_.gfx.visible=!0}a.update(function(e){e.gfx.position.set(e.x,e.y),e.edgeKill(),e.alive||(e.gfx.visible=!1)});var b=-10;if(t.tilePosition.x+=b,r.tilePosition.x+=b,(0,x.terrainCollision)(f,e,!0)&&(v.y=2*i),(0,x.terrainCollision)(f,n,!1)&&(v.y=0-2*i),f.vx+=v.x,f.vy+=v.y,f.edgeCollide(),f.gfx.position.set(f.x,f.y),f.gfx.rotation=f.gfx.rotation+.3*(h-f.gfx.rotation),l.space()&&u-S>50){S=u,L.y=(0,y.default)(-8,8);var w=Math.PI/32,A=(0,p.default)(h-w,h+w),C=j.create({x:f.x+L.x,y:f.y+L.y,speed:Math.max(0,f.vx)+(0,p.default)(8,12),angle:A,lifeTime:200});(0,c.default)({x:f.x+L.x,y:f.y+L.y},h,f,C),C.gfx.visible=!0,U.play("shoot")}G.innerHTML=o("explode")+"
    "+o("shoot"),j.update(function(e){e.gfx.position.set(e.x,e.y),e.edgeKill(),e.lifeKill(),e.alive||(e.gfx.visible=!1)}),!f.killed&&P.canSpawn(u)&&P.spawn(u),P.update(f,j,s),f.killed&&(f.explode.list.length?f.explode.update(function(e){e.gfx.alpha=.01*e.lifeTime,e.gfx.position.set(e.x,e.y),e.lifeKill(),e.alive||(e.gfx.visible=!1)}):f.alive=!1)})}),Z.load()},{"./utils/GlowFilter":88,"./utils/ScreenShake/ScreenShake":90,"./utils/polyfills":92,"./views/color":93,"./views/enemyGroup":94,"./views/terrain":95,"./views/textureFactory":96,"usfl/fps":72,"usfl/input/keyInput":73,"usfl/math/coinToss":76,"usfl/math/random":77,"usfl/math/randomInt":78,"usfl/math/rotatePoint":79,"usfl/particle":82,"usfl/particle/ParticleGroup":81}],87:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.__esModule=!0;var o=function(){function e(t,n){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.35;r(this,e),this.offset=n/2,this.scaleFactor=o,this.points=[{x:0,y:n/2},{x:t,y:n/2}]}return e.prototype.iterate=function(){for(var e=[],t=0;t0&&void 0!==arguments[0]?arguments[0]:1;e-- >0;)this.iterate();return this.points},e}();n.default=o},{}],88:[function(e,t,n){"use strict";function r(e,t,n,r,o){i.call(this,"#define GLSLIFY 1\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n","#define GLSLIFY 1\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nuniform float distance;\nuniform float outerStrength;\nuniform float innerStrength;\nuniform vec4 glowColor;\nuniform vec4 filterArea;\nvec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\n\nvoid main(void) {\n const float PI = 3.14159265358979323846264;\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\n vec4 curColor;\n float totalAlpha = 0.0;\n float maxTotalAlpha = 0.0;\n float cosAngle;\n float sinAngle;\n for (float angle = 0.0; angle <= PI * 2.0; angle += %QUALITY_DIST%) {\n cosAngle = cos(angle);\n sinAngle = sin(angle);\n for (float curDistance = 1.0; curDistance <= %DIST%; curDistance++) {\n curColor = texture2D(uSampler, vec2(vTextureCoord.x + cosAngle * curDistance * px.x, vTextureCoord.y + sinAngle * curDistance * px.y));\n totalAlpha += (distance - curDistance) * curColor.a;\n maxTotalAlpha += (distance - curDistance);\n }\n }\n maxTotalAlpha = max(maxTotalAlpha, 0.0001);\n\n ownColor.a = max(ownColor.a, 0.0001);\n ownColor.rgb = ownColor.rgb / ownColor.a;\n float outerGlowAlpha = (totalAlpha / maxTotalAlpha) * outerStrength * (1. - ownColor.a);\n float innerGlowAlpha = ((maxTotalAlpha - totalAlpha) / maxTotalAlpha) * innerStrength * ownColor.a;\n float resultAlpha = (ownColor.a + outerGlowAlpha);\n gl_FragColor = vec4(mix(mix(ownColor.rgb, glowColor.rgb, innerGlowAlpha / ownColor.a), glowColor.rgb, outerGlowAlpha / resultAlpha) * resultAlpha, resultAlpha);\n}\n".replace(/%QUALITY_DIST%/gi,""+(1/o/e).toFixed(7)).replace(/%DIST%/gi,""+e.toFixed(7))),this.uniforms.distance=e,this.uniforms.glowColor=new Float32Array([0,0,0,1]),o=Math.pow(o,1/3),this.quality=o,this.uniforms.distance*=o,this.color=r,this.outerStrength=t,this.innerStrength=n}n.__esModule=!0;var o=window.PIXI,i=o.Filter,s=o.utils;r.prototype=Object.create(i.prototype),r.prototype.constructor=r,Object.defineProperties(r.prototype,{color:{get:function(){return s.rgb2hex(this.uniforms.glowColor)},set:function(e){s.hex2rgb(e,this.uniforms.glowColor)}},outerStrength:{get:function(){return this.uniforms.outerStrength},set:function(e){this.uniforms.outerStrength=e}}}),n.default=r},{}],89:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}n.__esModule=!0;var i=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:1;if(e>1){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:40;if(!(this.screenShakes>0)){var t=Date.now();Date.now()-this.shookAt=0&&p<=1||v>=0&&v<=1)&&(y>=0&&y<=1||_>=0&&_<=1)?(o=o||{},o.x=d,o.y=h,o):null}n.__esModule=!0,n.default=r},{}],92:[function(e,t,n){"use strict";e("core-js/fn/array/from"),e("core-js/fn/array/includes"),e("core-js/fn/object/assign"),e("core-js/fn/math/sign"),e("core-js/fn/string/includes"),e("usfl/polyfill/classList"),e("usfl/polyfill/console"),e("usfl/polyfill/requestAnimationFrame")},{"core-js/fn/array/from":1,"core-js/fn/array/includes":2,"core-js/fn/math/sign":3,"core-js/fn/object/assign":4,"core-js/fn/string/includes":5,"usfl/polyfill/classList":83,"usfl/polyfill/console":84,"usfl/polyfill/requestAnimationFrame":85}],93:[function(e,t,n){"use strict";n.__esModule=!0,n.default={yellow:16777023,cyan:8388607,green:8388352,magenta:16732415,red:15744121}},{}],94:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r){function o(e){h=e;for(var n=(0,d.default)(32,128),r=t+100,o=(0,c.default)(120,200),i=m.create(),s=0;s4e3&&m.list.length<2}var h=0,v=p.default.generateEnemyTexture(r),_=p.default.generateExplodeTexture(r),m=new y.default(function(){var r=new u.default(function(){var r=new s.default({radius:10,bounds:{width:t,height:n},counter:0});return r.gfx=e.addChild(new g(v)),r.gfx.anchor.set(.5),r.explode=new u.default(function(){var r=new s.default({radius:2,bounds:{width:t,height:n}});return r.gfx=e.addChild(new g(_)),r.gfx.anchor.set(.5),r.gfx.blendMode=x.ADD,r.gfx.visible=!1,r}),r.explode.pool.fill(40),r.gfx.blendMode=x.ADD,r.gfx.visible=!1,r});return r.pool.fill(32),r});return{spawn:o,update:l,canSpawn:f}}n.__esModule=!0,n.default=o;var i=e("usfl/particle"),s=r(i),a=e("usfl/particle/ParticleGroup"),u=r(a),l=e("usfl/math/random"),c=r(l),f=e("usfl/math/randomInt"),d=r(f),h=e("./textureFactory"),p=r(h),v=e("../utils/PooledList"),y=r(v),_=window.PIXI,g=_.Sprite,x=_.BLEND_MODES},{"../utils/PooledList":89,"./textureFactory":96,"usfl/math/random":77,"usfl/math/randomInt":78,"usfl/particle":82,"usfl/particle/ParticleGroup":81}],95:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r){var o=new a.default(2*e,t/4,.8),i=o.create(5),s=new h;s.beginFill(0),s.drawRect(0,0,2*e,t/2),s.lineStyle(5,f.default.green),s.moveTo(i[0].x,i[0].y),s.filters=[w,A];var u=new h;u.lineStyle(5,f.default.cyan),u.moveTo(i[0].x,i[0].y);var l=new h;l.lineStyle(5,3355443),l.beginFill(3355443),l.moveTo(i[0].x,i[0].y);for(var c=t,d=0,y=1;yd&&(d=i[y].y);r?(l.lineTo(2*e,c-20),l.lineTo(0,c-20)):(l.lineTo(2*e,d+20),l.lineTo(0,d+20)),l.lineTo(i[0].x,i[0].y);var _=new p;_.addChild(l),_.addChild(u);var g=n.generateTexture(_),x=new v.TilingSprite(g,2*e,Math.floor(g.height));return{sprite:x,points:i,minY:c,maxY:d}}function i(e,t){_.x=e.x,_.y=e.y-e.radius,g.x=e.x,g.y=e.y+e.radius;for(var n=t.sprite.tilePosition.x%t.sprite.width,r=0;r1&&void 0!==arguments[1]?arguments[1]:40,n=s(t),r=new h;return r.lineStyle(5,d.default.green),r.drawPolygon(n),r.moveTo(t-1,-12),r.lineTo(t+10,-12),r.moveTo(t-1,12),r.lineTo(t+10,12),e.generateTexture(r)}function u(e){var t=new h;return t.lineStyle(2,d.default.cyan),t.drawCircle(0,0,4),e.generateTexture(t)}function l(e){var t=new h;return t.lineStyle(2,d.default.yellow),t.drawCircle(0,0,4),e.generateTexture(t)}function c(e){var t=new h;return t.beginFill(1118481),t.drawCircle(0,0,10),e.generateTexture(t)}n.__esModule=!0;var f=e("./color"),d=r(f),h=window.PIXI.Graphics;n.default={generateExplodeTexture:o,generateEnemyTexture:i,generateHeroTexture:a,generateBulletTexture:u,generateThrustTexture:l,generateFloaterTexture:c}},{"./color":93}]},{},[86]); \ No newline at end of file diff --git a/examples/js/ui.js b/examples/js/ui.js index 41da90e..c05b6a3 100644 --- a/examples/js/ui.js +++ b/examples/js/ui.js @@ -218,6 +218,47 @@ window.ui = (function() { destroy: destroy }; } + + /* + * Trigger control + */ + + function createTrigger(options, fn) { + var el = options.el, + nameEl = el.querySelector('[data-js="name"]'), + iconEl = el.querySelector('[data-js="icon"]'), + outputEl = el.querySelector('[data-js="output"]'), + name = options.name || '', + callback = fn; + + var onDown = function(event) { + if (event.type === 'touchstart') { + el.removeEventListener('mousedown', onDown); + } + + if (callback) { + callback(); + } + }; + + var setName = function(value) { + nameEl.innerHTML = value; + }; + + var destroy = function() { + el.removeEventListener('mousedown', onDown); + el.removeEventListener('touchstart', onDown); + }; + + el.addEventListener('mousedown', onDown); + el.addEventListener('touchstart', onDown); + setName(name); + + return { + setName: setName, + destroy: destroy + }; + } /* * Radial control @@ -375,7 +416,8 @@ window.ui = (function() { return { createPlayer: createPlayer, createControl: createControl, - createToggle: createToggle + createToggle: createToggle, + createTrigger: createTrigger }; }()); diff --git a/examples/load.html b/examples/load.html index 57c3163..f67f4a8 100644 --- a/examples/load.html +++ b/examples/load.html @@ -57,6 +57,37 @@

    load & destroy

    if (window.location.search.slice(1) === 'nowebaudio') { window.AudioContext = window.webkitAudioContext = undefined; } + if (!Object.assign) { + Object.defineProperty(Object, 'assign', { + enumerable: false, + configurable: true, + writable: true, + value: function(target, firstSource) { + 'use strict'; + if (target === undefined || target === null) { + throw new TypeError('Cannot convert first argument to object'); + } + + var to = Object(target); + for (var i = 1; i < arguments.length; i++) { + var nextSource = arguments[i]; + if (nextSource === undefined || nextSource === null) { + continue; + } + + var keysArray = Object.keys(Object(nextSource)); + for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { + var nextKey = keysArray[nextIndex]; + var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + if (desc !== undefined && desc.enumerable) { + to[nextKey] = nextSource[nextKey]; + } + } + } + return to; + } + }); +} + + + + + + + + diff --git a/examples/pixi-multi-play.html b/examples/pixi-multi-play.html new file mode 100644 index 0000000..d5bb9d1 --- /dev/null +++ b/examples/pixi-multi-play.html @@ -0,0 +1,91 @@ + + + + + + + + sono - examples - PixiJS / Multi play + + + + + + +
    +
    +

    PixiJS / Multi play

    +
    + +
    +

    Arrow keys to move around, space to shoot.

    +
    + +
    +
    + +
    +            
    +import {loaders} from 'pixi.js';
    +
    +const ext = sono.canPlay.ogg ? 'ogg' : 'mp3';
    +
    +if (sono.hasWebAudio) {
    +    const {Resource} = loaders;
    +    Resource.setExtensionLoadType(ext, Resource.LOAD_TYPE.XHR);
    +    Resource.setExtensionXhrType(ext, Resource.XHR_RESPONSE_TYPE.BUFFER);
    +}
    +
    +const sounds = [{
    +    name: 'music',
    +    url: `audio/space-shooter.${ext}`,
    +    loop: true,
    +    volume: 0.8
    +}, {
    +    name: 'shoot',
    +    url: `audio/shoot3.${ext}`,
    +    volume: 0.4,
    +    multiPlay: true
    +}, {
    +    name: 'explode',
    +    url: `audio/explode2.${ext}`,
    +    volume: 0.9,
    +    multiPlay: true
    +}];
    +
    +const loader = new loaders.Loader();
    +
    +loader.add(sounds);
    +
    +loader.onComplete.once(() => {
    +    sounds.forEach(sound => {
    +        const src = loader.resources[sound.name].data;
    +        const config = Object.assign({}, sound, {src});
    +        sono.create(config);
    +    });
    +
    +    sono.getSound('shoot').effect.reverb();
    +    sono.play('music');
    +});
    +
    +loader.load();
    +            
    +        
    + +
    + + + + + + + + + + diff --git a/index.html b/index.html index b99178a..c87b557 100644 --- a/index.html +++ b/index.html @@ -53,7 +53,7 @@

    sono

                 
    -    var sound = sono.createSound({
    +    var sound = sono.create({
             src: [ 'dnb-loop-3.ogg', 'dnb-loop-3.mp3' ],
             loop: true,
             volume: 1
    @@ -676,6 +676,7 @@ 

    more examples