Artifact
30e971a9328416bd094ca72ef4b5f0a7565f44d33ae82414b5fb728d5f209693:
0000: 76 61 72 20 6b 6e 6f 77 6c 65 64 67 65 20 3d 20 var knowledge =
0010: 72 65 71 75 69 72 65 28 27 2e 2f 6b 6e 6f 77 6c require('./knowl
0020: 65 64 67 65 27 29 3b 0a 76 61 72 20 76 65 63 74 edge');.var vect
0030: 6f 72 20 3d 20 72 65 71 75 69 72 65 28 27 2e 2f or = require('./
0040: 76 65 63 74 6f 72 27 29 3b 0a 76 61 72 20 74 6f vector');.var to
0050: 43 6f 6f 72 64 20 3d 20 72 65 71 75 69 72 65 28 Coord = require(
0060: 27 69 6e 74 65 72 76 61 6c 2d 63 6f 6f 72 64 73 'interval-coords
0070: 27 29 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20 49 6e ');..function In
0080: 74 65 72 76 61 6c 28 63 6f 6f 72 64 29 20 7b 0a terval(coord) {.
0090: 20 20 69 66 20 28 21 28 74 68 69 73 20 69 6e 73 if (!(this ins
00a0: 74 61 6e 63 65 6f 66 20 49 6e 74 65 72 76 61 6c tanceof Interval
00b0: 29 29 20 72 65 74 75 72 6e 20 6e 65 77 20 49 6e )) return new In
00c0: 74 65 72 76 61 6c 28 63 6f 6f 72 64 29 3b 0a 20 terval(coord);.
00d0: 20 74 68 69 73 2e 63 6f 6f 72 64 20 3d 20 63 6f this.coord = co
00e0: 6f 72 64 3b 0a 7d 0a 0a 49 6e 74 65 72 76 61 6c ord;.}..Interval
00f0: 2e 70 72 6f 74 6f 74 79 70 65 20 3d 20 7b 0a 20 .prototype = {.
0100: 20 6e 61 6d 65 3a 20 66 75 6e 63 74 69 6f 6e 28 name: function(
0110: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6b ) {. return k
0120: 6e 6f 77 6c 65 64 67 65 2e 69 6e 74 65 72 76 61 nowledge.interva
0130: 6c 73 49 6e 64 65 78 5b 74 68 69 73 2e 6e 75 6d lsIndex[this.num
0140: 62 65 72 28 29 20 2d 20 31 5d 3b 0a 20 20 7d 2c ber() - 1];. },
0150: 0a 0a 20 20 73 65 6d 69 74 6f 6e 65 73 3a 20 66 .. semitones: f
0160: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 unction() {.
0170: 72 65 74 75 72 6e 20 76 65 63 74 6f 72 2e 73 75 return vector.su
0180: 6d 28 76 65 63 74 6f 72 2e 6d 75 6c 28 74 68 69 m(vector.mul(thi
0190: 73 2e 63 6f 6f 72 64 2c 20 5b 31 32 2c 20 37 5d s.coord, [12, 7]
01a0: 29 29 3b 0a 20 20 7d 2c 0a 0a 20 20 6e 75 6d 62 ));. },.. numb
01b0: 65 72 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b er: function() {
01c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4d 61 74 68 . return Math
01d0: 2e 61 62 73 28 74 68 69 73 2e 76 61 6c 75 65 28 .abs(this.value(
01e0: 29 29 3b 0a 20 20 7d 2c 0a 0a 20 20 76 61 6c 75 ));. },.. valu
01f0: 65 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a e: function() {.
0200: 20 20 20 20 76 61 72 20 74 6f 4d 75 6c 74 69 70 var toMultip
0210: 6c 79 20 3d 20 4d 61 74 68 2e 66 6c 6f 6f 72 28 ly = Math.floor(
0220: 28 74 68 69 73 2e 63 6f 6f 72 64 5b 31 5d 20 2d (this.coord[1] -
0230: 20 32 29 20 2f 20 37 29 20 2b 20 31 3b 0a 20 20 2) / 7) + 1;.
0240: 20 20 76 61 72 20 70 72 6f 64 75 63 74 20 3d 20 var product =
0250: 76 65 63 74 6f 72 2e 6d 75 6c 28 6b 6e 6f 77 6c vector.mul(knowl
0260: 65 64 67 65 2e 73 68 61 72 70 2c 20 74 6f 4d 75 edge.sharp, toMu
0270: 6c 74 69 70 6c 79 29 3b 0a 20 20 20 20 76 61 72 ltiply);. var
0280: 20 77 69 74 68 6f 75 74 20 3d 20 76 65 63 74 6f without = vecto
0290: 72 2e 73 75 62 28 74 68 69 73 2e 63 6f 6f 72 64 r.sub(this.coord
02a0: 2c 20 70 72 6f 64 75 63 74 29 3b 0a 20 20 20 20 , product);.
02b0: 76 61 72 20 69 20 3d 20 6b 6e 6f 77 6c 65 64 67 var i = knowledg
02c0: 65 2e 69 6e 74 65 72 76 61 6c 46 72 6f 6d 46 69 e.intervalFromFi
02d0: 66 74 68 5b 77 69 74 68 6f 75 74 5b 31 5d 20 2b fth[without[1] +
02e0: 20 35 5d 3b 0a 20 20 20 20 76 61 72 20 64 69 66 5];. var dif
02f0: 66 20 3d 20 77 69 74 68 6f 75 74 5b 30 5d 20 2d f = without[0] -
0300: 20 6b 6e 6f 77 6c 65 64 67 65 2e 69 6e 74 65 72 knowledge.inter
0310: 76 61 6c 73 5b 69 5d 5b 30 5d 3b 0a 20 20 20 20 vals[i][0];.
0320: 76 61 72 20 76 61 6c 20 3d 20 6b 6e 6f 77 6c 65 var val = knowle
0330: 64 67 65 2e 73 74 65 70 4e 75 6d 62 65 72 5b 69 dge.stepNumber[i
0340: 5d 20 2b 20 64 69 66 66 20 2a 20 37 3b 0a 0a 20 ] + diff * 7;..
0350: 20 20 20 72 65 74 75 72 6e 20 28 76 61 6c 20 3e return (val >
0360: 20 30 29 20 3f 20 76 61 6c 20 3a 20 76 61 6c 20 0) ? val : val
0370: 2d 20 32 3b 0a 20 20 7d 2c 0a 0a 20 20 74 79 70 - 2;. },.. typ
0380: 65 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a e: function() {.
0390: 20 20 20 20 72 65 74 75 72 6e 20 6b 6e 6f 77 6c return knowl
03a0: 65 64 67 65 2e 69 6e 74 65 72 76 61 6c 73 5b 74 edge.intervals[t
03b0: 68 69 73 2e 62 61 73 65 28 29 5d 5b 30 5d 20 3c his.base()][0] <
03c0: 3d 20 31 20 3f 20 27 70 65 72 66 65 63 74 27 20 = 1 ? 'perfect'
03d0: 3a 20 27 6d 69 6e 6f 72 27 3b 0a 20 20 7d 2c 0a : 'minor';. },.
03e0: 0a 20 20 62 61 73 65 3a 20 66 75 6e 63 74 69 6f . base: functio
03f0: 6e 28 29 20 7b 0a 20 20 20 20 76 61 72 20 70 72 n() {. var pr
0400: 6f 64 75 63 74 20 3d 20 76 65 63 74 6f 72 2e 6d oduct = vector.m
0410: 75 6c 28 6b 6e 6f 77 6c 65 64 67 65 2e 73 68 61 ul(knowledge.sha
0420: 72 70 2c 20 74 68 69 73 2e 71 75 61 6c 69 74 79 rp, this.quality
0430: 56 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 76 61 Value());. va
0440: 72 20 66 69 66 74 68 20 3d 20 76 65 63 74 6f 72 r fifth = vector
0450: 2e 73 75 62 28 74 68 69 73 2e 63 6f 6f 72 64 2c .sub(this.coord,
0460: 20 70 72 6f 64 75 63 74 29 5b 31 5d 3b 0a 20 20 product)[1];.
0470: 20 20 66 69 66 74 68 20 3d 20 74 68 69 73 2e 76 fifth = this.v
0480: 61 6c 75 65 28 29 20 3e 20 30 20 3f 20 66 69 66 alue() > 0 ? fif
0490: 74 68 20 2b 20 35 20 3a 20 2d 28 66 69 66 74 68 th + 5 : -(fifth
04a0: 20 2d 20 35 29 20 25 20 37 3b 0a 20 20 20 20 66 - 5) % 7;. f
04b0: 69 66 74 68 20 3d 20 66 69 66 74 68 20 3c 20 30 ifth = fifth < 0
04c0: 20 3f 20 6b 6e 6f 77 6c 65 64 67 65 2e 69 6e 74 ? knowledge.int
04d0: 65 72 76 61 6c 46 72 6f 6d 46 69 66 74 68 2e 6c ervalFromFifth.l
04e0: 65 6e 67 74 68 20 2b 20 66 69 66 74 68 20 3a 20 ength + fifth :
04f0: 66 69 66 74 68 3b 0a 0a 20 20 20 20 76 61 72 20 fifth;.. var
0500: 6e 61 6d 65 20 3d 20 6b 6e 6f 77 6c 65 64 67 65 name = knowledge
0510: 2e 69 6e 74 65 72 76 61 6c 46 72 6f 6d 46 69 66 .intervalFromFif
0520: 74 68 5b 66 69 66 74 68 5d 3b 0a 20 20 20 20 69 th[fifth];. i
0530: 66 20 28 6e 61 6d 65 20 3d 3d 3d 20 27 75 6e 69 f (name === 'uni
0540: 73 6f 6e 27 20 26 26 20 74 68 69 73 2e 6e 75 6d son' && this.num
0550: 62 65 72 28 29 20 3e 3d 20 38 29 0a 20 20 20 20 ber() >= 8).
0560: 20 20 6e 61 6d 65 20 3d 20 27 6f 63 74 61 76 65 name = 'octave
0570: 27 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6e ';.. return n
0580: 61 6d 65 3b 0a 20 20 7d 2c 0a 0a 20 20 64 69 72 ame;. },.. dir
0590: 65 63 74 69 6f 6e 3a 20 66 75 6e 63 74 69 6f 6e ection: function
05a0: 28 64 69 72 29 20 7b 0a 20 20 20 20 69 66 20 28 (dir) {. if (
05b0: 64 69 72 29 20 7b 0a 20 20 20 20 20 20 76 61 72 dir) {. var
05c0: 20 69 73 20 3d 20 74 68 69 73 2e 76 61 6c 75 65 is = this.value
05d0: 28 29 20 3e 3d 20 31 20 3f 20 27 75 70 27 20 3a () >= 1 ? 'up' :
05e0: 20 27 64 6f 77 6e 27 3b 0a 20 20 20 20 20 20 69 'down';. i
05f0: 66 20 28 69 73 20 21 3d 3d 20 64 69 72 29 0a 20 f (is !== dir).
0600: 20 20 20 20 20 20 20 74 68 69 73 2e 63 6f 6f 72 this.coor
0610: 64 20 3d 20 76 65 63 74 6f 72 2e 6d 75 6c 28 74 d = vector.mul(t
0620: 68 69 73 2e 63 6f 6f 72 64 2c 20 2d 31 29 3b 0a his.coord, -1);.
0630: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 . return th
0640: 69 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c is;. }. el
0650: 73 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 se. return
0660: 74 68 69 73 2e 76 61 6c 75 65 28 29 20 3e 3d 20 this.value() >=
0670: 31 20 3f 20 27 75 70 27 20 3a 20 27 64 6f 77 6e 1 ? 'up' : 'down
0680: 27 3b 0a 20 20 7d 2c 0a 0a 20 20 73 69 6d 70 6c ';. },.. simpl
0690: 65 3a 20 66 75 6e 63 74 69 6f 6e 28 69 67 6e 6f e: function(igno
06a0: 72 65 29 20 7b 0a 20 20 20 20 2f 2f 20 47 65 74 re) {. // Get
06b0: 20 74 68 65 20 28 75 70 77 61 72 64 73 29 20 62 the (upwards) b
06c0: 61 73 65 20 69 6e 74 65 72 76 61 6c 20 28 77 69 ase interval (wi
06d0: 74 68 20 71 75 61 6c 69 74 79 29 0a 20 20 20 20 th quality).
06e0: 76 61 72 20 73 69 6d 70 6c 65 20 3d 20 6b 6e 6f var simple = kno
06f0: 77 6c 65 64 67 65 2e 69 6e 74 65 72 76 61 6c 73 wledge.intervals
0700: 5b 74 68 69 73 2e 62 61 73 65 28 29 5d 3b 0a 20 [this.base()];.
0710: 20 20 20 76 61 72 20 74 6f 41 64 64 20 3d 20 76 var toAdd = v
0720: 65 63 74 6f 72 2e 6d 75 6c 28 6b 6e 6f 77 6c 65 ector.mul(knowle
0730: 64 67 65 2e 73 68 61 72 70 2c 20 74 68 69 73 2e dge.sharp, this.
0740: 71 75 61 6c 69 74 79 56 61 6c 75 65 28 29 29 3b qualityValue());
0750: 0a 20 20 20 20 73 69 6d 70 6c 65 20 3d 20 76 65 . simple = ve
0760: 63 74 6f 72 2e 61 64 64 28 73 69 6d 70 6c 65 2c ctor.add(simple,
0770: 20 74 6f 41 64 64 29 3b 0a 0a 20 20 20 20 2f 2f toAdd);.. //
0780: 20 54 75 72 6e 20 69 74 20 61 72 6f 75 6e 64 20 Turn it around
0790: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 20 if necessary.
07a0: 20 69 66 20 28 21 69 67 6e 6f 72 65 29 0a 20 20 if (!ignore).
07b0: 20 20 20 20 73 69 6d 70 6c 65 20 3d 20 74 68 69 simple = thi
07c0: 73 2e 64 69 72 65 63 74 69 6f 6e 28 29 20 3d 3d s.direction() ==
07d0: 3d 20 27 64 6f 77 6e 27 20 3f 20 76 65 63 74 6f = 'down' ? vecto
07e0: 72 2e 6d 75 6c 28 73 69 6d 70 6c 65 2c 20 2d 31 r.mul(simple, -1
07f0: 29 20 3a 20 73 69 6d 70 6c 65 3b 0a 0a 20 20 20 ) : simple;..
0800: 20 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 65 return new Inte
0810: 72 76 61 6c 28 73 69 6d 70 6c 65 29 3b 0a 20 20 rval(simple);.
0820: 7d 2c 0a 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64 },.. isCompound
0830: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 : function() {.
0840: 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e 6e return this.n
0850: 75 6d 62 65 72 28 29 20 3e 20 38 3b 0a 20 20 7d umber() > 8;. }
0860: 2c 0a 0a 20 20 6f 63 74 61 76 65 73 3a 20 66 75 ,.. octaves: fu
0870: 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 76 nction() {. v
0880: 61 72 20 74 6f 53 75 62 74 72 61 63 74 2c 20 77 ar toSubtract, w
0890: 69 74 68 6f 75 74 2c 20 6f 63 74 61 76 65 73 3b ithout, octaves;
08a0: 0a 0a 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 .. if (this.d
08b0: 69 72 65 63 74 69 6f 6e 28 29 20 3d 3d 3d 20 27 irection() === '
08c0: 75 70 27 29 20 7b 0a 20 20 20 20 20 20 74 6f 53 up') {. toS
08d0: 75 62 74 72 61 63 74 20 3d 20 76 65 63 74 6f 72 ubtract = vector
08e0: 2e 6d 75 6c 28 6b 6e 6f 77 6c 65 64 67 65 2e 73 .mul(knowledge.s
08f0: 68 61 72 70 2c 20 74 68 69 73 2e 71 75 61 6c 69 harp, this.quali
0900: 74 79 56 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 tyValue());.
0910: 20 20 77 69 74 68 6f 75 74 20 3d 20 76 65 63 74 without = vect
0920: 6f 72 2e 73 75 62 28 74 68 69 73 2e 63 6f 6f 72 or.sub(this.coor
0930: 64 2c 20 74 6f 53 75 62 74 72 61 63 74 29 3b 0a d, toSubtract);.
0940: 20 20 20 20 20 20 6f 63 74 61 76 65 73 20 3d 20 octaves =
0950: 77 69 74 68 6f 75 74 5b 30 5d 20 2d 20 6b 6e 6f without[0] - kno
0960: 77 6c 65 64 67 65 2e 69 6e 74 65 72 76 61 6c 73 wledge.intervals
0970: 5b 74 68 69 73 2e 62 61 73 65 28 29 5d 5b 30 5d [this.base()][0]
0980: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 ;. } else {.
0990: 20 20 20 20 20 74 6f 53 75 62 74 72 61 63 74 20 toSubtract
09a0: 3d 20 76 65 63 74 6f 72 2e 6d 75 6c 28 6b 6e 6f = vector.mul(kno
09b0: 77 6c 65 64 67 65 2e 73 68 61 72 70 2c 20 2d 74 wledge.sharp, -t
09c0: 68 69 73 2e 71 75 61 6c 69 74 79 56 61 6c 75 65 his.qualityValue
09d0: 28 29 29 3b 0a 20 20 20 20 20 20 77 69 74 68 6f ());. witho
09e0: 75 74 20 3d 20 76 65 63 74 6f 72 2e 73 75 62 28 ut = vector.sub(
09f0: 74 68 69 73 2e 63 6f 6f 72 64 2c 20 74 6f 53 75 this.coord, toSu
0a00: 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 6f btract);. o
0a10: 63 74 61 76 65 73 20 3d 20 2d 28 77 69 74 68 6f ctaves = -(witho
0a20: 75 74 5b 30 5d 20 2b 20 6b 6e 6f 77 6c 65 64 67 ut[0] + knowledg
0a30: 65 2e 69 6e 74 65 72 76 61 6c 73 5b 74 68 69 73 e.intervals[this
0a40: 2e 62 61 73 65 28 29 5d 5b 30 5d 29 3b 0a 20 20 .base()][0]);.
0a50: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
0a60: 6f 63 74 61 76 65 73 3b 0a 20 20 7d 2c 0a 0a 20 octaves;. },..
0a70: 20 69 6e 76 65 72 74 3a 20 66 75 6e 63 74 69 6f invert: functio
0a80: 6e 28 29 20 7b 0a 20 20 20 20 76 61 72 20 69 20 n() {. var i
0a90: 3d 20 74 68 69 73 2e 62 61 73 65 28 29 3b 0a 20 = this.base();.
0aa0: 20 20 20 76 61 72 20 71 75 61 6c 20 3d 20 74 68 var qual = th
0ab0: 69 73 2e 71 75 61 6c 69 74 79 56 61 6c 75 65 28 is.qualityValue(
0ac0: 29 3b 0a 20 20 20 20 76 61 72 20 61 63 63 20 3d );. var acc =
0ad0: 20 74 68 69 73 2e 74 79 70 65 28 29 20 3d 3d 3d this.type() ===
0ae0: 20 27 6d 69 6e 6f 72 27 20 3f 20 2d 28 71 75 61 'minor' ? -(qua
0af0: 6c 20 2d 20 31 29 20 3a 20 2d 71 75 61 6c 3b 0a l - 1) : -qual;.
0b00: 20 20 20 20 76 61 72 20 69 64 78 20 3d 20 39 20 var idx = 9
0b10: 2d 20 6b 6e 6f 77 6c 65 64 67 65 2e 73 74 65 70 - knowledge.step
0b20: 4e 75 6d 62 65 72 5b 69 5d 20 2d 20 31 3b 0a 20 Number[i] - 1;.
0b30: 20 20 20 76 61 72 20 63 6f 6f 72 64 20 3d 20 6b var coord = k
0b40: 6e 6f 77 6c 65 64 67 65 2e 69 6e 74 65 72 76 61 nowledge.interva
0b50: 6c 73 5b 6b 6e 6f 77 6c 65 64 67 65 2e 69 6e 74 ls[knowledge.int
0b60: 65 72 76 61 6c 73 49 6e 64 65 78 5b 69 64 78 5d ervalsIndex[idx]
0b70: 5d 3b 0a 20 20 20 20 63 6f 6f 72 64 20 3d 20 76 ];. coord = v
0b80: 65 63 74 6f 72 2e 61 64 64 28 63 6f 6f 72 64 2c ector.add(coord,
0b90: 20 76 65 63 74 6f 72 2e 6d 75 6c 28 6b 6e 6f 77 vector.mul(know
0ba0: 6c 65 64 67 65 2e 73 68 61 72 70 2c 20 61 63 63 ledge.sharp, acc
0bb0: 29 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 ));.. return
0bc0: 6e 65 77 20 49 6e 74 65 72 76 61 6c 28 63 6f 6f new Interval(coo
0bd0: 72 64 29 3b 0a 20 20 7d 2c 0a 0a 20 20 71 75 61 rd);. },.. qua
0be0: 6c 69 74 79 3a 20 66 75 6e 63 74 69 6f 6e 28 6c lity: function(l
0bf0: 6e 67 29 20 7b 0a 20 20 20 20 76 61 72 20 71 75 ng) {. var qu
0c00: 61 6c 69 74 79 20 3d 20 6b 6e 6f 77 6c 65 64 67 ality = knowledg
0c10: 65 2e 61 6c 74 65 72 61 74 69 6f 6e 73 5b 74 68 e.alterations[th
0c20: 69 73 2e 74 79 70 65 28 29 5d 5b 74 68 69 73 2e is.type()][this.
0c30: 71 75 61 6c 69 74 79 56 61 6c 75 65 28 29 20 2b qualityValue() +
0c40: 20 32 5d 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 2];.. return
0c50: 20 6c 6e 67 20 3f 20 6b 6e 6f 77 6c 65 64 67 65 lng ? knowledge
0c60: 2e 71 75 61 6c 69 74 79 4c 6f 6e 67 5b 71 75 61 .qualityLong[qua
0c70: 6c 69 74 79 5d 20 3a 20 71 75 61 6c 69 74 79 3b lity] : quality;
0c80: 0a 20 20 7d 2c 0a 0a 20 20 71 75 61 6c 69 74 79 . },.. quality
0c90: 56 61 6c 75 65 3a 20 66 75 6e 63 74 69 6f 6e 28 Value: function(
0ca0: 29 20 7b 0a 20 20 20 20 69 66 20 28 74 68 69 73 ) {. if (this
0cb0: 2e 64 69 72 65 63 74 69 6f 6e 28 29 20 3d 3d 3d .direction() ===
0cc0: 20 27 64 6f 77 6e 27 29 0a 20 20 20 20 20 20 72 'down'). r
0cd0: 65 74 75 72 6e 20 4d 61 74 68 2e 66 6c 6f 6f 72 eturn Math.floor
0ce0: 28 28 2d 74 68 69 73 2e 63 6f 6f 72 64 5b 31 5d ((-this.coord[1]
0cf0: 20 2d 20 32 29 20 2f 20 37 29 20 2b 20 31 3b 0a - 2) / 7) + 1;.
0d00: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 72 else. r
0d10: 65 74 75 72 6e 20 4d 61 74 68 2e 66 6c 6f 6f 72 eturn Math.floor
0d20: 28 28 74 68 69 73 2e 63 6f 6f 72 64 5b 31 5d 20 ((this.coord[1]
0d30: 2d 20 32 29 20 2f 20 37 29 20 2b 20 31 3b 0a 20 - 2) / 7) + 1;.
0d40: 20 7d 2c 0a 0a 20 20 65 71 75 61 6c 3a 20 66 75 },.. equal: fu
0d50: 6e 63 74 69 6f 6e 28 69 6e 74 65 72 76 61 6c 29 nction(interval)
0d60: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 {. return
0d70: 74 68 69 73 2e 63 6f 6f 72 64 5b 30 5d 20 3d 3d this.coord[0] ==
0d80: 3d 20 69 6e 74 65 72 76 61 6c 2e 63 6f 6f 72 64 = interval.coord
0d90: 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 [0] &&.
0da0: 20 74 68 69 73 2e 63 6f 6f 72 64 5b 31 5d 20 3d this.coord[1] =
0db0: 3d 3d 20 69 6e 74 65 72 76 61 6c 2e 63 6f 6f 72 == interval.coor
0dc0: 64 5b 31 5d 3b 0a 20 20 7d 2c 0a 0a 20 20 67 72 d[1];. },.. gr
0dd0: 65 61 74 65 72 3a 20 66 75 6e 63 74 69 6f 6e 28 eater: function(
0de0: 69 6e 74 65 72 76 61 6c 29 20 7b 0a 20 20 20 20 interval) {.
0df0: 76 61 72 20 73 65 6d 69 20 3d 20 74 68 69 73 2e var semi = this.
0e00: 73 65 6d 69 74 6f 6e 65 73 28 29 3b 0a 20 20 20 semitones();.
0e10: 20 76 61 72 20 69 73 65 6d 69 20 3d 20 69 6e 74 var isemi = int
0e20: 65 72 76 61 6c 2e 73 65 6d 69 74 6f 6e 65 73 28 erval.semitones(
0e30: 29 3b 0a 0a 20 20 20 20 2f 2f 20 49 66 20 65 71 );.. // If eq
0e40: 75 61 6c 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 ual in absolute
0e50: 73 69 7a 65 2c 20 6d 65 61 73 75 72 65 20 77 68 size, measure wh
0e60: 69 63 68 20 69 6e 74 65 72 76 61 6c 20 69 73 20 ich interval is
0e70: 62 69 67 67 65 72 0a 20 20 20 20 2f 2f 20 46 6f bigger. // Fo
0e80: 72 20 65 78 61 6d 70 6c 65 20 50 34 20 69 73 20 r example P4 is
0e90: 62 69 67 67 65 72 20 74 68 61 6e 20 41 33 0a 20 bigger than A3.
0ea0: 20 20 20 72 65 74 75 72 6e 20 28 73 65 6d 69 20 return (semi
0eb0: 3d 3d 3d 20 69 73 65 6d 69 29 20 3f 0a 20 20 20 === isemi) ?.
0ec0: 20 20 20 28 74 68 69 73 2e 6e 75 6d 62 65 72 28 (this.number(
0ed0: 29 20 3e 20 69 6e 74 65 72 76 61 6c 2e 6e 75 6d ) > interval.num
0ee0: 62 65 72 28 29 29 20 3a 20 28 73 65 6d 69 20 3e ber()) : (semi >
0ef0: 20 69 73 65 6d 69 29 3b 0a 20 20 7d 2c 0a 0a 20 isemi);. },..
0f00: 20 73 6d 61 6c 6c 65 72 3a 20 66 75 6e 63 74 69 smaller: functi
0f10: 6f 6e 28 69 6e 74 65 72 76 61 6c 29 20 7b 0a 20 on(interval) {.
0f20: 20 20 20 72 65 74 75 72 6e 20 21 74 68 69 73 2e return !this.
0f30: 65 71 75 61 6c 28 69 6e 74 65 72 76 61 6c 29 20 equal(interval)
0f40: 26 26 20 21 74 68 69 73 2e 67 72 65 61 74 65 72 && !this.greater
0f50: 28 69 6e 74 65 72 76 61 6c 29 3b 0a 20 20 7d 2c (interval);. },
0f60: 0a 0a 20 20 61 64 64 3a 20 66 75 6e 63 74 69 6f .. add: functio
0f70: 6e 28 69 6e 74 65 72 76 61 6c 29 20 7b 0a 20 20 n(interval) {.
0f80: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 return new Int
0f90: 65 72 76 61 6c 28 76 65 63 74 6f 72 2e 61 64 64 erval(vector.add
0fa0: 28 74 68 69 73 2e 63 6f 6f 72 64 2c 20 69 6e 74 (this.coord, int
0fb0: 65 72 76 61 6c 2e 63 6f 6f 72 64 29 29 3b 0a 20 erval.coord));.
0fc0: 20 7d 2c 0a 0a 20 20 74 6f 53 74 72 69 6e 67 3a },.. toString:
0fd0: 20 66 75 6e 63 74 69 6f 6e 28 69 67 6e 6f 72 65 function(ignore
0fe0: 29 20 7b 0a 20 20 20 20 2f 2f 20 49 66 20 67 69 ) {. // If gi
0ff0: 76 65 6e 20 74 72 75 65 2c 20 72 65 74 75 72 6e ven true, return
1000: 20 74 68 65 20 70 6f 73 69 74 69 76 65 20 76 61 the positive va
1010: 6c 75 65 0a 20 20 20 20 76 61 72 20 6e 75 6d 62 lue. var numb
1020: 65 72 20 3d 20 69 67 6e 6f 72 65 20 3f 20 74 68 er = ignore ? th
1030: 69 73 2e 6e 75 6d 62 65 72 28 29 20 3a 20 74 68 is.number() : th
1040: 69 73 2e 76 61 6c 75 65 28 29 3b 0a 0a 20 20 20 is.value();..
1050: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 71 75 61 return this.qua
1060: 6c 69 74 79 28 29 20 2b 20 6e 75 6d 62 65 72 3b lity() + number;
1070: 0a 20 20 7d 0a 7d 3b 0a 0a 49 6e 74 65 72 76 61 . }.};..Interva
1080: 6c 2e 74 6f 43 6f 6f 72 64 20 3d 20 66 75 6e 63 l.toCoord = func
1090: 74 69 6f 6e 28 73 69 6d 70 6c 65 29 20 7b 0a 20 tion(simple) {.
10a0: 20 76 61 72 20 63 6f 6f 72 64 20 3d 20 74 6f 43 var coord = toC
10b0: 6f 6f 72 64 28 73 69 6d 70 6c 65 29 3b 0a 20 20 oord(simple);.
10c0: 69 66 20 28 21 63 6f 6f 72 64 29 0a 20 20 20 20 if (!coord).
10d0: 74 68 72 6f 77 20 6e 65 77 20 45 72 72 6f 72 28 throw new Error(
10e0: 27 49 6e 76 61 6c 69 64 20 73 69 6d 70 6c 65 20 'Invalid simple
10f0: 66 6f 72 6d 61 74 20 69 6e 74 65 72 76 61 6c 27 format interval'
1100: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 );.. return new
1110: 20 49 6e 74 65 72 76 61 6c 28 63 6f 6f 72 64 29 Interval(coord)
1120: 3b 0a 7d 3b 0a 0a 49 6e 74 65 72 76 61 6c 2e 66 ;.};..Interval.f
1130: 72 6f 6d 20 3d 20 66 75 6e 63 74 69 6f 6e 28 66 rom = function(f
1140: 72 6f 6d 2c 20 74 6f 29 20 7b 0a 20 20 72 65 74 rom, to) {. ret
1150: 75 72 6e 20 66 72 6f 6d 2e 69 6e 74 65 72 76 61 urn from.interva
1160: 6c 28 74 6f 29 3b 0a 7d 3b 0a 0a 49 6e 74 65 72 l(to);.};..Inter
1170: 76 61 6c 2e 62 65 74 77 65 65 6e 20 3d 20 66 75 val.between = fu
1180: 6e 63 74 69 6f 6e 28 66 72 6f 6d 2c 20 74 6f 29 nction(from, to)
1190: 20 7b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 20 {. return new
11a0: 49 6e 74 65 72 76 61 6c 28 76 65 63 74 6f 72 2e Interval(vector.
11b0: 73 75 62 28 74 6f 2e 63 6f 6f 72 64 2c 20 66 72 sub(to.coord, fr
11c0: 6f 6d 2e 63 6f 6f 72 64 29 29 3b 0a 7d 3b 0a 0a om.coord));.};..
11d0: 49 6e 74 65 72 76 61 6c 2e 69 6e 76 65 72 74 20 Interval.invert
11e0: 3d 20 66 75 6e 63 74 69 6f 6e 28 73 49 6e 74 65 = function(sInte
11f0: 72 76 61 6c 29 20 7b 0a 20 20 72 65 74 75 72 6e rval) {. return
1200: 20 49 6e 74 65 72 76 61 6c 2e 74 6f 43 6f 6f 72 Interval.toCoor
1210: 64 28 73 49 6e 74 65 72 76 61 6c 29 2e 69 6e 76 d(sInterval).inv
1220: 65 72 74 28 29 2e 74 6f 53 74 72 69 6e 67 28 29 ert().toString()
1230: 3b 0a 7d 3b 0a 0a 6d 6f 64 75 6c 65 2e 65 78 70 ;.};..module.exp
1240: 6f 72 74 73 20 3d 20 49 6e 74 65 72 76 61 6c 3b orts = Interval;
1250: 0a .