⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact ee167701d44e72083fb3db221ecce2ee87db42746627e3e4e3fbfb9b6f968d40:


0000: 76 61 72 20 76 6f 77 73 20 3d 20 72 65 71 75 69  var vows = requi
0010: 72 65 28 27 76 6f 77 73 27 29 2c 0a 20 20 20 20  re('vows'),.    
0020: 61 73 73 65 72 74 20 3d 20 72 65 71 75 69 72 65  assert = require
0030: 28 27 61 73 73 65 72 74 27 29 2c 0a 20 20 20 20  ('assert'),.    
0040: 74 65 6f 72 69 61 20 3d 20 72 65 71 75 69 72 65  teoria = require
0050: 28 27 2e 2e 2f 27 29 3b 0a 0a 76 6f 77 73 2e 64  ('../');..vows.d
0060: 65 73 63 72 69 62 65 28 27 54 65 6f 72 69 61 4e  escribe('TeoriaN
0070: 6f 74 65 20 63 6c 61 73 73 27 29 2e 61 64 64 42  ote class').addB
0080: 61 74 63 68 28 7b 0a 20 20 27 41 34 20 2d 20 61  atch({.  'A4 - a
0090: 5c 27 27 3a 20 7b 0a 20 20 20 20 74 6f 70 69 63  \'': {.    topic
00a0: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  : function() {. 
00b0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 65 6f 72       return teor
00c0: 69 61 2e 6e 6f 74 65 28 27 41 34 27 29 3b 0a 20  ia.note('A4');. 
00d0: 20 20 20 7d 2c 0a 0a 20 20 20 20 27 4f 63 74 61     },..    'Octa
00e0: 76 65 20 73 68 6f 75 6c 64 20 62 65 20 34 27 3a  ve should be 4':
00f0: 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29 20   function(note) 
0100: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65  {.      assert.e
0110: 71 75 61 6c 28 6e 6f 74 65 2e 6f 63 74 61 76 65  qual(note.octave
0120: 28 29 2c 20 34 29 3b 0a 20 20 20 20 7d 2c 0a 0a  (), 4);.    },..
0130: 20 20 20 20 27 4e 6f 74 65 20 6e 61 6d 65 20 69      'Note name i
0140: 73 20 6c 6f 77 65 72 20 63 61 73 65 27 3a 20 66  s lower case': f
0150: 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29 20 7b 0a  unction(note) {.
0160: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
0170: 61 6c 28 6e 6f 74 65 2e 6e 61 6d 65 28 29 2c 20  al(note.name(), 
0180: 27 61 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  'a');.    },..  
0190: 20 20 27 41 34 20 69 73 20 74 68 65 20 34 39 74    'A4 is the 49t
01a0: 68 20 70 69 61 6e 6f 20 6b 65 79 27 3a 20 66 75  h piano key': fu
01b0: 6e 63 74 69 6f 6e 28 6e 6f 74 65 29 20 7b 0a 20  nction(note) {. 
01c0: 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61       assert.equa
01d0: 6c 28 6e 6f 74 65 2e 6b 65 79 28 29 2c 20 34 39  l(note.key(), 49
01e0: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27  );.    },..    '
01f0: 41 34 20 69 73 20 65 78 70 72 65 73 73 65 64 20  A4 is expressed 
0200: 61 5c 27 20 69 6e 20 48 65 6c 6d 68 6f 6c 74 7a  a\' in Helmholtz
0210: 20 6e 6f 74 61 74 69 6f 6e 27 3a 20 66 75 6e 63   notation': func
0220: 74 69 6f 6e 28 6e 6f 74 65 29 20 7b 0a 20 20 20  tion(note) {.   
0230: 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28     assert.equal(
0240: 6e 6f 74 65 2e 68 65 6c 6d 68 6f 6c 74 7a 28 29  note.helmholtz()
0250: 2c 20 27 61 5c 27 27 29 3b 0a 20 20 20 20 7d 2c  , 'a\'');.    },
0260: 0a 0a 20 20 20 20 27 41 34 20 69 73 20 65 78 70  ..    'A4 is exp
0270: 72 65 73 73 65 64 20 41 34 20 69 6e 20 73 63 69  ressed A4 in sci
0280: 65 6e 74 69 66 69 63 20 6e 6f 74 61 74 69 6f 6e  entific notation
0290: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65  ': function(note
02a0: 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ) {.      assert
02b0: 2e 65 71 75 61 6c 28 6e 6f 74 65 2e 73 63 69 65  .equal(note.scie
02c0: 6e 74 69 66 69 63 28 29 2c 20 27 41 34 27 29 3b  ntific(), 'A4');
02d0: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 54 68  .    },..    'Th
02e0: 65 20 66 72 65 71 75 65 6e 63 79 20 6f 66 20 41  e frequency of A
02f0: 34 20 69 73 20 34 34 30 68 7a 27 3a 20 66 75 6e  4 is 440hz': fun
0300: 63 74 69 6f 6e 28 6e 6f 74 65 29 20 7b 0a 20 20  ction(note) {.  
0310: 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c      assert.equal
0320: 28 6e 6f 74 65 2e 66 71 28 29 2c 20 34 34 30 29  (note.fq(), 440)
0330: 3b 0a 20 20 20 20 7d 0a 20 20 7d 2c 0a 0a 20 20  ;.    }.  },..  
0340: 27 43 23 35 20 2d 20 63 23 5c 27 5c 27 27 3a 20  'C#5 - c#\'\'': 
0350: 7b 0a 20 20 20 20 74 6f 70 69 63 3a 20 66 75 6e  {.    topic: fun
0360: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20  ction() {.      
0370: 72 65 74 75 72 6e 20 74 65 6f 72 69 61 2e 6e 6f  return teoria.no
0380: 74 65 28 27 63 23 5c 27 5c 27 27 29 3b 0a 20 20  te('c#\'\'');.  
0390: 20 20 7d 2c 0a 0a 20 20 20 20 27 4f 63 74 61 76    },..    'Octav
03a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 35 27 3a 20  e should be 5': 
03b0: 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29 20 7b  function(note) {
03c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71  .      assert.eq
03d0: 75 61 6c 28 6e 6f 74 65 2e 6f 63 74 61 76 65 28  ual(note.octave(
03e0: 29 2c 20 35 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  ), 5);.    },.. 
03f0: 20 20 20 27 54 68 65 20 6e 61 6d 65 20 61 74 74     'The name att
0400: 72 69 62 75 74 65 20 6f 66 20 63 23 20 69 73 20  ribute of c# is 
0410: 6a 75 73 74 20 63 27 3a 20 66 75 6e 63 74 69 6f  just c': functio
0420: 6e 28 6e 6f 74 65 29 20 7b 0a 20 20 20 20 20 20  n(note) {.      
0430: 61 73 73 65 72 74 2e 65 71 75 61 6c 28 6e 6f 74  assert.equal(not
0440: 65 2e 6e 61 6d 65 28 29 2c 20 27 63 27 29 3b 0a  e.name(), 'c');.
0450: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 54 68 65      },..    'The
0460: 20 61 63 63 69 64 65 6e 74 61 6c 2e 73 69 67 6e   accidental.sign
0470: 20 61 74 74 72 69 62 75 74 65 20 69 73 20 23 27   attribute is #'
0480: 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29  : function(note)
0490: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
04a0: 65 71 75 61 6c 28 6e 6f 74 65 2e 61 63 63 69 64  equal(note.accid
04b0: 65 6e 74 61 6c 28 29 2c 20 27 23 27 29 3b 0a 20  ental(), '#');. 
04c0: 20 20 20 7d 2c 0a 0a 20 20 20 20 27 54 68 65 20     },..    'The 
04d0: 61 63 63 69 64 65 6e 74 61 6c 2e 76 61 6c 75 65  accidental.value
04e0: 20 61 74 74 72 69 62 75 74 65 20 69 73 20 31 27   attribute is 1'
04f0: 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29  : function(note)
0500: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
0510: 65 71 75 61 6c 28 6e 6f 74 65 2e 61 63 63 69 64  equal(note.accid
0520: 65 6e 74 61 6c 56 61 6c 75 65 28 29 2c 20 31 29  entalValue(), 1)
0530: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 43  ;.    },..    'C
0540: 23 35 20 69 73 20 74 68 65 20 35 33 72 64 20 70  #5 is the 53rd p
0550: 69 61 6e 6f 20 6b 65 79 27 3a 20 66 75 6e 63 74  iano key': funct
0560: 69 6f 6e 28 6e 6f 74 65 29 20 7b 0a 20 20 20 20  ion(note) {.    
0570: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 6e    assert.equal(n
0580: 6f 74 65 2e 6b 65 79 28 29 2c 20 35 33 29 3b 0a  ote.key(), 53);.
0590: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 43 23 35      },..    'C#5
05a0: 20 69 73 20 63 23 5c 27 5c 27 20 69 6e 20 48 65   is c#\'\' in He
05b0: 6c 6d 68 6f 6c 74 7a 20 6e 6f 74 61 74 69 6f 6e  lmholtz notation
05c0: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65  ': function(note
05d0: 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ) {.      assert
05e0: 2e 65 71 75 61 6c 28 6e 6f 74 65 2e 68 65 6c 6d  .equal(note.helm
05f0: 68 6f 6c 74 7a 28 29 2c 20 27 63 23 5c 27 5c 27  holtz(), 'c#\'\'
0600: 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  ');.    },..    
0610: 27 63 23 5c 27 5c 27 20 69 73 20 43 23 35 20 69  'c#\'\' is C#5 i
0620: 6e 20 73 63 69 65 6e 74 69 66 69 63 20 6e 6f 74  n scientific not
0630: 61 74 69 6f 6e 27 3a 20 66 75 6e 63 74 69 6f 6e  ation': function
0640: 28 6e 6f 74 65 29 20 7b 0a 20 20 20 20 20 20 61  (note) {.      a
0650: 73 73 65 72 74 2e 65 71 75 61 6c 28 6e 6f 74 65  ssert.equal(note
0660: 2e 73 63 69 65 6e 74 69 66 69 63 28 29 2c 20 27  .scientific(), '
0670: 43 23 35 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  C#5');.    },.. 
0680: 20 20 20 27 54 68 65 20 66 72 65 71 75 65 6e 63     'The frequenc
0690: 79 20 6f 66 20 43 23 35 20 69 73 20 61 70 70 72  y of C#5 is appr
06a0: 6f 78 69 6d 61 74 65 6c 79 20 35 35 34 2e 33 36  oximately 554.36
06b0: 35 27 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74  5': function(not
06c0: 65 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e) {.      asser
06d0: 74 2e 65 71 75 61 6c 28 6e 6f 74 65 2e 66 71 28  t.equal(note.fq(
06e0: 29 2c 20 35 35 34 2e 33 36 35 32 36 31 39 35 33  ), 554.365261953
06f0: 37 34 34 32 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  7442);.    },.. 
0700: 20 20 20 27 54 68 65 20 69 6e 74 65 72 76 61 6c     'The interval
0710: 20 62 65 74 77 65 65 6e 20 43 23 35 20 61 6e 64   between C#5 and
0720: 20 41 34 20 69 73 20 61 20 6d 61 6a 6f 72 20 74   A4 is a major t
0730: 68 69 72 64 27 3a 20 66 75 6e 63 74 69 6f 6e 28  hird': function(
0740: 6e 6f 74 65 29 20 7b 0a 20 20 20 20 20 20 76 61  note) {.      va
0750: 72 20 61 34 20 3d 20 74 65 6f 72 69 61 2e 6e 6f  r a4 = teoria.no
0760: 74 65 28 27 41 34 27 29 3b 0a 0a 20 20 20 20 20  te('A4');..     
0770: 20 61 73 73 65 72 74 2e 64 65 65 70 45 71 75 61   assert.deepEqua
0780: 6c 28 6e 6f 74 65 2e 69 6e 74 65 72 76 61 6c 28  l(note.interval(
0790: 61 34 29 2c 20 74 65 6f 72 69 61 2e 69 6e 74 65  a4), teoria.inte
07a0: 72 76 61 6c 28 27 4d 2d 33 27 29 29 3b 0a 20 20  rval('M-3'));.  
07b0: 20 20 7d 2c 0a 0a 20 20 20 20 27 54 68 65 20 69    },..    'The i
07c0: 6e 74 65 72 76 61 6c 20 62 65 74 77 65 65 6e 20  nterval between 
07d0: 43 23 35 20 61 6e 64 20 45 62 36 20 69 73 20 64  C#5 and Eb6 is d
07e0: 69 6d 69 6e 69 73 68 65 64 20 74 65 6e 74 68 27  iminished tenth'
07f0: 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65 29  : function(note)
0800: 20 7b 0a 20 20 20 20 20 20 76 61 72 20 65 62 36   {.      var eb6
0810: 20 3d 20 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27   = teoria.note('
0820: 45 62 36 27 29 3b 0a 0a 20 20 20 20 20 20 61 73  Eb6');..      as
0830: 73 65 72 74 2e 64 65 65 70 45 71 75 61 6c 28 6e  sert.deepEqual(n
0840: 6f 74 65 2e 69 6e 74 65 72 76 61 6c 28 65 62 36  ote.interval(eb6
0850: 29 2c 20 74 65 6f 72 69 61 2e 69 6e 74 65 72 76  ), teoria.interv
0860: 61 6c 28 27 64 31 30 27 29 29 3b 0a 20 20 20 20  al('d10'));.    
0870: 7d 2c 0a 0a 20 20 20 20 27 41 6e 20 64 69 6d 69  },..    'An dimi
0880: 6e 69 73 68 65 64 20 66 69 66 74 68 20 61 77 61  nished fifth awa
0890: 79 20 66 72 6f 6d 20 43 23 35 20 69 73 20 47 35  y from C#5 is G5
08a0: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 6e 6f 74 65  ': function(note
08b0: 29 20 7b 0a 20 20 20 20 20 20 76 61 72 20 67 35  ) {.      var g5
08c0: 20 3d 20 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27   = teoria.note('
08d0: 47 35 27 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  G5');..      ass
08e0: 65 72 74 2e 64 65 65 70 45 71 75 61 6c 28 6e 6f  ert.deepEqual(no
08f0: 74 65 2e 69 6e 74 65 72 76 61 6c 28 27 64 35 27  te.interval('d5'
0900: 29 2c 20 67 35 29 3b 0a 20 20 20 20 7d 2c 0a 0a  ), g5);.    },..
0910: 20 20 20 20 27 54 68 65 20 69 6e 74 65 72 76 61      'The interva
0920: 6c 20 62 65 74 77 65 65 6e 20 43 23 34 20 61 6e  l between C#4 an
0930: 64 20 44 62 34 20 69 73 20 61 20 64 69 6d 69 6e  d Db4 is a dimin
0940: 69 73 68 65 64 20 73 65 63 6f 6e 64 27 3a 20 66  ished second': f
0950: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
0960: 20 20 76 61 72 20 63 69 73 34 20 3d 20 74 65 6f    var cis4 = teo
0970: 72 69 61 2e 6e 6f 74 65 28 27 63 23 34 27 29 3b  ria.note('c#4');
0980: 0a 20 20 20 20 20 20 76 61 72 20 64 62 34 20 3d  .      var db4 =
0990: 20 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 64 62   teoria.note('db
09a0: 34 27 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  4');..      asse
09b0: 72 74 2e 64 65 65 70 45 71 75 61 6c 28 63 69 73  rt.deepEqual(cis
09c0: 34 2e 69 6e 74 65 72 76 61 6c 28 64 62 34 29 2c  4.interval(db4),
09d0: 20 74 65 6f 72 69 61 2e 69 6e 74 65 72 76 61 6c   teoria.interval
09e0: 28 27 64 32 27 29 29 3b 0a 20 20 20 20 7d 0a 20  ('d2'));.    }. 
09f0: 20 7d 2c 0a 0a 20 20 27 49 6e 73 74 61 6e 74 69   },..  'Instanti
0a00: 61 74 65 20 77 69 74 68 20 63 6f 6f 72 64 73 27  ate with coords'
0a10: 3a 20 7b 0a 20 20 20 20 27 5b 30 2c 20 30 5d 20  : {.    '[0, 0] 
0a20: 69 73 20 41 34 27 3a 20 66 75 6e 63 74 69 6f 6e  is A4': function
0a30: 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  () {.      asser
0a40: 74 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e  t.equal(teoria.n
0a50: 6f 74 65 28 5b 30 2c 20 30 5d 29 2e 73 63 69 65  ote([0, 0]).scie
0a60: 6e 74 69 66 69 63 28 29 2c 20 27 41 34 27 29 3b  ntific(), 'A4');
0a70: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 5b 2d  .    },..    '[-
0a80: 34 2c 20 34 5d 20 69 73 20 43 23 33 27 3a 20 66  4, 4] is C#3': f
0a90: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
0aa0: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 74    assert.equal(t
0ab0: 65 6f 72 69 61 2e 6e 6f 74 65 28 5b 2d 34 2c 20  eoria.note([-4, 
0ac0: 34 5d 29 2e 73 63 69 65 6e 74 69 66 69 63 28 29  4]).scientific()
0ad0: 2c 20 27 43 23 33 27 29 3b 0a 20 20 20 20 7d 2c  , 'C#3');.    },
0ae0: 0a 0a 20 20 20 20 27 5b 33 2c 20 2d 34 5d 20 69  ..    '[3, -4] i
0af0: 73 20 46 35 27 3a 20 66 75 6e 63 74 69 6f 6e 28  s F5': function(
0b00: 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ) {.      assert
0b10: 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f  .equal(teoria.no
0b20: 74 65 28 5b 33 2c 20 2d 34 5d 29 2e 73 63 69 65  te([3, -4]).scie
0b30: 6e 74 69 66 69 63 28 29 2c 20 27 46 35 27 29 3b  ntific(), 'F5');
0b40: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 5b 34  .    },..    '[4
0b50: 2c 20 2d 37 5d 20 69 73 20 41 62 34 27 3a 20 66  , -7] is Ab4': f
0b60: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
0b70: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 74    assert.equal(t
0b80: 65 6f 72 69 61 2e 6e 6f 74 65 28 5b 34 2c 20 2d  eoria.note([4, -
0b90: 37 5d 29 2e 73 63 69 65 6e 74 69 66 69 63 28 29  7]).scientific()
0ba0: 2c 20 27 41 62 34 27 29 3b 0a 20 20 20 20 7d 0a  , 'Ab4');.    }.
0bb0: 20 20 7d 2c 0a 0a 20 20 27 49 6e 73 74 61 6e 74    },..  'Instant
0bc0: 69 61 74 65 20 66 72 6f 6d 20 6b 65 79 27 3a 20  iate from key': 
0bd0: 7b 0a 20 20 20 20 27 23 34 39 20 69 73 20 41 34  {.    '#49 is A4
0be0: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ': function() {.
0bf0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
0c00: 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 2e 66  al(teoria.note.f
0c10: 72 6f 6d 4b 65 79 28 34 39 29 2e 73 63 69 65 6e  romKey(49).scien
0c20: 74 69 66 69 63 28 29 2c 20 27 41 34 27 29 3b 0a  tific(), 'A4');.
0c30: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 23 32 30      },..    '#20
0c40: 20 69 73 20 45 32 27 3a 20 66 75 6e 63 74 69 6f   is E2': functio
0c50: 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65  n() {.      asse
0c60: 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e  rt.equal(teoria.
0c70: 6e 6f 74 65 2e 66 72 6f 6d 4b 65 79 28 32 30 29  note.fromKey(20)
0c80: 2e 73 63 69 65 6e 74 69 66 69 63 28 29 2c 20 27  .scientific(), '
0c90: 45 32 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  E2');.    },..  
0ca0: 20 20 27 23 35 37 20 69 73 20 46 35 27 3a 20 66    '#57 is F5': f
0cb0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
0cc0: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 74    assert.equal(t
0cd0: 65 6f 72 69 61 2e 6e 6f 74 65 2e 66 72 6f 6d 4b  eoria.note.fromK
0ce0: 65 79 28 35 37 29 2e 73 63 69 65 6e 74 69 66 69  ey(57).scientifi
0cf0: 63 28 29 2c 20 27 46 35 27 29 3b 0a 20 20 20 20  c(), 'F5');.    
0d00: 7d 2c 0a 0a 20 20 20 20 27 23 37 32 20 69 73 20  },..    '#72 is 
0d10: 47 23 36 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29  G#6': function()
0d20: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
0d30: 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74  equal(teoria.not
0d40: 65 2e 66 72 6f 6d 4b 65 79 28 37 32 29 2e 73 63  e.fromKey(72).sc
0d50: 69 65 6e 74 69 66 69 63 28 29 2c 20 27 47 23 36  ientific(), 'G#6
0d60: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 2c 0a 0a  ');.    }.  },..
0d70: 20 20 27 49 6e 73 74 61 6e 74 69 61 74 65 20 66    'Instantiate f
0d80: 72 6f 6d 20 66 72 65 71 75 65 6e 63 79 27 3a 20  rom frequency': 
0d90: 7b 0a 20 20 20 20 27 33 39 31 2e 39 39 35 48 7a  {.    '391.995Hz
0da0: 20 69 73 20 47 34 27 3a 20 66 75 6e 63 74 69 6f   is G4': functio
0db0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65  n() {.      asse
0dc0: 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e  rt.equal(teoria.
0dd0: 6e 6f 74 65 2e 66 72 6f 6d 46 72 65 71 75 65 6e  note.fromFrequen
0de0: 63 79 28 33 39 31 2e 39 39 35 29 2e 6e 6f 74 65  cy(391.995).note
0df0: 2e 73 63 69 65 6e 74 69 66 69 63 28 29 2c 20 27  .scientific(), '
0e00: 47 34 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  G4');.    },..  
0e10: 20 20 27 32 32 30 2e 30 30 30 48 7a 20 69 73 20    '220.000Hz is 
0e20: 41 33 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20  A3': function() 
0e30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65  {.      assert.e
0e40: 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65  qual(teoria.note
0e50: 2e 66 72 6f 6d 46 72 65 71 75 65 6e 63 79 28 32  .fromFrequency(2
0e60: 32 30 2e 30 30 30 29 2e 6e 6f 74 65 2e 73 63 69  20.000).note.sci
0e70: 65 6e 74 69 66 69 63 28 29 2c 20 27 41 33 27 29  entific(), 'A3')
0e80: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 31  ;.    },..    '1
0e90: 35 35 2e 35 36 33 48 7a 20 69 73 20 45 62 33 27  55.563Hz is Eb3'
0ea0: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  : function() {. 
0eb0: 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61       assert.equa
0ec0: 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 2e 66 72  l(teoria.note.fr
0ed0: 6f 6d 46 72 65 71 75 65 6e 63 79 28 31 35 35 2e  omFrequency(155.
0ee0: 35 36 33 29 2e 6e 6f 74 65 2e 73 63 69 65 6e 74  563).note.scient
0ef0: 69 66 69 63 28 29 2c 20 27 45 62 33 27 29 3b 0a  ific(), 'Eb3');.
0f00: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 32 39 35      },..    '295
0f10: 39 2e 39 36 48 7a 20 69 73 20 46 23 37 27 3a 20  9.96Hz is F#7': 
0f20: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
0f30: 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28     assert.equal(
0f40: 74 65 6f 72 69 61 2e 6e 6f 74 65 2e 66 72 6f 6d  teoria.note.from
0f50: 46 72 65 71 75 65 6e 63 79 28 32 39 35 39 2e 39  Frequency(2959.9
0f60: 36 29 2e 6e 6f 74 65 2e 73 63 69 65 6e 74 69 66  6).note.scientif
0f70: 69 63 28 29 2c 20 27 46 23 37 27 29 3b 0a 20 20  ic(), 'F#7');.  
0f80: 20 20 7d 0a 20 20 7d 2c 0a 0a 20 20 27 49 6e 73    }.  },..  'Ins
0f90: 74 61 6e 74 69 61 74 65 20 66 72 6f 6d 20 4d 49  tantiate from MI
0fa0: 44 49 27 3a 20 7b 0a 20 20 20 20 27 4d 49 44 49  DI': {.    'MIDI
0fb0: 23 33 36 20 69 73 20 43 32 27 3a 20 66 75 6e 63  #36 is C2': func
0fc0: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61  tion() {.      a
0fd0: 73 73 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72  ssert.equal(teor
0fe0: 69 61 2e 6e 6f 74 65 2e 66 72 6f 6d 4d 49 44 49  ia.note.fromMIDI
0ff0: 28 33 36 29 2e 73 63 69 65 6e 74 69 66 69 63 28  (36).scientific(
1000: 29 2c 20 27 43 32 27 29 3b 0a 20 20 20 20 7d 2c  ), 'C2');.    },
1010: 0a 0a 20 20 20 20 27 4d 49 44 49 23 37 37 20 69  ..    'MIDI#77 i
1020: 73 20 46 35 27 3a 20 66 75 6e 63 74 69 6f 6e 28  s F5': function(
1030: 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ) {.      assert
1040: 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f  .equal(teoria.no
1050: 74 65 2e 66 72 6f 6d 4d 49 44 49 28 37 37 29 2e  te.fromMIDI(77).
1060: 73 63 69 65 6e 74 69 66 69 63 28 29 2c 20 27 46  scientific(), 'F
1070: 35 27 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20  5');.    },..   
1080: 20 27 4d 49 44 49 23 36 31 20 69 73 20 44 62 34   'MIDI#61 is Db4
1090: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ': function() {.
10a0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
10b0: 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 2e 66  al(teoria.note.f
10c0: 72 6f 6d 4d 49 44 49 28 36 31 29 2e 73 63 69 65  romMIDI(61).scie
10d0: 6e 74 69 66 69 63 28 29 2c 20 27 44 62 34 27 29  ntific(), 'Db4')
10e0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 4d  ;.    },..    'M
10f0: 49 44 49 23 38 30 20 69 73 20 47 23 35 27 3a 20  IDI#80 is G#5': 
1100: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
1110: 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28     assert.equal(
1120: 74 65 6f 72 69 61 2e 6e 6f 74 65 2e 66 72 6f 6d  teoria.note.from
1130: 4d 49 44 49 28 38 30 29 2e 73 63 69 65 6e 74 69  MIDI(80).scienti
1140: 66 69 63 28 29 2c 20 27 47 23 35 27 29 3b 0a 20  fic(), 'G#5');. 
1150: 20 20 20 7d 0a 20 20 7d 2c 0a 0a 20 20 27 52 65     }.  },..  'Re
1160: 74 75 72 6e 20 4d 49 44 49 20 6e 6f 74 65 20 6e  turn MIDI note n
1170: 75 6d 62 65 72 27 3a 20 7b 0a 20 20 20 20 27 4d  umber': {.    'M
1180: 49 44 49 23 33 36 20 69 73 20 43 32 27 3a 20 66  IDI#36 is C2': f
1190: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
11a0: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 74    assert.equal(t
11b0: 65 6f 72 69 61 2e 6e 6f 74 65 28 27 43 32 27 29  eoria.note('C2')
11c0: 2e 6d 69 64 69 28 29 2c 20 33 36 29 3b 0a 20 20  .midi(), 36);.  
11d0: 20 20 7d 2c 0a 0a 20 20 20 20 27 4d 49 44 49 23    },..    'MIDI#
11e0: 37 37 20 69 73 20 46 35 27 3a 20 66 75 6e 63 74  77 is F5': funct
11f0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73  ion() {.      as
1200: 73 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69  sert.equal(teori
1210: 61 2e 6e 6f 74 65 28 27 46 35 27 29 2e 6d 69 64  a.note('F5').mid
1220: 69 28 29 2c 20 37 37 29 3b 0a 20 20 20 20 7d 2c  i(), 77);.    },
1230: 0a 0a 20 20 20 20 27 4d 49 44 49 23 36 31 20 69  ..    'MIDI#61 i
1240: 73 20 44 62 34 27 3a 20 66 75 6e 63 74 69 6f 6e  s Db4': function
1250: 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  () {.      asser
1260: 74 2e 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e  t.equal(teoria.n
1270: 6f 74 65 28 27 44 62 34 27 29 2e 6d 69 64 69 28  ote('Db4').midi(
1280: 29 2c 20 36 31 29 3b 0a 20 20 20 20 7d 2c 0a 0a  ), 61);.    },..
1290: 20 20 20 20 27 4d 49 44 49 23 38 30 20 69 73 20      'MIDI#80 is 
12a0: 47 23 35 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29  G#5': function()
12b0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
12c0: 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74  equal(teoria.not
12d0: 65 28 27 47 23 35 27 29 2e 6d 69 64 69 28 29 2c  e('G#5').midi(),
12e0: 20 38 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 2c   80);.    }.  },
12f0: 0a 0a 20 20 27 43 68 72 6f 6d 61 27 3a 20 7b 0a  ..  'Chroma': {.
1300: 20 20 20 20 27 43 20 68 61 73 20 63 68 72 6f 6d      'C has chrom
1310: 61 20 30 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29  a 0': function()
1320: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
1330: 65 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74  equal(teoria.not
1340: 65 28 27 63 27 29 2e 63 68 72 6f 6d 61 28 29 2c  e('c').chroma(),
1350: 20 30 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20   0);.    },..   
1360: 20 27 43 23 20 68 61 73 20 63 68 72 6f 6d 61 20   'C# has chroma 
1370: 31 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  1': function() {
1380: 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71  .      assert.eq
1390: 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28  ual(teoria.note(
13a0: 27 63 23 27 29 2e 63 68 72 6f 6d 61 28 29 2c 20  'c#').chroma(), 
13b0: 31 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  1);.    },..    
13c0: 27 42 20 68 61 73 20 63 68 72 6f 6d 61 20 31 31  'B has chroma 11
13d0: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ': function() {.
13e0: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
13f0: 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27  al(teoria.note('
1400: 62 27 29 2e 63 68 72 6f 6d 61 28 29 2c 20 31 31  b').chroma(), 11
1410: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27  );.    },..    '
1420: 44 62 20 68 61 73 20 63 68 72 6f 6d 61 20 31 27  Db has chroma 1'
1430: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  : function() {. 
1440: 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61       assert.equa
1450: 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 64  l(teoria.note('d
1460: 62 27 29 2e 63 68 72 6f 6d 61 28 29 2c 20 31 29  b').chroma(), 1)
1470: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 44  ;.    },..    'D
1480: 62 62 20 68 61 73 20 63 68 72 6f 6d 61 20 30 27  bb has chroma 0'
1490: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  : function() {. 
14a0: 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61       assert.equa
14b0: 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 64  l(teoria.note('d
14c0: 62 62 27 29 2e 63 68 72 6f 6d 61 28 29 2c 20 30  bb').chroma(), 0
14d0: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27  );.    },..    '
14e0: 45 20 68 61 73 20 63 68 72 6f 6d 61 20 34 27 3a  E has chroma 4':
14f0: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20   function() {.  
1500: 20 20 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c      assert.equal
1510: 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 65 27  (teoria.note('e'
1520: 29 2e 63 68 72 6f 6d 61 28 29 2c 20 34 29 3b 0a  ).chroma(), 4);.
1530: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 46 20 68      },..    'F h
1540: 61 73 20 63 68 72 6f 6d 61 20 35 27 3a 20 66 75  as chroma 5': fu
1550: 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20  nction() {.     
1560: 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 74 65   assert.equal(te
1570: 6f 72 69 61 2e 6e 6f 74 65 28 27 66 27 29 2e 63  oria.note('f').c
1580: 68 72 6f 6d 61 28 29 2c 20 35 29 3b 0a 20 20 20  hroma(), 5);.   
1590: 20 7d 2c 0a 0a 20 20 20 20 27 46 62 20 68 61 73   },..    'Fb has
15a0: 20 63 68 72 6f 6d 61 20 34 27 3a 20 66 75 6e 63   chroma 4': func
15b0: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61  tion() {.      a
15c0: 73 73 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72  ssert.equal(teor
15d0: 69 61 2e 6e 6f 74 65 28 27 66 62 27 29 2e 63 68  ia.note('fb').ch
15e0: 72 6f 6d 61 28 29 2c 20 34 29 3b 0a 20 20 20 20  roma(), 4);.    
15f0: 7d 2c 0a 0a 20 20 20 20 27 48 23 20 68 61 73 20  },..    'H# has 
1600: 63 68 72 6f 6d 61 20 30 27 3a 20 66 75 6e 63 74  chroma 0': funct
1610: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73  ion() {.      as
1620: 73 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69  sert.equal(teori
1630: 61 2e 6e 6f 74 65 28 27 68 23 27 29 2e 63 68 72  a.note('h#').chr
1640: 6f 6d 61 28 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oma(), 0);.    }
1650: 2c 0a 0a 20 20 20 20 27 42 78 20 68 61 73 20 63  ,..    'Bx has c
1660: 68 72 6f 6d 61 20 31 27 3a 20 66 75 6e 63 74 69  hroma 1': functi
1670: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73  on() {.      ass
1680: 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69 61  ert.equal(teoria
1690: 2e 6e 6f 74 65 28 27 62 78 27 29 2e 63 68 72 6f  .note('bx').chro
16a0: 6d 61 28 29 2c 20 31 29 3b 0a 20 20 20 20 7d 2c  ma(), 1);.    },
16b0: 0a 0a 20 20 20 20 27 43 62 62 20 68 61 73 20 63  ..    'Cbb has c
16c0: 68 72 6f 6d 61 20 31 30 27 3a 20 66 75 6e 63 74  hroma 10': funct
16d0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73  ion() {.      as
16e0: 73 65 72 74 2e 65 71 75 61 6c 28 74 65 6f 72 69  sert.equal(teori
16f0: 61 2e 6e 6f 74 65 28 27 63 62 62 27 29 2e 63 68  a.note('cbb').ch
1700: 72 6f 6d 61 28 29 2c 20 31 30 29 3b 0a 20 20 20  roma(), 10);.   
1710: 20 7d 0a 20 20 7d 2c 0a 0a 20 20 27 53 63 61 6c   }.  },..  'Scal
1720: 65 20 44 65 67 72 65 65 73 27 3a 20 7b 0a 20 20  e Degrees': {.  
1730: 20 20 27 45 62 20 69 73 20 73 63 61 6c 65 20 64    'Eb is scale d
1740: 65 67 72 65 65 20 31 20 28 74 6f 6e 69 63 29 20  egree 1 (tonic) 
1750: 69 6e 20 61 6e 20 45 62 20 6d 69 6e 6f 72 20 73  in an Eb minor s
1760: 63 61 6c 65 27 3a 20 66 75 6e 63 74 69 6f 6e 28  cale': function(
1770: 29 20 7b 0a 20 20 20 20 20 20 76 61 72 20 6e 6f  ) {.      var no
1780: 74 65 20 3d 20 74 65 6f 72 69 61 2e 6e 6f 74 65  te = teoria.note
1790: 28 27 65 62 27 29 3b 0a 20 20 20 20 20 20 61 73  ('eb');.      as
17a0: 73 65 72 74 2e 65 71 75 61 6c 28 6e 6f 74 65 2e  sert.equal(note.
17b0: 73 63 61 6c 65 44 65 67 72 65 65 28 74 65 6f 72  scaleDegree(teor
17c0: 69 61 2e 73 63 61 6c 65 28 27 65 62 27 2c 20 27  ia.scale('eb', '
17d0: 6d 61 6a 6f 72 27 29 29 2c 20 31 29 3b 0a 20 20  major')), 1);.  
17e0: 20 20 7d 2c 0a 0a 20 20 20 20 27 45 20 69 73 20    },..    'E is 
17f0: 73 63 61 6c 65 20 64 65 67 72 65 65 20 33 20 69  scale degree 3 i
1800: 6e 20 61 20 43 23 20 64 6f 72 69 61 6e 27 3a 20  n a C# dorian': 
1810: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
1820: 20 20 20 76 61 72 20 6e 6f 74 65 20 3d 20 74 65     var note = te
1830: 6f 72 69 61 2e 6e 6f 74 65 28 27 65 27 29 3b 0a  oria.note('e');.
1840: 20 20 20 20 20 20 61 73 73 65 72 74 2e 65 71 75        assert.equ
1850: 61 6c 28 6e 6f 74 65 2e 73 63 61 6c 65 44 65 67  al(note.scaleDeg
1860: 72 65 65 28 74 65 6f 72 69 61 2e 73 63 61 6c 65  ree(teoria.scale
1870: 28 27 63 23 27 2c 20 27 64 6f 72 69 61 6e 27 29  ('c#', 'dorian')
1880: 29 2c 20 33 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  ), 3);.    },.. 
1890: 20 20 20 27 43 20 69 73 20 73 63 61 6c 65 20 64     'C is scale d
18a0: 65 67 72 65 65 20 30 20 69 6e 20 61 20 44 20 6d  egree 0 in a D m
18b0: 61 6a 6f 72 20 73 63 61 6c 65 20 28 6e 6f 74 20  ajor scale (not 
18c0: 69 6e 20 73 63 61 6c 65 29 27 3a 20 66 75 6e 63  in scale)': func
18d0: 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 76  tion() {.      v
18e0: 61 72 20 6e 6f 74 65 20 3d 20 74 65 6f 72 69 61  ar note = teoria
18f0: 2e 6e 6f 74 65 28 27 63 27 29 3b 0a 20 20 20 20  .note('c');.    
1900: 20 20 61 73 73 65 72 74 2e 65 71 75 61 6c 28 6e    assert.equal(n
1910: 6f 74 65 2e 73 63 61 6c 65 44 65 67 72 65 65 28  ote.scaleDegree(
1920: 74 65 6f 72 69 61 2e 73 63 61 6c 65 28 27 64 27  teoria.scale('d'
1930: 2c 20 27 6d 61 6a 6f 72 27 29 29 2c 20 30 29 3b  , 'major')), 0);
1940: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 27 42 62  .    },..    'Bb
1950: 20 69 73 20 73 63 61 6c 65 20 64 65 67 72 65 65   is scale degree
1960: 20 37 20 69 6e 20 61 20 43 20 6d 69 6e 6f 72 27   7 in a C minor'
1970: 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20  : function() {. 
1980: 20 20 20 20 20 76 61 72 20 6e 6f 74 65 20 3d 20       var note = 
1990: 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 62 62 27  teoria.note('bb'
19a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e  );.      assert.
19b0: 65 71 75 61 6c 28 6e 6f 74 65 2e 73 63 61 6c 65  equal(note.scale
19c0: 44 65 67 72 65 65 28 74 65 6f 72 69 61 2e 73 63  Degree(teoria.sc
19d0: 61 6c 65 28 27 63 27 2c 20 27 6d 69 6e 6f 72 27  ale('c', 'minor'
19e0: 29 29 2c 20 37 29 3b 0a 20 20 20 20 7d 2c 0a 20  )), 7);.    },. 
19f0: 20 20 20 0a 20 20 20 20 27 44 62 20 69 73 20 73     .    'Db is s
1a00: 63 61 6c 65 20 64 65 67 72 65 65 20 34 20 69 6e  cale degree 4 in
1a10: 20 61 6e 20 41 62 20 6d 61 6a 6f 72 20 73 63 61   an Ab major sca
1a20: 6c 65 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20  le': function() 
1a30: 7b 0a 20 20 20 20 20 20 76 61 72 20 6e 6f 74 65  {.      var note
1a40: 20 3d 20 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27   = teoria.note('
1a50: 64 62 27 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db');.      asse
1a60: 72 74 2e 65 71 75 61 6c 28 6e 6f 74 65 2e 73 63  rt.equal(note.sc
1a70: 61 6c 65 44 65 67 72 65 65 28 74 65 6f 72 69 61  aleDegree(teoria
1a80: 2e 73 63 61 6c 65 28 27 61 62 27 2c 20 27 6d 61  .scale('ab', 'ma
1a90: 6a 6f 72 27 29 29 2c 20 34 29 3b 0a 20 20 20 20  jor')), 4);.    
1aa0: 7d 2c 0a 0a 20 20 20 20 27 41 23 20 69 73 20 73  },..    'A# is s
1ab0: 63 61 6c 65 20 64 65 67 72 65 65 20 30 20 69 6e  cale degree 0 in
1ac0: 20 61 20 47 20 6d 69 6e 6f 72 20 73 63 61 6c 65   a G minor scale
1ad0: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ': function() {.
1ae0: 20 20 20 20 20 20 76 61 72 20 6e 6f 74 65 20 3d        var note =
1af0: 20 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 61 23   teoria.note('a#
1b00: 27 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ');.      assert
1b10: 2e 65 71 75 61 6c 28 6e 6f 74 65 2e 73 63 61 6c  .equal(note.scal
1b20: 65 44 65 67 72 65 65 28 74 65 6f 72 69 61 2e 73  eDegree(teoria.s
1b30: 63 61 6c 65 28 27 67 27 2c 20 27 6d 69 6e 6f 72  cale('g', 'minor
1b40: 27 29 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ')), 0);.    }. 
1b50: 20 7d 2c 0a 0a 20 20 27 45 6e 68 61 72 6d 6f 6e   },..  'Enharmon
1b60: 69 63 73 27 3a 20 7b 0a 20 20 20 20 27 63 20 69  ics': {.    'c i
1b70: 73 20 65 6e 68 61 72 6d 6f 6e 69 63 20 77 69 74  s enharmonic wit
1b80: 68 20 64 62 62 20 61 6e 64 20 62 23 27 3a 20 66  h dbb and b#': f
1b90: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
1ba0: 20 20 61 73 73 65 72 74 2e 64 65 65 70 45 71 75    assert.deepEqu
1bb0: 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27  al(teoria.note('
1bc0: 63 34 27 29 2e 65 6e 68 61 72 6d 6f 6e 69 63 73  c4').enharmonics
1bd0: 28 29 2c 0a 20 20 20 20 20 20 20 20 5b 27 64 62  (),.        ['db
1be0: 62 34 27 2c 20 27 62 23 33 27 5d 2e 6d 61 70 28  b4', 'b#3'].map(
1bf0: 74 65 6f 72 69 61 2e 6e 6f 74 65 29 29 3b 0a 20  teoria.note));. 
1c00: 20 20 20 7d 2c 0a 0a 20 20 20 20 27 66 62 20 69     },..    'fb i
1c10: 73 20 65 6e 68 61 72 6d 6f 6e 69 63 20 77 69 74  s enharmonic wit
1c20: 68 20 65 20 61 6e 64 20 64 78 27 3a 20 66 75 6e  h e and dx': fun
1c30: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20  ction() {.      
1c40: 61 73 73 65 72 74 2e 64 65 65 70 45 71 75 61 6c  assert.deepEqual
1c50: 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28 27 66 62  (teoria.note('fb
1c60: 34 27 29 2e 65 6e 68 61 72 6d 6f 6e 69 63 73 28  4').enharmonics(
1c70: 29 2c 0a 20 20 20 20 20 20 20 20 5b 27 65 34 27  ),.        ['e4'
1c80: 2c 20 27 64 78 34 27 5d 2e 6d 61 70 28 74 65 6f  , 'dx4'].map(teo
1c90: 72 69 61 2e 6e 6f 74 65 29 29 3b 0a 20 20 20 20  ria.note));.    
1ca0: 7d 2c 0a 0a 20 20 20 20 27 63 62 20 69 73 20 65  },..    'cb is e
1cb0: 6e 68 61 72 6d 6f 6e 69 63 20 77 69 74 68 20 61  nharmonic with a
1cc0: 78 20 61 6e 64 20 62 27 3a 20 66 75 6e 63 74 69  x and b': functi
1cd0: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 61 73 73  on() {.      ass
1ce0: 65 72 74 2e 64 65 65 70 45 71 75 61 6c 28 74 65  ert.deepEqual(te
1cf0: 6f 72 69 61 2e 6e 6f 74 65 28 27 63 62 34 27 29  oria.note('cb4')
1d00: 2e 65 6e 68 61 72 6d 6f 6e 69 63 73 28 29 2c 0a  .enharmonics(),.
1d10: 20 20 20 20 20 20 20 20 5b 27 62 33 27 2c 20 27          ['b3', '
1d20: 61 78 33 27 5d 2e 6d 61 70 28 74 65 6f 72 69 61  ax3'].map(teoria
1d30: 2e 6e 6f 74 65 29 29 3b 0a 20 20 20 20 7d 0a 20  .note));.    }. 
1d40: 20 7d 2c 0a 0a 20 20 27 45 6e 68 61 72 6d 6f 6e   },..  'Enharmon
1d50: 69 63 73 20 77 69 74 68 20 6f 6e 6c 79 20 6f 6e  ics with only on
1d60: 65 20 61 63 63 69 64 65 6e 74 61 6c 27 3a 20 7b  e accidental': {
1d70: 0a 20 20 20 20 27 63 20 69 73 20 65 6e 68 61 72  .    'c is enhar
1d80: 6d 6f 6e 69 63 20 77 69 74 68 20 62 23 27 3a 20  monic with b#': 
1d90: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
1da0: 20 20 20 61 73 73 65 72 74 2e 64 65 65 70 45 71     assert.deepEq
1db0: 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f 74 65 28  ual(teoria.note(
1dc0: 27 63 34 27 29 2e 65 6e 68 61 72 6d 6f 6e 69 63  'c4').enharmonic
1dd0: 73 28 74 72 75 65 29 2c 0a 20 20 20 20 20 20 20  s(true),.       
1de0: 20 5b 27 62 23 33 27 5d 2e 6d 61 70 28 74 65 6f   ['b#3'].map(teo
1df0: 72 69 61 2e 6e 6f 74 65 29 29 3b 0a 20 20 20 20  ria.note));.    
1e00: 7d 2c 0a 0a 20 20 20 20 27 66 62 20 69 73 20 65  },..    'fb is e
1e10: 6e 68 61 72 6d 6f 6e 69 63 20 77 69 74 68 20 65  nharmonic with e
1e20: 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ': function() {.
1e30: 20 20 20 20 20 20 61 73 73 65 72 74 2e 64 65 65        assert.dee
1e40: 70 45 71 75 61 6c 28 74 65 6f 72 69 61 2e 6e 6f  pEqual(teoria.no
1e50: 74 65 28 27 66 62 34 27 29 2e 65 6e 68 61 72 6d  te('fb4').enharm
1e60: 6f 6e 69 63 73 28 74 72 75 65 29 2c 0a 20 20 20  onics(true),.   
1e70: 20 20 20 20 20 5b 27 65 34 27 5d 2e 6d 61 70 28       ['e4'].map(
1e80: 74 65 6f 72 69 61 2e 6e 6f 74 65 29 29 3b 0a 20  teoria.note));. 
1e90: 20 20 20 7d 2c 0a 0a 20 20 20 20 27 63 62 20 69     },..    'cb i
1ea0: 73 20 65 6e 68 61 72 6d 6f 6e 69 63 20 77 69 74  s enharmonic wit
1eb0: 68 20 62 27 3a 20 66 75 6e 63 74 69 6f 6e 28 29  h b': function()
1ec0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 2e   {.      assert.
1ed0: 64 65 65 70 45 71 75 61 6c 28 74 65 6f 72 69 61  deepEqual(teoria
1ee0: 2e 6e 6f 74 65 28 27 63 62 34 27 29 2e 65 6e 68  .note('cb4').enh
1ef0: 61 72 6d 6f 6e 69 63 73 28 74 72 75 65 29 2c 0a  armonics(true),.
1f00: 20 20 20 20 20 20 20 20 5b 27 62 33 27 5d 2e 6d          ['b3'].m
1f10: 61 70 28 74 65 6f 72 69 61 2e 6e 6f 74 65 29 29  ap(teoria.note))
1f20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 2c 0a 0a 20 20  ;.    }.  },..  
1f30: 27 63 6f 70 79 20 64 75 72 61 74 69 6f 6e 20 6f  'copy duration o
1f40: 6e 20 69 6e 74 65 72 76 61 6c 27 3a 20 7b 0a 20  n interval': {. 
1f50: 20 20 20 27 73 74 61 79 20 77 68 6f 6c 65 20 6e     'stay whole n
1f60: 6f 74 65 20 6f 6e 20 63 61 6c 6c 20 69 6e 74 65  ote on call inte
1f70: 72 76 61 6c 27 3a 20 66 75 6e 63 74 69 6f 6e 28  rval': function(
1f80: 29 20 7b 0a 20 20 20 20 20 20 76 61 72 20 6e 6f  ) {.      var no
1f90: 74 65 20 3d 20 74 65 6f 72 69 61 2e 6e 6f 74 65  te = teoria.note
1fa0: 28 27 61 23 27 2c 20 7b 20 64 75 72 61 74 69 6f  ('a#', { duratio
1fb0: 6e 3a 20 31 20 7d 29 3b 0a 20 20 20 20 20 20 61  n: 1 });.      a
1fc0: 73 73 65 72 74 2e 65 71 75 61 6c 28 6e 6f 74 65  ssert.equal(note
1fd0: 2e 64 75 72 61 74 69 6f 6e 2e 76 61 6c 75 65 2c  .duration.value,
1fe0: 20 6e 6f 74 65 2e 69 6e 74 65 72 76 61 6c 28 27   note.interval('
1ff0: 50 35 27 29 2e 64 75 72 61 74 69 6f 6e 2e 76 61  P5').duration.va
2000: 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lue);.    }.  }.
2010: 7d 29 2e 65 78 70 6f 72 74 28 6d 6f 64 75 6c 65  }).export(module
2020: 29 3b 0a                                         );.