Artifact
017a25dabd701d0d3f1161a83d3e942468257663472ec76eddd43e276c878e49:
'use strict';
let dom = require('../util/dom');
let Interface = require('../core/interface');
/**
 * Spectrogram
 *
 * @description Audio spectrum visualization
 *
 * @demo <span nexus-ui="spectrogram"></span>
 *
 * @example
 * var spectrogram = new Nexus.Spectrogram('#target')
 * spectrogram.connect(myWebAudioNode)
 *
 * @example
 * var spectrogram = new Nexus.Spectrogram('#target',{
 *   'size': [300,150]
 * })
 * spectrogram.connect(myWebAudioNode)
 *
 * @output
 *  
 * No events
 *
 */
export default class Spectrogram extends Interface {
  constructor() {
    let options = [];
    let defaults = {
      size: [300, 150]
    };
    super(arguments, options, defaults);
    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
    this.init();
  }
  buildFrame() {
    this.canvas = new dom.SmartCanvas(this.parent);
    this.element = this.canvas.element;
  }
  sizeInterface() {
    this.canvas.resize(this.width, this.height);
  }
  colorInterface() {
    this.canvas.element.style.backgroundColor = this.colors.fill;
  }
  render() {
    if (this.active) {
      requestAnimationFrame(this.render.bind(this));
    }
    if (this.analyser) {
      this.analyser.getByteFrequencyData(this.dataArray);
    }
    this.canvas.context.fillStyle = this.colors.fill;
    this.canvas.context.fillRect(
      0,
      0,
      this.canvas.element.width,
      this.canvas.element.height
    );
    if (this.source && this.dataArray) {
      //console.log(this.dataArray);
      let barWidth = this.canvas.element.width / this.bufferLength;
      let barHeight;
      let x = 0;
      let definition = this.canvas.element.width / 50;
      for (let i = 0; i < this.bufferLength; i = i + definition) {
        barHeight = Math.max.apply(
          null,
          this.dataArray.subarray(i, i + definition)
        );
        barHeight /= 255;
        barHeight *= this.canvas.element.height;
        this.canvas.context.fillStyle = this.colors.accent;
        this.canvas.context.fillRect(
          x,
          this.canvas.element.height - barHeight,
          barWidth * definition,
          barHeight
        );
        x += barWidth * definition;
      }
    }
  }
  /**
  Equivalent to "patching in" an audio node to visualize.
  @param node {AudioNode} The audio node to visualize
  @example spectrogram.connect( Tone.Master );
  */
  connect(node) {
    if (this.source) {
      this.disconnect();
    }
    this.analyser = node.context.createAnalyser();
    this.analyser.fftSize = 2048;
    this.bufferLength = this.analyser.frequencyBinCount;
    this.dataArray = new Uint8Array(this.bufferLength);
    this.active = true;
    this.source = node;
    this.source.connect(this.analyser);
    this.render();
  }
  /**
  Stop visualizing the source node and disconnect it.
  */
  disconnect() {
    if (this.source) {
      this.source.disconnect(this.analyser);
    }
    this.analyser = null;
    this.bufferLength = 0;
    this.dataArray = null;
    this.active = false;
    this.source = null;
  }
  click() {
    this.active = !this.active && this.source;
    this.render();
  }
  customDestroy() {
    this.active = false;
  }
}