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;. }.}.