constructor(arg){
		/** Set basic Wad properties **/
		this.source        = arg.source;
		this.useCache      = lodash__WEBPACK_IMPORTED_MODULE_3___default.a.get(arg, 'useCache', true);
		this.destination   = arg.destination || _common__WEBPACK_IMPORTED_MODULE_2__["context"].destination; // the last node the sound is routed to
		this.volume        = lodash__WEBPACK_IMPORTED_MODULE_3___default.a.get(arg, 'volume', 1); // peak volume. min:0, max:1 (actually max is infinite, but ...just keep it at or below 1)
		this.defaultVolume = this.volume;
		this.playable      = 1; // if this is less than 1, this Wad is still waiting for a file to download before it can play
		this.pitch         = Wad.pitches[arg.pitch] || arg.pitch || 440;
		this.gain          = [];
		this.detune        = arg.detune || 0; // In Cents.
		this.offset        = arg.offset || 0;
		this.loop          = arg.loop   || false;
		this.tuna          = arg.tuna   || null;
		this.rate          = arg.rate   || 1;
		this.sprite        = arg.sprite || null;

		this.env = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructEnv"])(arg);
		this.defaultEnv = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructEnv"])(arg);
		this.userSetHold = !!(arg.env && arg.env.hold); //_
		this.filter = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructFilter"])(arg);
		this.vibrato = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructVibrato"])(arg);
		this.tremolo = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructTremolo"])(arg);
		this.panning = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructPanning"])(arg);
		this.delay = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructDelay"])(arg);
		this.reverb = Object(_common__WEBPACK_IMPORTED_MODULE_2__["constructReverb"])(this, arg); // has side-effects
		this.duration = (this.env.attack + this.env.decay + this.env.hold + this.env.release) * (1/(this.rate)) * 1000;
		this.constructExternalFx(arg, _common__WEBPACK_IMPORTED_MODULE_2__["context"]);

		/** If the Wad's source is noise, set the Wad's buffer to the noise buffer we created earlier. **/
		if ( this.source === 'noise' ) {
			this.decodedBuffer = _common__WEBPACK_IMPORTED_MODULE_2__["noiseBuffer"];
		}

		/** If the Wad's source is the microphone, the rest of the setup happens here. **/
		else if ( this.source === 'mic' ) {
			Object(_common__WEBPACK_IMPORTED_MODULE_2__["getConsent"])(this, arg);
		}

		/** If the source is not a pre-defined value, assume it is a URL for an audio file, and grab it now. **/
		else if ( !( this.source in { 'sine' : 0, 'sawtooth' : 0, 'square' : 0, 'triangle' : 0 } ) ) {
			Object(_common__WEBPACK_IMPORTED_MODULE_2__["requestAudioFile"])(this, arg.callback);

			if ( this.sprite ) {
				var thatWad = this;
				for ( var sprite in this.sprite ) {
					this[sprite] = {
						sprite: this.sprite[sprite],
						play: function(arg){
							arg = arg || {};
							arg.env = arg.env || {};
							arg.env.hold = this.sprite[1] - this.sprite[0];
							arg.offset = this.sprite[0];

							return thatWad.play(arg);
						}
					};
				}
			}
		}
		else { arg.callback && arg.callback(this); }

		Wad.allWads.push(this);
	}
@param {WadConfig} arg - One big object.