⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 57433372d1d82c07553ed7273aea1a8da43ebbf2c74e45a10b1fe04f7a7f4d88:


0000: 27 75 73 65 20 73 74 72 69 63 74 27 3b 0a 0a 69  'use strict';..i
0010: 6d 70 6f 72 74 20 6d 61 74 68 20 66 72 6f 6d 20  mport math from 
0020: 27 2e 2e 2f 75 74 69 6c 2f 6d 61 74 68 27 3b 0a  '../util/math';.
0030: 0a 65 78 70 6f 72 74 20 64 65 66 61 75 6c 74 20  .export default 
0040: 63 6c 61 73 73 20 54 75 6e 65 20 7b 0a 20 20 63  class Tune {.  c
0050: 6f 6e 73 74 72 75 63 74 6f 72 28 29 20 7b 0a 20  onstructor() {. 
0060: 20 20 20 2f 2f 20 74 68 65 20 73 63 61 6c 65 20     // the scale 
0070: 61 73 20 72 61 74 69 6f 73 0a 20 20 20 20 74 68  as ratios.    th
0080: 69 73 2e 73 63 61 6c 65 20 3d 20 5b 5d 3b 0a 0a  is.scale = [];..
0090: 20 20 20 20 2f 2f 20 69 2f 6f 20 6d 6f 64 65 73      // i/o modes
00a0: 0a 20 20 20 20 74 68 69 73 2e 6d 6f 64 65 20 3d  .    this.mode =
00b0: 20 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 3a   {.      output:
00c0: 20 27 66 72 65 71 75 65 6e 63 79 27 2c 0a 20 20   'frequency',.  
00d0: 20 20 20 20 69 6e 70 75 74 3a 20 27 73 74 65 70      input: 'step
00e0: 27 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 2f 2f  '.    };..    //
00f0: 20 45 54 20 6d 61 6a 6f 72 0a 20 20 20 20 74 68   ET major.    th
0100: 69 73 2e 65 74 6d 61 6a 6f 72 20 3d 20 5b 0a 20  is.etmajor = [. 
0110: 20 20 20 20 20 32 36 31 2e 36 32 35 35 38 2c 0a       261.62558,.
0120: 20 20 20 20 20 20 32 39 33 2e 36 36 34 37 36 34        293.664764
0130: 2c 0a 20 20 20 20 20 20 33 32 39 2e 36 32 37 35  ,.      329.6275
0140: 36 33 2c 0a 20 20 20 20 20 20 33 34 39 2e 32 32  63,.      349.22
0150: 38 32 34 31 2c 0a 20 20 20 20 20 20 33 39 31 2e  8241,.      391.
0160: 39 39 35 34 32 32 2c 0a 20 20 20 20 20 20 34 34  995422,.      44
0170: 30 2c 0a 20 20 20 20 20 20 34 39 33 2e 38 38 33  0,.      493.883
0180: 33 30 31 2c 0a 20 20 20 20 20 20 35 32 33 2e 32  301,.      523.2
0190: 35 31 31 36 0a 20 20 20 20 5d 3b 0a 0a 20 20 20  5116.    ];..   
01a0: 20 2f 2f 20 52 6f 6f 74 20 66 72 65 71 75 65 6e   // Root frequen
01b0: 63 79 2e 0a 20 20 20 20 74 68 69 73 2e 72 6f 6f  cy..    this.roo
01c0: 74 20 3d 20 6d 61 74 68 2e 6d 74 6f 66 28 36 30  t = math.mtof(60
01d0: 29 3b 20 2f 2f 20 2a 20 4d 61 74 68 2e 70 6f 77  ); // * Math.pow
01e0: 28 32 2c 28 36 30 2d 36 39 29 2f 31 32 29 3b 0a  (2,(60-69)/12);.
01f0: 0a 20 20 20 20 2f 2f 20 64 65 66 61 75 6c 74 20  .    // default 
0200: 69 73 20 61 20 6d 61 6a 6f 72 20 73 63 61 6c 65  is a major scale
0210: 0a 20 20 20 20 74 68 69 73 2e 63 72 65 61 74 65  .    this.create
0220: 53 63 61 6c 65 28 30 2c 20 32 2c 20 34 2c 20 35  Scale(0, 2, 4, 5
0230: 2c 20 37 2c 20 39 2c 20 31 31 29 3b 0a 20 20 7d  , 7, 9, 11);.  }
0240: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 64 61  ..  /* Return da
0250: 74 61 20 69 6e 20 74 68 65 20 6d 6f 64 65 20 79  ta in the mode y
0260: 6f 75 20 61 72 65 20 69 6e 20 28 66 72 65 71 2c  ou are in (freq,
0270: 20 72 61 74 69 6f 2c 20 6f 72 20 6d 69 64 69 29   ratio, or midi)
0280: 20 2a 2f 0a 20 20 6e 6f 74 65 28 69 6e 70 75 74   */.  note(input
0290: 2c 20 6f 63 74 61 76 65 29 20 7b 0a 20 20 20 20  , octave) {.    
02a0: 6c 65 74 20 6e 65 77 76 61 6c 75 65 3b 0a 0a 20  let newvalue;.. 
02b0: 20 20 20 69 66 20 28 74 68 69 73 2e 6d 6f 64 65     if (this.mode
02c0: 2e 6f 75 74 70 75 74 20 3d 3d 3d 20 27 66 72 65  .output === 'fre
02d0: 71 75 65 6e 63 79 27 29 20 7b 0a 20 20 20 20 20  quency') {.     
02e0: 20 6e 65 77 76 61 6c 75 65 20 3d 20 74 68 69 73   newvalue = this
02f0: 2e 66 72 65 71 75 65 6e 63 79 28 69 6e 70 75 74  .frequency(input
0300: 2c 20 6f 63 74 61 76 65 29 3b 0a 20 20 20 20 7d  , octave);.    }
0310: 20 65 6c 73 65 20 69 66 20 28 74 68 69 73 2e 6d   else if (this.m
0320: 6f 64 65 2e 6f 75 74 70 75 74 20 3d 3d 3d 20 27  ode.output === '
0330: 72 61 74 69 6f 27 29 20 7b 0a 20 20 20 20 20 20  ratio') {.      
0340: 6e 65 77 76 61 6c 75 65 20 3d 20 74 68 69 73 2e  newvalue = this.
0350: 72 61 74 69 6f 28 69 6e 70 75 74 2c 20 6f 63 74  ratio(input, oct
0360: 61 76 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ave);.    } else
0370: 20 69 66 20 28 74 68 69 73 2e 6d 6f 64 65 2e 6f   if (this.mode.o
0380: 75 74 70 75 74 20 3d 3d 3d 20 27 4d 49 44 49 27  utput === 'MIDI'
0390: 29 20 7b 0a 20 20 20 20 20 20 6e 65 77 76 61 6c  ) {.      newval
03a0: 75 65 20 3d 20 74 68 69 73 2e 4d 49 44 49 28 69  ue = this.MIDI(i
03b0: 6e 70 75 74 2c 20 6f 63 74 61 76 65 29 3b 0a 20  nput, octave);. 
03c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
03d0: 20 20 6e 65 77 76 61 6c 75 65 20 3d 20 74 68 69    newvalue = thi
03e0: 73 2e 66 72 65 71 75 65 6e 63 79 28 69 6e 70 75  s.frequency(inpu
03f0: 74 2c 20 6f 63 74 61 76 65 29 3b 0a 20 20 20 20  t, octave);.    
0400: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 65  }..    return ne
0410: 77 76 61 6c 75 65 3b 0a 20 20 7d 0a 0a 20 20 2f  wvalue;.  }..  /
0420: 2a 20 52 65 74 75 72 6e 20 66 72 65 71 20 64 61  * Return freq da
0430: 74 61 20 2a 2f 0a 20 20 66 72 65 71 75 65 6e 63  ta */.  frequenc
0440: 79 28 73 74 65 70 49 6e 2c 20 6f 63 74 61 76 65  y(stepIn, octave
0450: 49 6e 29 20 7b 0a 20 20 20 20 69 66 20 28 74 68  In) {.    if (th
0460: 69 73 2e 6d 6f 64 65 2e 69 6e 70 75 74 20 3d 3d  is.mode.input ==
0470: 3d 20 27 6d 69 64 69 27 20 7c 7c 20 74 68 69 73  = 'midi' || this
0480: 2e 6d 6f 64 65 2e 69 6e 70 75 74 20 3d 3d 3d 20  .mode.input === 
0490: 27 4d 49 44 49 27 29 20 7b 0a 20 20 20 20 20 20  'MIDI') {.      
04a0: 74 68 69 73 2e 73 74 65 70 49 6e 20 2b 3d 20 36  this.stepIn += 6
04b0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  0;.    }..    //
04c0: 20 77 68 61 74 20 6f 63 74 61 76 65 20 69 73 20   what octave is 
04d0: 6f 75 72 20 69 6e 70 75 74 0a 20 20 20 20 6c 65  our input.    le
04e0: 74 20 6f 63 74 61 76 65 20 3d 20 4d 61 74 68 2e  t octave = Math.
04f0: 66 6c 6f 6f 72 28 73 74 65 70 49 6e 20 2f 20 74  floor(stepIn / t
0500: 68 69 73 2e 73 63 61 6c 65 2e 6c 65 6e 67 74 68  his.scale.length
0510: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 63 74 61  );..    if (octa
0520: 76 65 49 6e 29 20 7b 0a 20 20 20 20 20 20 6f 63  veIn) {.      oc
0530: 74 61 76 65 20 2b 3d 20 6f 63 74 61 76 65 49 6e  tave += octaveIn
0540: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  ;.    }..    // 
0550: 77 68 69 63 68 20 73 63 61 6c 65 20 64 65 67 72  which scale degr
0560: 65 65 20 28 30 20 2d 20 73 63 61 6c 65 20 6c 65  ee (0 - scale le
0570: 6e 67 74 68 29 20 69 73 20 6f 75 72 20 69 6e 70  ngth) is our inp
0580: 75 74 0a 20 20 20 20 6c 65 74 20 73 63 61 6c 65  ut.    let scale
0590: 44 65 67 72 65 65 20 3d 20 73 74 65 70 49 6e 20  Degree = stepIn 
05a0: 25 20 74 68 69 73 2e 73 63 61 6c 65 2e 6c 65 6e  % this.scale.len
05b0: 67 74 68 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20  gth;..    while 
05c0: 28 73 63 61 6c 65 44 65 67 72 65 65 20 3c 20 30  (scaleDegree < 0
05d0: 29 20 7b 0a 20 20 20 20 20 20 73 63 61 6c 65 44  ) {.      scaleD
05e0: 65 67 72 65 65 20 2b 3d 20 74 68 69 73 2e 73 63  egree += this.sc
05f0: 61 6c 65 2e 6c 65 6e 67 74 68 3b 0a 20 20 20 20  ale.length;.    
0600: 7d 0a 0a 20 20 20 20 6c 65 74 20 72 61 74 69 6f  }..    let ratio
0610: 20 3d 20 74 68 69 73 2e 73 63 61 6c 65 5b 73 63   = this.scale[sc
0620: 61 6c 65 44 65 67 72 65 65 5d 3b 0a 0a 20 20 20  aleDegree];..   
0630: 20 6c 65 74 20 66 72 65 71 20 3d 20 74 68 69 73   let freq = this
0640: 2e 72 6f 6f 74 20 2a 20 72 61 74 69 6f 3b 0a 0a  .root * ratio;..
0650: 20 20 20 20 66 72 65 71 20 3d 20 66 72 65 71 20      freq = freq 
0660: 2a 20 4d 61 74 68 2e 70 6f 77 28 32 2c 20 6f 63  * Math.pow(2, oc
0670: 74 61 76 65 29 3b 0a 0a 20 20 20 20 2f 2f 20 74  tave);..    // t
0680: 72 75 6e 63 61 74 65 20 69 72 72 61 74 69 6f 6e  runcate irration
0690: 61 6c 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 66  al numbers.    f
06a0: 72 65 71 20 3d 20 4d 61 74 68 2e 66 6c 6f 6f 72  req = Math.floor
06b0: 28 66 72 65 71 20 2a 20 31 30 30 30 30 30 30 30  (freq * 10000000
06c0: 30 30 30 30 29 20 2f 20 31 30 30 30 30 30 30 30  0000) / 10000000
06d0: 30 30 30 30 3b 0a 0a 20 20 20 20 72 65 74 75 72  0000;..    retur
06e0: 6e 20 66 72 65 71 3b 0a 20 20 7d 0a 0a 20 20 2f  n freq;.  }..  /
06f0: 2a 20 46 6f 72 63 65 20 72 65 74 75 72 6e 20 72  * Force return r
0700: 61 74 69 6f 20 64 61 74 61 20 2a 2f 0a 0a 20 20  atio data */..  
0710: 72 61 74 69 6f 28 73 74 65 70 49 6e 2c 20 6f 63  ratio(stepIn, oc
0720: 74 61 76 65 49 6e 29 20 7b 0a 20 20 20 20 69 66  taveIn) {.    if
0730: 20 28 74 68 69 73 2e 6d 6f 64 65 2e 69 6e 70 75   (this.mode.inpu
0740: 74 20 3d 3d 3d 20 27 6d 69 64 69 27 20 7c 7c 20  t === 'midi' || 
0750: 74 68 69 73 2e 6d 6f 64 65 2e 69 6e 70 75 74 20  this.mode.input 
0760: 3d 3d 3d 20 27 4d 49 44 49 27 29 20 7b 0a 20 20  === 'MIDI') {.  
0770: 20 20 20 20 74 68 69 73 2e 73 74 65 70 49 6e 20      this.stepIn 
0780: 2b 3d 20 36 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  += 60;.    }..  
0790: 20 20 2f 2f 20 77 68 61 74 20 6f 63 74 61 76 65    // what octave
07a0: 20 69 73 20 6f 75 72 20 69 6e 70 75 74 0a 20 20   is our input.  
07b0: 20 20 6c 65 74 20 6f 63 74 61 76 65 20 3d 20 4d    let octave = M
07c0: 61 74 68 2e 66 6c 6f 6f 72 28 73 74 65 70 49 6e  ath.floor(stepIn
07d0: 20 2f 20 74 68 69 73 2e 73 63 61 6c 65 2e 6c 65   / this.scale.le
07e0: 6e 67 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 28  ngth);..    if (
07f0: 6f 63 74 61 76 65 49 6e 29 20 7b 0a 20 20 20 20  octaveIn) {.    
0800: 20 20 6f 63 74 61 76 65 20 2b 3d 20 6f 63 74 61    octave += octa
0810: 76 65 49 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  veIn;.    }..   
0820: 20 2f 2f 20 77 68 69 63 68 20 73 63 61 6c 65 20   // which scale 
0830: 64 65 67 72 65 65 20 28 30 20 2d 20 73 63 61 6c  degree (0 - scal
0840: 65 20 6c 65 6e 67 74 68 29 20 69 73 20 6f 75 72  e length) is our
0850: 20 69 6e 70 75 74 0a 20 20 20 20 6c 65 74 20 73   input.    let s
0860: 63 61 6c 65 44 65 67 72 65 65 20 3d 20 73 74 65  caleDegree = ste
0870: 70 49 6e 20 25 20 74 68 69 73 2e 73 63 61 6c 65  pIn % this.scale
0880: 2e 6c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 2f 2f  .length;..    //
0890: 20 77 68 61 74 20 72 61 74 69 6f 20 69 73 20 6f   what ratio is o
08a0: 75 72 20 69 6e 70 75 74 20 74 6f 20 6f 75 72 20  ur input to our 
08b0: 6b 65 79 0a 20 20 20 20 6c 65 74 20 72 61 74 69  key.    let rati
08c0: 6f 20 3d 20 4d 61 74 68 2e 70 6f 77 28 32 2c 20  o = Math.pow(2, 
08d0: 6f 63 74 61 76 65 29 20 2a 20 74 68 69 73 2e 73  octave) * this.s
08e0: 63 61 6c 65 5b 73 63 61 6c 65 44 65 67 72 65 65  cale[scaleDegree
08f0: 5d 3b 0a 0a 20 20 20 20 72 61 74 69 6f 20 3d 20  ];..    ratio = 
0900: 4d 61 74 68 2e 66 6c 6f 6f 72 28 72 61 74 69 6f  Math.floor(ratio
0910: 20 2a 20 31 30 30 30 30 30 30 30 30 30 30 30 29   * 100000000000)
0920: 20 2f 20 31 30 30 30 30 30 30 30 30 30 30 30 3b   / 100000000000;
0930: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 61 74  ..    return rat
0940: 69 6f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  io;.  }..  /* Fo
0950: 72 63 65 20 72 65 74 75 72 6e 20 61 64 6a 75 73  rce return adjus
0960: 74 65 64 20 4d 49 44 49 20 64 61 74 61 20 2a 2f  ted MIDI data */
0970: 0a 0a 20 20 4d 49 44 49 28 73 74 65 70 49 6e 2c  ..  MIDI(stepIn,
0980: 20 6f 63 74 61 76 65 49 6e 29 20 7b 0a 20 20 20   octaveIn) {.   
0990: 20 6c 65 74 20 6e 65 77 76 61 6c 75 65 20 3d 20   let newvalue = 
09a0: 74 68 69 73 2e 66 72 65 71 75 65 6e 63 79 28 73  this.frequency(s
09b0: 74 65 70 49 6e 2c 20 6f 63 74 61 76 65 49 6e 29  tepIn, octaveIn)
09c0: 3b 0a 0a 20 20 20 20 6c 65 74 20 6e 20 3d 20 36  ;..    let n = 6
09d0: 39 20 2b 20 28 31 32 20 2a 20 4d 61 74 68 2e 6c  9 + (12 * Math.l
09e0: 6f 67 28 6e 65 77 76 61 6c 75 65 20 2f 20 34 34  og(newvalue / 44
09f0: 30 29 29 20 2f 20 4d 61 74 68 2e 6c 6f 67 28 32  0)) / Math.log(2
0a00: 29 3b 0a 0a 20 20 20 20 6e 20 3d 20 4d 61 74 68  );..    n = Math
0a10: 2e 66 6c 6f 6f 72 28 6e 20 2a 20 31 30 30 30 30  .floor(n * 10000
0a20: 30 30 30 30 30 29 20 2f 20 31 30 30 30 30 30 30  00000) / 1000000
0a30: 30 30 30 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  000;..    return
0a40: 20 6e 3b 0a 20 20 7d 0a 0a 20 20 63 72 65 61 74   n;.  }..  creat
0a50: 65 53 63 61 6c 65 28 29 20 7b 0a 20 20 20 20 6c  eScale() {.    l
0a60: 65 74 20 6e 65 77 53 63 61 6c 65 20 3d 20 5b 5d  et newScale = []
0a70: 3b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69  ;.    for (let i
0a80: 20 3d 20 30 3b 20 69 20 3c 20 61 72 67 75 6d 65   = 0; i < argume
0a90: 6e 74 73 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b 29  nts.length; i++)
0aa0: 20 7b 0a 20 20 20 20 20 20 6e 65 77 53 63 61 6c   {.      newScal
0ab0: 65 2e 70 75 73 68 28 6d 61 74 68 2e 6d 74 6f 66  e.push(math.mtof
0ac0: 28 36 30 20 2b 20 61 72 67 75 6d 65 6e 74 73 5b  (60 + arguments[
0ad0: 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
0ae0: 74 68 69 73 2e 6c 6f 61 64 53 63 61 6c 65 46 72  this.loadScaleFr
0af0: 6f 6d 46 72 65 71 75 65 6e 63 69 65 73 28 6e 65  omFrequencies(ne
0b00: 77 53 63 61 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  wScale);.  }..  
0b10: 63 72 65 61 74 65 4a 49 53 63 61 6c 65 28 29 20  createJIScale() 
0b20: 7b 0a 20 20 20 20 74 68 69 73 2e 73 63 61 6c 65  {.    this.scale
0b30: 20 3d 20 5b 5d 3b 0a 20 20 20 20 66 6f 72 20 28   = [];.    for (
0b40: 6c 65 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 61  let i = 0; i < a
0b50: 72 67 75 6d 65 6e 74 73 2e 6c 65 6e 67 74 68 3b  rguments.length;
0b60: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 74 68   i++) {.      th
0b70: 69 73 2e 73 63 61 6c 65 2e 70 75 73 68 28 61 72  is.scale.push(ar
0b80: 67 75 6d 65 6e 74 73 5b 69 5d 29 3b 0a 20 20 20  guments[i]);.   
0b90: 20 7d 0a 20 20 7d 0a 0a 20 20 6c 6f 61 64 53 63   }.  }..  loadSc
0ba0: 61 6c 65 46 72 6f 6d 46 72 65 71 75 65 6e 63 69  aleFromFrequenci
0bb0: 65 73 28 66 72 65 71 73 29 20 7b 0a 20 20 20 20  es(freqs) {.    
0bc0: 74 68 69 73 2e 73 63 61 6c 65 20 3d 20 5b 5d 3b  this.scale = [];
0bd0: 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20  .    for (let i 
0be0: 3d 20 30 3b 20 69 20 3c 20 66 72 65 71 73 2e 6c  = 0; i < freqs.l
0bf0: 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b 0a 20 20  ength; i++) {.  
0c00: 20 20 20 20 74 68 69 73 2e 73 63 61 6c 65 2e 70      this.scale.p
0c10: 75 73 68 28 66 72 65 71 73 5b 69 5d 20 2f 20 66  ush(freqs[i] / f
0c20: 72 65 71 73 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  reqs[0]);.    }.
0c30: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61    }..  /* Load a
0c40: 20 6e 65 77 20 73 63 61 6c 65 20 2a 2f 0a 0a 20   new scale */.. 
0c50: 20 6c 6f 61 64 53 63 61 6c 65 28 6e 61 6d 65 29   loadScale(name)
0c60: 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f 61 64 20 74   {.    /* load t
0c70: 68 65 20 73 63 61 6c 65 20 2a 2f 0a 20 20 20 20  he scale */.    
0c80: 6c 65 74 20 66 72 65 71 73 20 3d 20 74 68 69 73  let freqs = this
0c90: 2e 73 63 61 6c 65 73 5b 6e 61 6d 65 5d 2e 66 72  .scales[name].fr
0ca0: 65 71 75 65 6e 63 69 65 73 3b 0a 20 20 20 20 74  equencies;.    t
0cb0: 68 69 73 2e 6c 6f 61 64 53 63 61 6c 65 46 72 6f  his.loadScaleFro
0cc0: 6d 46 72 65 71 75 65 6e 63 69 65 73 28 66 72 65  mFrequencies(fre
0cd0: 71 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  qs);.  }..  /* S
0ce0: 65 61 72 63 68 20 74 68 65 20 6e 61 6d 65 73 20  earch the names 
0cf0: 6f 66 20 74 75 6e 69 6e 67 73 0a 20 20 09 20 52  of tunings.  . R
0d00: 65 74 75 72 6e 73 20 61 6e 20 61 72 72 61 79 20  eturns an array 
0d10: 6f 66 20 6e 61 6d 65 73 20 6f 66 20 74 75 6e 69  of names of tuni
0d20: 6e 67 73 20 2a 2f 0a 0a 20 20 73 65 61 72 63 68  ngs */..  search
0d30: 28 6c 65 74 74 65 72 73 29 20 7b 0a 20 20 20 20  (letters) {.    
0d40: 6c 65 74 20 70 6f 73 73 69 62 6c 65 20 3d 20 5b  let possible = [
0d50: 5d 3b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20  ];.    for (let 
0d60: 6b 65 79 20 69 6e 20 74 68 69 73 2e 73 63 61 6c  key in this.scal
0d70: 65 73 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  es) {.      if (
0d80: 6b 65 79 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28  key.toLowerCase(
0d90: 29 2e 69 6e 64 65 78 4f 66 28 6c 65 74 74 65 72  ).indexOf(letter
0da0: 73 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 29  s.toLowerCase())
0db0: 20 21 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20   !== -1) {.     
0dc0: 20 20 20 70 6f 73 73 69 62 6c 65 2e 70 75 73 68     possible.push
0dd0: 28 6b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (key);.      }. 
0de0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
0df0: 70 6f 73 73 69 62 6c 65 3b 0a 20 20 7d 0a 0a 20  possible;.  }.. 
0e00: 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 6c   /* Return a col
0e10: 6c 65 63 74 69 6f 6e 20 6f 66 20 6e 6f 74 65 73  lection of notes
0e20: 20 61 73 20 61 6e 20 61 72 72 61 79 20 2a 2f 0a   as an array */.
0e30: 0a 20 20 63 68 6f 72 64 28 6d 69 64 69 73 29 20  .  chord(midis) 
0e40: 7b 0a 20 20 20 20 6c 65 74 20 6f 75 74 70 75 74  {.    let output
0e50: 20 3d 20 5b 5d 3b 0a 20 20 20 20 66 6f 72 20 28   = [];.    for (
0e60: 6c 65 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d  let i = 0; i < m
0e70: 69 64 69 73 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b  idis.length; i++
0e80: 29 20 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ) {.      output
0e90: 2e 70 75 73 68 28 74 68 69 73 2e 6e 6f 74 65 28  .push(this.note(
0ea0: 6d 69 64 69 73 5b 69 5d 29 29 3b 0a 20 20 20 20  midis[i]));.    
0eb0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 75 74  }.    return out
0ec0: 70 75 74 3b 0a 20 20 7d 0a 7d 0a                 put;.  }.}.