Artifact
453623810cc2c439c093319c73f786b84628244210f809f2dfd54afb62c428b4:
0000: 76 61 72 20 4e 6f 74 65 20 3d 20 72 65 71 75 69 var Note = requi
0010: 72 65 28 27 2e 2f 6c 69 62 2f 6e 6f 74 65 27 29 re('./lib/note')
0020: 3b 0a 76 61 72 20 49 6e 74 65 72 76 61 6c 20 3d ;.var Interval =
0030: 20 72 65 71 75 69 72 65 28 27 2e 2f 6c 69 62 2f require('./lib/
0040: 69 6e 74 65 72 76 61 6c 27 29 3b 0a 76 61 72 20 interval');.var
0050: 43 68 6f 72 64 20 3d 20 72 65 71 75 69 72 65 28 Chord = require(
0060: 27 2e 2f 6c 69 62 2f 63 68 6f 72 64 27 29 3b 0a './lib/chord');.
0070: 76 61 72 20 53 63 61 6c 65 20 3d 20 72 65 71 75 var Scale = requ
0080: 69 72 65 28 27 2e 2f 6c 69 62 2f 73 63 61 6c 65 ire('./lib/scale
0090: 27 29 3b 0a 0a 76 61 72 20 74 65 6f 72 69 61 3b ');..var teoria;
00a0: 0a 0a 2f 2f 20 6e 65 76 65 72 20 74 68 6f 75 67 ..// never thoug
00b0: 68 74 20 49 20 77 6f 75 6c 64 20 77 72 69 74 65 ht I would write
00c0: 20 74 68 69 73 2c 20 62 75 74 3a 20 4c 65 67 61 this, but: Lega
00d0: 63 79 20 73 75 70 70 6f 72 74 0a 66 75 6e 63 74 cy support.funct
00e0: 69 6f 6e 20 69 6e 74 65 72 76 61 6c 43 6f 6e 73 ion intervalCons
00f0: 74 72 75 63 74 6f 72 28 66 72 6f 6d 2c 20 74 6f tructor(from, to
0100: 29 20 7b 0a 20 20 2f 2f 20 43 6f 6e 73 74 72 75 ) {. // Constru
0110: 63 74 20 61 20 49 6e 74 65 72 76 61 6c 20 6f 62 ct a Interval ob
0120: 6a 65 63 74 20 66 72 6f 6d 20 73 74 72 69 6e 67 ject from string
0130: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a representation.
0140: 20 20 69 66 20 28 74 79 70 65 6f 66 20 66 72 6f if (typeof fro
0150: 6d 20 3d 3d 3d 20 27 73 74 72 69 6e 67 27 29 0a m === 'string').
0160: 20 20 20 20 72 65 74 75 72 6e 20 49 6e 74 65 72 return Inter
0170: 76 61 6c 2e 74 6f 43 6f 6f 72 64 28 66 72 6f 6d val.toCoord(from
0180: 29 3b 0a 0a 20 20 69 66 20 28 74 79 70 65 6f 66 );.. if (typeof
0190: 20 74 6f 20 3d 3d 3d 20 27 73 74 72 69 6e 67 27 to === 'string'
01a0: 20 26 26 20 66 72 6f 6d 20 69 6e 73 74 61 6e 63 && from instanc
01b0: 65 6f 66 20 4e 6f 74 65 29 0a 20 20 20 20 72 65 eof Note). re
01c0: 74 75 72 6e 20 49 6e 74 65 72 76 61 6c 2e 66 72 turn Interval.fr
01d0: 6f 6d 28 66 72 6f 6d 2c 20 49 6e 74 65 72 76 61 om(from, Interva
01e0: 6c 2e 74 6f 43 6f 6f 72 64 28 74 6f 29 29 3b 0a l.toCoord(to));.
01f0: 0a 20 20 69 66 20 28 74 6f 20 69 6e 73 74 61 6e . if (to instan
0200: 63 65 6f 66 20 49 6e 74 65 72 76 61 6c 20 26 26 ceof Interval &&
0210: 20 66 72 6f 6d 20 69 6e 73 74 61 6e 63 65 6f 66 from instanceof
0220: 20 4e 6f 74 65 29 0a 20 20 20 20 72 65 74 75 72 Note). retur
0230: 6e 20 49 6e 74 65 72 76 61 6c 2e 66 72 6f 6d 28 n Interval.from(
0240: 66 72 6f 6d 2c 20 74 6f 29 3b 0a 0a 20 20 69 66 from, to);.. if
0250: 20 28 74 6f 20 69 6e 73 74 61 6e 63 65 6f 66 20 (to instanceof
0260: 4e 6f 74 65 20 26 26 20 66 72 6f 6d 20 69 6e 73 Note && from ins
0270: 74 61 6e 63 65 6f 66 20 4e 6f 74 65 29 0a 20 20 tanceof Note).
0280: 20 20 72 65 74 75 72 6e 20 49 6e 74 65 72 76 61 return Interva
0290: 6c 2e 62 65 74 77 65 65 6e 28 66 72 6f 6d 2c 20 l.between(from,
02a0: 74 6f 29 3b 0a 0a 20 20 74 68 72 6f 77 20 6e 65 to);.. throw ne
02b0: 77 20 45 72 72 6f 72 28 27 49 6e 76 61 6c 69 64 w Error('Invalid
02c0: 20 70 61 72 61 6d 65 74 65 72 73 27 29 3b 0a 7d parameters');.}
02d0: 0a 0a 69 6e 74 65 72 76 61 6c 43 6f 6e 73 74 72 ..intervalConstr
02e0: 75 63 74 6f 72 2e 74 6f 43 6f 6f 72 64 20 3d 20 uctor.toCoord =
02f0: 49 6e 74 65 72 76 61 6c 2e 74 6f 43 6f 6f 72 64 Interval.toCoord
0300: 3b 0a 69 6e 74 65 72 76 61 6c 43 6f 6e 73 74 72 ;.intervalConstr
0310: 75 63 74 6f 72 2e 66 72 6f 6d 20 3d 20 49 6e 74 uctor.from = Int
0320: 65 72 76 61 6c 2e 66 72 6f 6d 3b 0a 69 6e 74 65 erval.from;.inte
0330: 72 76 61 6c 43 6f 6e 73 74 72 75 63 74 6f 72 2e rvalConstructor.
0340: 62 65 74 77 65 65 6e 20 3d 20 49 6e 74 65 72 76 between = Interv
0350: 61 6c 2e 62 65 74 77 65 65 6e 3b 0a 69 6e 74 65 al.between;.inte
0360: 72 76 61 6c 43 6f 6e 73 74 72 75 63 74 6f 72 2e rvalConstructor.
0370: 69 6e 76 65 72 74 20 3d 20 49 6e 74 65 72 76 61 invert = Interva
0380: 6c 2e 69 6e 76 65 72 74 3b 0a 0a 66 75 6e 63 74 l.invert;..funct
0390: 69 6f 6e 20 6e 6f 74 65 43 6f 6e 73 74 72 75 63 ion noteConstruc
03a0: 74 6f 72 28 6e 61 6d 65 2c 20 64 75 72 61 74 69 tor(name, durati
03b0: 6f 6e 29 20 7b 0a 20 20 69 66 20 28 74 79 70 65 on) {. if (type
03c0: 6f 66 20 6e 61 6d 65 20 3d 3d 3d 20 27 73 74 72 of name === 'str
03d0: 69 6e 67 27 29 0a 20 20 20 20 72 65 74 75 72 6e ing'). return
03e0: 20 4e 6f 74 65 2e 66 72 6f 6d 53 74 72 69 6e 67 Note.fromString
03f0: 28 6e 61 6d 65 2c 20 64 75 72 61 74 69 6f 6e 29 (name, duration)
0400: 3b 0a 20 20 65 6c 73 65 0a 20 20 20 20 72 65 74 ;. else. ret
0410: 75 72 6e 20 6e 65 77 20 4e 6f 74 65 28 6e 61 6d urn new Note(nam
0420: 65 2c 20 64 75 72 61 74 69 6f 6e 29 3b 0a 7d 0a e, duration);.}.
0430: 0a 6e 6f 74 65 43 6f 6e 73 74 72 75 63 74 6f 72 .noteConstructor
0440: 2e 66 72 6f 6d 53 74 72 69 6e 67 20 3d 20 4e 6f .fromString = No
0450: 74 65 2e 66 72 6f 6d 53 74 72 69 6e 67 3b 0a 6e te.fromString;.n
0460: 6f 74 65 43 6f 6e 73 74 72 75 63 74 6f 72 2e 66 oteConstructor.f
0470: 72 6f 6d 4b 65 79 20 3d 20 4e 6f 74 65 2e 66 72 romKey = Note.fr
0480: 6f 6d 4b 65 79 3b 0a 6e 6f 74 65 43 6f 6e 73 74 omKey;.noteConst
0490: 72 75 63 74 6f 72 2e 66 72 6f 6d 46 72 65 71 75 ructor.fromFrequ
04a0: 65 6e 63 79 20 3d 20 4e 6f 74 65 2e 66 72 6f 6d ency = Note.from
04b0: 46 72 65 71 75 65 6e 63 79 3b 0a 6e 6f 74 65 43 Frequency;.noteC
04c0: 6f 6e 73 74 72 75 63 74 6f 72 2e 66 72 6f 6d 4d onstructor.fromM
04d0: 49 44 49 20 3d 20 4e 6f 74 65 2e 66 72 6f 6d 4d IDI = Note.fromM
04e0: 49 44 49 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 IDI;..function c
04f0: 68 6f 72 64 43 6f 6e 73 74 72 75 63 74 6f 72 28 hordConstructor(
0500: 6e 61 6d 65 2c 20 73 79 6d 62 6f 6c 29 20 7b 0a name, symbol) {.
0510: 20 20 69 66 20 28 74 79 70 65 6f 66 20 6e 61 6d if (typeof nam
0520: 65 20 3d 3d 3d 20 27 73 74 72 69 6e 67 27 29 20 e === 'string')
0530: 7b 0a 20 20 20 20 76 61 72 20 72 6f 6f 74 2c 20 {. var root,
0540: 6f 63 74 61 76 65 3b 0a 20 20 20 20 72 6f 6f 74 octave;. root
0550: 20 3d 20 6e 61 6d 65 2e 6d 61 74 63 68 28 2f 5e = name.match(/^
0560: 28 5b 61 2d 68 5d 29 28 78 7c 23 7c 62 62 7c 62 ([a-h])(x|#|bb|b
0570: 3f 29 2f 69 29 3b 0a 20 20 20 20 69 66 20 28 72 ?)/i);. if (r
0580: 6f 6f 74 20 26 26 20 72 6f 6f 74 5b 30 5d 29 20 oot && root[0])
0590: 7b 0a 20 20 20 20 20 20 6f 63 74 61 76 65 20 3d {. octave =
05a0: 20 74 79 70 65 6f 66 20 73 79 6d 62 6f 6c 20 3d typeof symbol =
05b0: 3d 3d 20 27 6e 75 6d 62 65 72 27 20 3f 20 73 79 == 'number' ? sy
05c0: 6d 62 6f 6c 2e 74 6f 53 74 72 69 6e 67 28 31 30 mbol.toString(10
05d0: 29 20 3a 20 27 34 27 3b 0a 20 20 20 20 20 20 72 ) : '4';. r
05e0: 65 74 75 72 6e 20 6e 65 77 20 43 68 6f 72 64 28 eturn new Chord(
05f0: 4e 6f 74 65 2e 66 72 6f 6d 53 74 72 69 6e 67 28 Note.fromString(
0600: 72 6f 6f 74 5b 30 5d 2e 74 6f 4c 6f 77 65 72 43 root[0].toLowerC
0610: 61 73 65 28 29 20 2b 20 6f 63 74 61 76 65 29 2c ase() + octave),
0620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d nam
0640: 65 2e 73 75 62 73 74 72 28 72 6f 6f 74 5b 30 5d e.substr(root[0]
0650: 2e 6c 65 6e 67 74 68 29 29 3b 0a 20 20 20 20 7d .length));. }
0660: 0a 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6e 61 . } else if (na
0670: 6d 65 20 69 6e 73 74 61 6e 63 65 6f 66 20 4e 6f me instanceof No
0680: 74 65 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6e te). return n
0690: 65 77 20 43 68 6f 72 64 28 6e 61 6d 65 2c 20 73 ew Chord(name, s
06a0: 79 6d 62 6f 6c 29 3b 0a 0a 20 20 74 68 72 6f 77 ymbol);.. throw
06b0: 20 6e 65 77 20 45 72 72 6f 72 28 27 49 6e 76 61 new Error('Inva
06c0: 6c 69 64 20 43 68 6f 72 64 2e 20 43 6f 75 6c 64 lid Chord. Could
06d0: 6e 5c 27 74 20 66 69 6e 64 20 6e 6f 74 65 20 6e n\'t find note n
06e0: 61 6d 65 27 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 ame');.}..functi
06f0: 6f 6e 20 73 63 61 6c 65 43 6f 6e 73 74 72 75 63 on scaleConstruc
0700: 74 6f 72 28 74 6f 6e 69 63 2c 20 73 63 61 6c 65 tor(tonic, scale
0710: 29 20 7b 0a 20 20 74 6f 6e 69 63 20 3d 20 28 74 ) {. tonic = (t
0720: 6f 6e 69 63 20 69 6e 73 74 61 6e 63 65 6f 66 20 onic instanceof
0730: 4e 6f 74 65 29 20 3f 20 74 6f 6e 69 63 20 3a 20 Note) ? tonic :
0740: 74 65 6f 72 69 61 2e 6e 6f 74 65 28 74 6f 6e 69 teoria.note(toni
0750: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 c);. return new
0760: 20 53 63 61 6c 65 28 74 6f 6e 69 63 2c 20 73 63 Scale(tonic, sc
0770: 61 6c 65 29 3b 0a 7d 0a 0a 74 65 6f 72 69 61 20 ale);.}..teoria
0780: 3d 20 7b 0a 20 20 6e 6f 74 65 3a 20 6e 6f 74 65 = {. note: note
0790: 43 6f 6e 73 74 72 75 63 74 6f 72 2c 0a 0a 20 20 Constructor,..
07a0: 63 68 6f 72 64 3a 20 63 68 6f 72 64 43 6f 6e 73 chord: chordCons
07b0: 74 72 75 63 74 6f 72 2c 0a 0a 20 20 69 6e 74 65 tructor,.. inte
07c0: 72 76 61 6c 3a 20 69 6e 74 65 72 76 61 6c 43 6f rval: intervalCo
07d0: 6e 73 74 72 75 63 74 6f 72 2c 0a 0a 20 20 73 63 nstructor,.. sc
07e0: 61 6c 65 3a 20 73 63 61 6c 65 43 6f 6e 73 74 72 ale: scaleConstr
07f0: 75 63 74 6f 72 2c 0a 0a 20 20 4e 6f 74 65 3a 20 uctor,.. Note:
0800: 4e 6f 74 65 2c 0a 20 20 43 68 6f 72 64 3a 20 43 Note,. Chord: C
0810: 68 6f 72 64 2c 0a 20 20 53 63 61 6c 65 3a 20 53 hord,. Scale: S
0820: 63 61 6c 65 2c 0a 20 20 49 6e 74 65 72 76 61 6c cale,. Interval
0830: 3a 20 49 6e 74 65 72 76 61 6c 0a 7d 3b 0a 0a 0a : Interval.};...
0840: 72 65 71 75 69 72 65 28 27 2e 2f 6c 69 62 2f 73 require('./lib/s
0850: 75 67 61 72 27 29 28 74 65 6f 72 69 61 29 3b 0a ugar')(teoria);.
0860: 65 78 70 6f 72 74 73 20 3d 20 6d 6f 64 75 6c 65 exports = module
0870: 2e 65 78 70 6f 72 74 73 20 3d 20 74 65 6f 72 69 .exports = teori
0880: 61 3b 0a a;.