code: function (config) {
    if (!config) config = {};
    this.context = config.context || new (window.AudioContext || window.webkitAudioContext)();
    
    var analyser = config.analyser || this.context.createAnalyser();
    analyser.fftSize = config.analyser ? config.analyser.fftSize : (config.size || 2048);
    config.mute = config.analyser ? true : config.mute;
  
    this.fps = config.fps || 60;
  
    Object.defineProperty(this, 'smoothing', {
      get: function() {
        return analyser.smoothingTimeConstant;
      },
      set: function(value) {
        analyser.smoothingTimeConstant = value;
      }
    });
  
    Object.defineProperty(this, 'fftSize', {
      get: function() {
        return analyser.fftSize;
      },
      set: function(value) {
        analyser.fftSize = value;
      }
    });
  
    this._muted = true;
  
    Object.defineProperty(this, 'muted', {
      get: function() {
        return this._muted;
      },
      set: function(value) {
        if(!this.analyser) return true;
        if(this._muted) {
          if(value === false){
            this.analyser.connect(this.context.destination);
            this._muted = false;
          } 
        } else if(value === true){
          this.analyser.disconnect(this.context.destination);
          this._muted = true;
        }
      }
    });
  
    Object.defineProperty(this, 'sampleRate', {
      get: function() {
        return this.context.sampleRate;
      }
    });
    
    this.analyser = analyser;
  
    this.resize(analyser.frequencyBinCount);
  
    this.muted = !!config.mute;
  }
docs: /*
  clubber.js 1.7.1 Copyright (c) 2016-2017, Yannis Gravezas All Rights Reserved.
  Available under the MIT license. See http://github.com/wizgrav/clubber for info.