⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 78e19673af2563cc90b2e1528963a90e7c2847bc55e2f409a8f53fe60274da8c:


0000: 27 75 73 65 20 73 74 72 69 63 74 27 3b 0a 0a 6c  'use strict';..l
0010: 65 74 20 64 6f 6d 20 3d 20 72 65 71 75 69 72 65  et dom = require
0020: 28 27 2e 2e 2f 75 74 69 6c 2f 64 6f 6d 27 29 3b  ('../util/dom');
0030: 0a 6c 65 74 20 6d 61 74 68 20 3d 20 72 65 71 75  .let math = requ
0040: 69 72 65 28 27 2e 2e 2f 75 74 69 6c 2f 6d 61 74  ire('../util/mat
0050: 68 27 29 3b 0a 6c 65 74 20 49 6e 74 65 72 66 61  h');.let Interfa
0060: 63 65 20 3d 20 72 65 71 75 69 72 65 28 27 2e 2e  ce = require('..
0070: 2f 63 6f 72 65 2f 69 6e 74 65 72 66 61 63 65 27  /core/interface'
0080: 29 3b 0a 0a 2f 2a 2a 0a 20 2a 20 4d 65 74 65 72  );../**. * Meter
0090: 0a 20 2a 0a 20 2a 20 40 64 65 73 63 72 69 70 74  . *. * @descript
00a0: 69 6f 6e 20 53 74 65 72 65 6f 20 64 65 63 69 62  ion Stereo decib
00b0: 65 6c 20 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 40  el meter. *. * @
00c0: 64 65 6d 6f 20 3c 73 70 61 6e 20 6e 65 78 75 73  demo <span nexus
00d0: 2d 75 69 3d 22 6d 65 74 65 72 22 3e 3c 2f 73 70  -ui="meter"></sp
00e0: 61 6e 3e 0a 20 2a 0a 20 2a 20 40 65 78 61 6d 70  an>. *. * @examp
00f0: 6c 65 0a 20 2a 20 76 61 72 20 6d 65 74 65 72 20  le. * var meter 
0100: 3d 20 6e 65 77 20 4e 65 78 75 73 2e 4d 65 74 65  = new Nexus.Mete
0110: 72 28 27 23 74 61 72 67 65 74 27 29 0a 20 2a 20  r('#target'). * 
0120: 6d 65 74 65 72 2e 63 6f 6e 6e 65 63 74 28 6d 79  meter.connect(my
0130: 57 65 62 41 75 64 69 6f 4e 6f 64 65 29 0a 20 2a  WebAudioNode). *
0140: 0a 20 2a 20 40 65 78 61 6d 70 6c 65 0a 20 2a 20  . * @example. * 
0150: 76 61 72 20 6d 65 74 65 72 20 3d 20 6e 65 77 20  var meter = new 
0160: 4e 65 78 75 73 2e 4d 65 74 65 72 28 27 23 74 61  Nexus.Meter('#ta
0170: 72 67 65 74 27 2c 20 7b 0a 20 2a 20 20 20 73 69  rget', {. *   si
0180: 7a 65 3a 20 5b 37 35 2c 37 35 5d 0a 20 2a 20 7d  ze: [75,75]. * }
0190: 29 0a 20 2a 20 6d 65 74 65 72 2e 63 6f 6e 6e 65  ). * meter.conne
01a0: 63 74 28 6d 79 57 65 62 41 75 64 69 6f 4e 6f 64  ct(myWebAudioNod
01b0: 65 29 0a 20 2a 0a 20 2a 20 40 6f 75 74 70 75 74  e). *. * @output
01c0: 0a 20 2a 20 26 6e 62 73 70 3b 0a 20 2a 20 4e 6f  . * &nbsp;. * No
01d0: 20 65 76 65 6e 74 73 0a 20 2a 0a 20 2a 2f 0a 0a   events. *. */..
01e0: 65 78 70 6f 72 74 20 64 65 66 61 75 6c 74 20 63  export default c
01f0: 6c 61 73 73 20 4d 65 74 65 72 20 65 78 74 65 6e  lass Meter exten
0200: 64 73 20 49 6e 74 65 72 66 61 63 65 20 7b 0a 20  ds Interface {. 
0210: 20 63 6f 6e 73 74 72 75 63 74 6f 72 28 29 20 7b   constructor() {
0220: 0a 20 20 20 20 6c 65 74 20 6f 70 74 69 6f 6e 73  .    let options
0230: 20 3d 20 5b 5d 3b 0a 0a 20 20 20 20 6c 65 74 20   = [];..    let 
0240: 64 65 66 61 75 6c 74 73 20 3d 20 7b 0a 20 20 20  defaults = {.   
0250: 20 20 20 73 69 7a 65 3a 20 5b 33 30 2c 20 31 30     size: [30, 10
0260: 30 5d 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73  0].    };..    s
0270: 75 70 65 72 28 61 72 67 75 6d 65 6e 74 73 2c 20  uper(arguments, 
0280: 6f 70 74 69 6f 6e 73 2c 20 64 65 66 61 75 6c 74  options, default
0290: 73 29 3b 0a 0a 20 20 20 20 74 68 69 73 2e 63 68  s);..    this.ch
02a0: 61 6e 6e 65 6c 73 20 3d 20 32 3b 0a 20 20 20 20  annels = 2;.    
02b0: 74 68 69 73 2e 73 70 6c 69 74 74 65 72 20 3d 20  this.splitter = 
02c0: 6e 75 6c 6c 3b 0a 20 20 20 20 74 68 69 73 2e 61  null;.    this.a
02d0: 6e 61 6c 79 73 65 72 73 20 3d 20 5b 5d 3b 0a 20  nalysers = [];. 
02e0: 20 20 20 74 68 69 73 2e 62 75 66 66 65 72 4c 65     this.bufferLe
02f0: 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 74 68  ngth = 0;.    th
0300: 69 73 2e 64 61 74 61 41 72 72 61 79 20 3d 20 6e  is.dataArray = n
0310: 75 6c 6c 3b 0a 20 20 20 20 74 68 69 73 2e 61 63  ull;.    this.ac
0320: 74 69 76 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20  tive = false;.  
0330: 20 20 74 68 69 73 2e 73 6f 75 72 63 65 20 3d 20    this.source = 
0340: 6e 75 6c 6c 3b 0a 20 20 20 20 74 68 69 73 2e 64  null;.    this.d
0350: 62 20 3d 20 2d 49 6e 66 69 6e 69 74 79 3b 0a 0a  b = -Infinity;..
0360: 20 20 20 20 74 68 69 73 2e 69 6e 69 74 28 29 3b      this.init();
0370: 0a 0a 20 20 20 20 74 68 69 73 2e 6d 65 74 65 72  ..    this.meter
0380: 57 69 64 74 68 20 3d 20 74 68 69 73 2e 63 61 6e  Width = this.can
0390: 76 61 73 2e 65 6c 65 6d 65 6e 74 2e 77 69 64 74  vas.element.widt
03a0: 68 20 2f 20 74 68 69 73 2e 63 68 61 6e 6e 65 6c  h / this.channel
03b0: 73 3b 0a 0a 20 20 20 20 74 68 69 73 2e 72 65 6e  s;..    this.ren
03c0: 64 65 72 28 29 3b 0a 20 20 7d 0a 0a 20 20 62 75  der();.  }..  bu
03d0: 69 6c 64 46 72 61 6d 65 28 29 20 7b 0a 20 20 20  ildFrame() {.   
03e0: 20 74 68 69 73 2e 63 61 6e 76 61 73 20 3d 20 6e   this.canvas = n
03f0: 65 77 20 64 6f 6d 2e 53 6d 61 72 74 43 61 6e 76  ew dom.SmartCanv
0400: 61 73 28 74 68 69 73 2e 70 61 72 65 6e 74 29 3b  as(this.parent);
0410: 0a 20 20 20 20 74 68 69 73 2e 65 6c 65 6d 65 6e  .    this.elemen
0420: 74 20 3d 20 74 68 69 73 2e 63 61 6e 76 61 73 2e  t = this.canvas.
0430: 65 6c 65 6d 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20  element;.  }..  
0440: 73 69 7a 65 49 6e 74 65 72 66 61 63 65 28 29 20  sizeInterface() 
0450: 7b 0a 20 20 20 20 74 68 69 73 2e 63 61 6e 76 61  {.    this.canva
0460: 73 2e 72 65 73 69 7a 65 28 74 68 69 73 2e 77 69  s.resize(this.wi
0470: 64 74 68 2c 20 74 68 69 73 2e 68 65 69 67 68 74  dth, this.height
0480: 29 3b 0a 20 20 7d 0a 0a 20 20 63 6f 6c 6f 72 49  );.  }..  colorI
0490: 6e 74 65 72 66 61 63 65 28 29 20 7b 0a 20 20 20  nterface() {.   
04a0: 20 74 68 69 73 2e 63 61 6e 76 61 73 2e 65 6c 65   this.canvas.ele
04b0: 6d 65 6e 74 2e 73 74 79 6c 65 2e 62 61 63 6b 67  ment.style.backg
04c0: 72 6f 75 6e 64 43 6f 6c 6f 72 20 3d 20 74 68 69  roundColor = thi
04d0: 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 3b 0a 20  s.colors.fill;. 
04e0: 20 7d 0a 0a 20 20 72 65 6e 64 65 72 28 29 20 7b   }..  render() {
04f0: 0a 20 20 20 20 69 66 20 28 74 68 69 73 2e 61 63  .    if (this.ac
0500: 74 69 76 65 29 20 7b 0a 20 20 20 20 20 20 72 65  tive) {.      re
0510: 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46 72  questAnimationFr
0520: 61 6d 65 28 74 68 69 73 2e 72 65 6e 64 65 72 2e  ame(this.render.
0530: 62 69 6e 64 28 74 68 69 73 29 29 3b 0a 20 20 20  bind(this));.   
0540: 20 7d 0a 0a 20 20 20 20 74 68 69 73 2e 63 61 6e   }..    this.can
0550: 76 61 73 2e 63 6f 6e 74 65 78 74 2e 66 69 6c 6c  vas.context.fill
0560: 53 74 79 6c 65 20 3d 20 74 68 69 73 2e 63 6f 6c  Style = this.col
0570: 6f 72 73 2e 66 69 6c 6c 3b 0a 20 20 20 20 74 68  ors.fill;.    th
0580: 69 73 2e 63 61 6e 76 61 73 2e 63 6f 6e 74 65 78  is.canvas.contex
0590: 74 2e 66 69 6c 6c 52 65 63 74 28 0a 20 20 20 20  t.fillRect(.    
05a0: 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
05b0: 20 20 20 20 74 68 69 73 2e 63 61 6e 76 61 73 2e      this.canvas.
05c0: 65 6c 65 6d 65 6e 74 2e 77 69 64 74 68 2c 0a 20  element.width,. 
05d0: 20 20 20 20 20 74 68 69 73 2e 63 61 6e 76 61 73       this.canvas
05e0: 2e 65 6c 65 6d 65 6e 74 2e 68 65 69 67 68 74 0a  .element.height.
05f0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 66 6f 72 20      );..    for 
0600: 28 6c 65 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (let i = 0; i < 
0610: 74 68 69 73 2e 61 6e 61 6c 79 73 65 72 73 2e 6c  this.analysers.l
0620: 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b 0a 20 20  ength; i++) {.  
0630: 20 20 20 20 69 66 20 28 74 68 69 73 2e 73 6f 75      if (this.sou
0640: 72 63 65 29 20 7b 0a 20 20 20 20 20 20 20 20 74  rce) {.        t
0650: 68 69 73 2e 61 6e 61 6c 79 73 65 72 73 5b 69 5d  his.analysers[i]
0660: 2e 67 65 74 46 6c 6f 61 74 54 69 6d 65 44 6f 6d  .getFloatTimeDom
0670: 61 69 6e 44 61 74 61 28 74 68 69 73 2e 64 61 74  ainData(this.dat
0680: 61 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20 20  aArray);..      
0690: 20 20 6c 65 74 20 72 6d 73 20 3d 20 30 3b 0a 0a    let rms = 0;..
06a0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
06b0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 74 68 69 73   i = 0; i < this
06c0: 2e 64 61 74 61 41 72 72 61 79 2e 6c 65 6e 67 74  .dataArray.lengt
06d0: 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  h; i++) {.      
06e0: 20 20 20 20 72 6d 73 20 2b 3d 20 74 68 69 73 2e      rms += this.
06f0: 64 61 74 61 41 72 72 61 79 5b 69 5d 20 2a 20 74  dataArray[i] * t
0700: 68 69 73 2e 64 61 74 61 41 72 72 61 79 5b 69 5d  his.dataArray[i]
0710: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
0720: 20 20 20 20 20 72 6d 73 20 3d 20 4d 61 74 68 2e       rms = Math.
0730: 73 71 72 74 28 72 6d 73 20 2f 20 74 68 69 73 2e  sqrt(rms / this.
0740: 64 61 74 61 41 72 72 61 79 2e 6c 65 6e 67 74 68  dataArray.length
0750: 29 3b 0a 0a 20 20 20 20 20 20 20 20 74 68 69 73  );..        this
0760: 2e 64 62 20 3d 20 32 30 20 2a 20 4d 61 74 68 2e  .db = 20 * Math.
0770: 6c 6f 67 31 30 28 72 6d 73 29 3b 0a 20 20 20 20  log10(rms);.    
0780: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 68 69    } else if (thi
0790: 73 2e 64 62 20 3e 20 2d 32 30 30 20 26 26 20 74  s.db > -200 && t
07a0: 68 69 73 2e 64 62 20 21 3d 3d 20 2d 49 6e 66 69  his.db !== -Infi
07b0: 6e 69 74 79 29 20 7b 0a 20 20 20 20 20 20 20 20  nity) {.        
07c0: 74 68 69 73 2e 64 62 20 2d 3d 20 31 3b 0a 20 20  this.db -= 1;.  
07d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
07e0: 20 20 20 20 20 74 68 69 73 2e 64 62 20 3d 20 2d       this.db = -
07f0: 49 6e 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  Infinity;.      
0800: 7d 0a 0a 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f  }..      //conso
0810: 6c 65 2e 6c 6f 67 28 64 62 29 0a 0a 20 20 20 20  le.log(db)..    
0820: 20 20 69 66 20 28 74 68 69 73 2e 64 62 20 3e 20    if (this.db > 
0830: 2d 37 30 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  -70) {.        l
0840: 65 74 20 6c 69 6e 65 61 72 20 3d 20 6d 61 74 68  et linear = math
0850: 2e 6e 6f 72 6d 61 6c 69 7a 65 28 74 68 69 73 2e  .normalize(this.
0860: 64 62 2c 20 2d 37 30 2c 20 35 29 3b 0a 20 20 20  db, -70, 5);.   
0870: 20 20 20 20 20 6c 65 74 20 65 78 70 20 3d 20 6c       let exp = l
0880: 69 6e 65 61 72 20 2a 20 6c 69 6e 65 61 72 3b 0a  inear * linear;.
0890: 20 20 20 20 20 20 20 20 6c 65 74 20 79 20 3d 20          let y = 
08a0: 6d 61 74 68 2e 73 63 61 6c 65 28 65 78 70 2c 20  math.scale(exp, 
08b0: 30 2c 20 31 2c 20 74 68 69 73 2e 65 6c 65 6d 65  0, 1, this.eleme
08c0: 6e 74 2e 68 65 69 67 68 74 2c 20 30 29 3b 0a 0a  nt.height, 0);..
08d0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 63 61 6e          this.can
08e0: 76 61 73 2e 63 6f 6e 74 65 78 74 2e 66 69 6c 6c  vas.context.fill
08f0: 53 74 79 6c 65 20 3d 20 74 68 69 73 2e 63 6f 6c  Style = this.col
0900: 6f 72 73 2e 61 63 63 65 6e 74 3b 0a 20 20 20 20  ors.accent;.    
0910: 20 20 20 20 74 68 69 73 2e 63 61 6e 76 61 73 2e      this.canvas.
0920: 63 6f 6e 74 65 78 74 2e 66 69 6c 6c 52 65 63 74  context.fillRect
0930: 28 0a 20 20 20 20 20 20 20 20 20 20 74 68 69 73  (.          this
0940: 2e 6d 65 74 65 72 57 69 64 74 68 20 2a 20 69 2c  .meterWidth * i,
0950: 0a 20 20 20 20 20 20 20 20 20 20 79 2c 0a 20 20  .          y,.  
0960: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6d 65 74          this.met
0970: 65 72 57 69 64 74 68 2c 0a 20 20 20 20 20 20 20  erWidth,.       
0980: 20 20 20 74 68 69 73 2e 63 61 6e 76 61 73 2e 65     this.canvas.e
0990: 6c 65 6d 65 6e 74 2e 68 65 69 67 68 74 20 2d 20  lement.height - 
09a0: 79 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20  y.        );..  
09b0: 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e        //console.
09c0: 6c 6f 67 28 22 72 65 6e 64 65 72 69 6e 67 2e 2e  log("rendering..
09d0: 2e 22 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .").      }.    
09e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 0a 20 20 45  }.  }..  /**.  E
09f0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 70 61  quivalent to "pa
0a00: 74 63 68 69 6e 67 20 69 6e 22 20 61 6e 20 61 75  tching in" an au
0a10: 64 69 6f 20 6e 6f 64 65 20 74 6f 20 76 69 73 75  dio node to visu
0a20: 61 6c 69 7a 65 2e 0a 20 20 40 70 61 72 61 6d 20  alize..  @param 
0a30: 6e 6f 64 65 20 7b 41 75 64 69 6f 4e 6f 64 65 7d  node {AudioNode}
0a40: 20 54 68 65 20 61 75 64 69 6f 20 6e 6f 64 65 20   The audio node 
0a50: 74 6f 20 76 69 73 75 61 6c 69 7a 65 0a 20 20 40  to visualize.  @
0a60: 70 61 72 61 6d 20 63 68 61 6e 6e 65 6c 73 20 7b  param channels {
0a70: 6e 75 6d 62 65 72 7d 20 28 6f 70 74 69 6f 6e 61  number} (optiona
0a80: 6c 29 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  l) The number of
0a90: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65   channels in the
0aa0: 20 73 6f 75 72 63 65 20 6e 6f 64 65 20 74 6f 20   source node to 
0ab0: 77 61 74 63 68 2e 20 49 66 20 6e 6f 74 20 73 70  watch. If not sp
0ac0: 65 63 69 66 69 65 64 2c 20 74 68 65 20 69 6e 74  ecified, the int
0ad0: 65 72 66 61 63 65 20 77 69 6c 6c 20 6c 6f 6f 6b  erface will look
0ae0: 20 66 6f 72 20 61 20 2e 63 68 61 6e 6e 65 6c 43   for a .channelC
0af0: 6f 75 6e 74 20 70 72 6f 70 65 72 74 79 20 6f 6e  ount property on
0b00: 20 74 68 65 20 69 6e 70 75 74 20 6e 6f 64 65 2e   the input node.
0b10: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   If it does not 
0b20: 65 78 69 73 74 2c 20 74 68 65 20 69 6e 74 65 72  exist, the inter
0b30: 66 61 63 65 20 77 69 6c 6c 20 64 65 66 61 75 6c  face will defaul
0b40: 74 20 74 6f 20 31 20 63 68 61 6e 6e 65 6c 2e 0a  t to 1 channel..
0b50: 20 20 40 65 78 61 6d 70 6c 65 20 6d 65 74 65 72    @example meter
0b60: 2e 63 6f 6e 6e 65 63 74 28 20 54 6f 6e 65 2e 4d  .connect( Tone.M
0b70: 61 73 74 65 72 2c 20 32 20 29 3b 0a 20 20 2a 2f  aster, 2 );.  */
0b80: 0a 20 20 63 6f 6e 6e 65 63 74 28 6e 6f 64 65 2c  .  connect(node,
0b90: 20 63 68 61 6e 6e 65 6c 73 29 20 7b 0a 20 20 20   channels) {.   
0ba0: 20 69 66 20 28 74 68 69 73 2e 73 6f 75 72 63 65   if (this.source
0bb0: 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e 64  ) {.      this.d
0bc0: 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 20 20 20  isconnect();.   
0bd0: 20 7d 0a 0a 20 20 20 20 74 68 69 73 2e 63 68 61   }..    this.cha
0be0: 6e 6e 65 6c 73 20 3d 20 63 68 61 6e 6e 65 6c 73  nnels = channels
0bf0: 20 7c 7c 20 6e 6f 64 65 2e 63 68 61 6e 6e 65 6c   || node.channel
0c00: 43 6f 75 6e 74 20 7c 7c 20 32 3b 0a 0a 20 20 20  Count || 2;..   
0c10: 20 74 68 69 73 2e 73 70 6c 69 74 74 65 72 20 3d   this.splitter =
0c20: 20 6e 6f 64 65 2e 63 6f 6e 74 65 78 74 2e 63 72   node.context.cr
0c30: 65 61 74 65 43 68 61 6e 6e 65 6c 53 70 6c 69 74  eateChannelSplit
0c40: 74 65 72 28 74 68 69 73 2e 63 68 61 6e 6e 65 6c  ter(this.channel
0c50: 73 29 3b 0a 0a 20 20 20 20 74 68 69 73 2e 61 6e  s);..    this.an
0c60: 61 6c 79 73 65 72 73 20 3d 20 5b 5d 3b 0a 20 20  alysers = [];.  
0c70: 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 30    for (let i = 0
0c80: 3b 20 69 20 3c 20 74 68 69 73 2e 63 68 61 6e 6e  ; i < this.chann
0c90: 65 6c 73 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  els; i++) {.    
0ca0: 20 20 63 6f 6e 73 74 20 61 6e 61 6c 79 73 65 72    const analyser
0cb0: 20 3d 20 6e 6f 64 65 2e 63 6f 6e 74 65 78 74 2e   = node.context.
0cc0: 63 72 65 61 74 65 41 6e 61 6c 79 73 65 72 28 29  createAnalyser()
0cd0: 3b 0a 20 20 20 20 20 20 61 6e 61 6c 79 73 65 72  ;.      analyser
0ce0: 2e 66 66 74 53 69 7a 65 20 3d 20 31 30 32 34 3b  .fftSize = 1024;
0cf0: 0a 20 20 20 20 20 20 61 6e 61 6c 79 73 65 72 2e  .      analyser.
0d00: 73 6d 6f 6f 74 68 69 6e 67 54 69 6d 65 43 6f 6e  smoothingTimeCon
0d10: 73 74 61 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  stant = 1;.     
0d20: 20 74 68 69 73 2e 73 70 6c 69 74 74 65 72 2e 63   this.splitter.c
0d30: 6f 6e 6e 65 63 74 28 61 6e 61 6c 79 73 65 72 2c  onnect(analyser,
0d40: 20 69 29 3b 0a 20 20 20 20 20 20 74 68 69 73 2e   i);.      this.
0d50: 61 6e 61 6c 79 73 65 72 73 2e 70 75 73 68 28 61  analysers.push(a
0d60: 6e 61 6c 79 73 65 72 29 3b 0a 20 20 20 20 7d 0a  nalyser);.    }.
0d70: 20 20 20 20 74 68 69 73 2e 62 75 66 66 65 72 4c      this.bufferL
0d80: 65 6e 67 74 68 20 3d 20 74 68 69 73 2e 61 6e 61  ength = this.ana
0d90: 6c 79 73 65 72 73 5b 30 5d 2e 66 72 65 71 75 65  lysers[0].freque
0da0: 6e 63 79 42 69 6e 43 6f 75 6e 74 3b 0a 20 20 20  ncyBinCount;.   
0db0: 20 74 68 69 73 2e 64 61 74 61 41 72 72 61 79 20   this.dataArray 
0dc0: 3d 20 6e 65 77 20 46 6c 6f 61 74 33 32 41 72 72  = new Float32Arr
0dd0: 61 79 28 74 68 69 73 2e 62 75 66 66 65 72 4c 65  ay(this.bufferLe
0de0: 6e 67 74 68 29 3b 0a 0a 20 20 20 20 74 68 69 73  ngth);..    this
0df0: 2e 61 63 74 69 76 65 20 3d 20 74 72 75 65 3b 0a  .active = true;.
0e00: 0a 20 20 20 20 74 68 69 73 2e 6d 65 74 65 72 57  .    this.meterW
0e10: 69 64 74 68 20 3d 20 74 68 69 73 2e 63 61 6e 76  idth = this.canv
0e20: 61 73 2e 65 6c 65 6d 65 6e 74 2e 77 69 64 74 68  as.element.width
0e30: 20 2f 20 74 68 69 73 2e 63 68 61 6e 6e 65 6c 73   / this.channels
0e40: 3b 0a 0a 20 20 20 20 74 68 69 73 2e 73 6f 75 72  ;..    this.sour
0e50: 63 65 20 3d 20 6e 6f 64 65 3b 0a 20 20 20 20 74  ce = node;.    t
0e60: 68 69 73 2e 73 6f 75 72 63 65 2e 63 6f 6e 6e 65  his.source.conne
0e70: 63 74 28 74 68 69 73 2e 73 70 6c 69 74 74 65 72  ct(this.splitter
0e80: 29 3b 0a 0a 20 20 20 20 74 68 69 73 2e 72 65 6e  );..    this.ren
0e90: 64 65 72 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  der();.  }..  /*
0ea0: 2a 0a 20 20 53 74 6f 70 20 76 69 73 75 61 6c 69  *.  Stop visuali
0eb0: 7a 69 6e 67 20 74 68 65 20 73 6f 75 72 63 65 20  zing the source 
0ec0: 6e 6f 64 65 20 61 6e 64 20 64 69 73 63 6f 6e 6e  node and disconn
0ed0: 65 63 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ect it..  */.  d
0ee0: 69 73 63 6f 6e 6e 65 63 74 28 29 20 7b 0a 20 20  isconnect() {.  
0ef0: 20 20 69 66 20 28 74 68 69 73 2e 73 6f 75 72 63    if (this.sourc
0f00: 65 29 20 7b 0a 20 20 20 20 20 20 74 68 69 73 2e  e) {.      this.
0f10: 73 6f 75 72 63 65 2e 64 69 73 63 6f 6e 6e 65 63  source.disconnec
0f20: 74 28 74 68 69 73 2e 73 70 6c 69 74 74 65 72 29  t(this.splitter)
0f30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 68 69  ;.    }..    thi
0f40: 73 2e 73 70 6c 69 74 74 65 72 20 3d 20 6e 75 6c  s.splitter = nul
0f50: 6c 3b 0a 20 20 20 20 74 68 69 73 2e 61 6e 61 6c  l;.    this.anal
0f60: 79 73 65 72 73 20 3d 20 5b 5d 3b 0a 20 20 20 20  ysers = [];.    
0f70: 74 68 69 73 2e 62 75 66 66 65 72 4c 65 6e 67 74  this.bufferLengt
0f80: 68 20 3d 20 30 3b 0a 20 20 20 20 74 68 69 73 2e  h = 0;.    this.
0f90: 64 61 74 61 41 72 72 61 79 20 3d 20 6e 75 6c 6c  dataArray = null
0fa0: 3b 0a 20 20 20 20 74 68 69 73 2e 61 63 74 69 76  ;.    this.activ
0fb0: 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 74  e = false;.    t
0fc0: 68 69 73 2e 73 6f 75 72 63 65 20 3d 20 6e 75 6c  his.source = nul
0fd0: 6c 3b 0a 20 20 7d 0a 0a 20 20 63 6c 69 63 6b 28  l;.  }..  click(
0fe0: 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 61 63 74  ) {.    this.act
0ff0: 69 76 65 20 3d 20 21 74 68 69 73 2e 61 63 74 69  ive = !this.acti
1000: 76 65 20 26 26 20 74 68 69 73 2e 73 6f 75 72 63  ve && this.sourc
1010: 65 3b 0a 20 20 20 20 74 68 69 73 2e 72 65 6e 64  e;.    this.rend
1020: 65 72 28 29 3b 0a 20 20 7d 0a 0a 20 20 63 75 73  er();.  }..  cus
1030: 74 6f 6d 44 65 73 74 72 6f 79 28 29 20 7b 0a 20  tomDestroy() {. 
1040: 20 20 20 74 68 69 73 2e 61 63 74 69 76 65 20 3d     this.active =
1050: 20 66 61 6c 73 65 3b 0a 20 20 7d 0a 7d 0a         false;.  }.}.