spiffyscore

Hex Artifact Content
Login

Artifact f6edc4689fdace889e8376c85c95b7ab6a1d1e84:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70  #!/usr/bin/env p
0010: 79 74 68 6f 6e 0a 0a 69 6d 70 6f 72 74 20 6f 73  ython..import os
0020: 0a 69 6d 70 6f 72 74 20 72 61 6e 64 6f 6d 0a 69  .import random.i
0030: 6d 70 6f 72 74 20 73 79 73 0a 69 6d 70 6f 72 74  mport sys.import
0040: 20 74 69 6d 65 0a 72 61 6e 64 6f 6d 2e 73 65 65   time.random.see
0050: 64 28 74 69 6d 65 2e 74 69 6d 65 28 29 29 0a 69  d(time.time()).i
0060: 6d 70 6f 72 74 20 70 61 72 73 65 0a 0a 64 65 66  mport parse..def
0070: 20 6d 61 69 6e 28 29 3a 0a 20 20 20 20 6b 65 79   main():.    key
0080: 20 3d 20 22 41 22 0a 0a 20 20 20 20 63 6f 6d 70   = "A"..    comp
0090: 6f 73 69 74 69 6f 6e 20 3d 20 7b 0a 20 20 20 20  osition = {.    
00a0: 20 20 20 20 22 61 22 3a 20 7b 20 20 23 20 4d 6f      "a": {  # Mo
00b0: 76 65 6d 65 6e 74 20 62 6c 6f 63 6b 20 27 61 27  vement block 'a'
00c0: 20 66 6f 72 20 72 65 75 73 65 20 74 68 72 6f 75   for reuse throu
00d0: 67 68 6f 75 74 20 74 68 65 20 70 69 65 63 65 0a  ghout the piece.
00e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 65 6c              "mel
00f0: 6f 64 79 22 3a 20 7b 20 20 23 20 49 6e 73 74 72  ody": {  # Instr
0100: 75 6d 65 6e 74 20 27 6d 65 6c 6f 64 79 27 0a 20  ument 'melody'. 
0110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0120: 63 73 6f 75 6e 64 5f 70 61 72 61 6d 65 74 65 72  csound_parameter
0130: 73 22 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  s": {.          
0140: 20 20 20 20 20 20 20 20 20 20 22 69 6e 73 74 72            "instr
0150: 75 6d 65 6e 74 22 3a 20 31 2c 0a 20 20 20 20 20  ument": 1,.     
0160: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 67                "g
0180: 72 61 6d 6d 61 72 73 22 3a 20 7b 20 20 23 20 4e  rammars": {  # N
0190: 6f 74 65 73 20 66 6f 72 20 74 68 69 73 20 69 6e  otes for this in
01a0: 73 74 72 75 6d 65 6e 74 20 74 6f 20 75 73 65 20  strument to use 
01b0: 69 6e 20 74 68 69 73 20 70 69 65 63 65 0a 20 20  in this piece.  
01c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01d0: 20 20 22 75 22 3a 20 5b 22 49 20 56 20 56 20 56    "u": ["I V V V
01e0: 20 49 20 49 20 49 56 20 75 20 75 22 2c 20 22 49   I I IV u u", "I
01f0: 20 49 56 20 75 20 75 22 2c 20 22 49 20 56 49 49   IV u u", "I VII
0200: 20 49 56 20 75 20 75 22 20 20 2c 20 22 65 22 5d   IV u u"  , "e"]
0210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0220: 20 20 20 20 20 20 22 65 22 3a 20 5b 22 22 5d 2c        "e": [""],
0230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0240: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
0250: 20 20 20 20 22 73 63 6f 72 65 22 3a 20 22 75 20      "score": "u 
0260: 75 20 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u u",.          
0270: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20    },.           
0280: 20 22 72 68 79 74 68 6d 22 3a 20 7b 0a 20 20 20   "rhythm": {.   
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 73               "cs
02a0: 6f 75 6e 64 5f 70 61 72 61 6d 65 74 65 72 73 22  ound_parameters"
02b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
02c0: 20 20 20 20 20 20 20 20 22 69 6e 73 74 72 75 6d          "instrum
02d0: 65 6e 74 22 3a 20 31 2c 0a 20 20 20 20 20 20 20  ent": 1,.       
02e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 67 72 61              "gra
0300: 6d 6d 61 72 73 22 3a 20 7b 0a 20 20 20 20 20 20  mmars": {.      
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75                "u
0320: 22 3a 20 5b 27 22 49 22 20 22 49 56 22 2f 32 20  ": ['"I" "IV"/2 
0330: 22 56 22 32 20 22 49 56 22 20 22 49 22 20 75 20  "V"2 "IV" "I" u 
0340: 75 27 2c 20 27 22 49 22 20 22 56 49 49 22 20 22  u', '"I" "VII" "
0350: 49 56 22 20 75 20 75 27 2c 20 27 22 49 22 20 22  IV" u u', '"I" "
0360: 56 22 20 22 49 56 22 20 75 20 75 27 2c 20 22 65  V" "IV" u u', "e
0370: 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "],.            
0380: 20 20 20 20 20 20 20 20 22 65 22 3a 20 5b 22 22          "e": [""
0390: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
03a0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20    },.           
03b0: 20 20 20 20 20 22 73 63 6f 72 65 22 3a 20 22 75       "score": "u
03c0: 20 75 20 75 22 2c 0a 20 20 20 20 20 20 20 20 20   u u",.         
03d0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7d 2c     },.        },
03e0: 0a 20 20 20 20 20 20 20 20 22 62 22 3a 20 7b 0a  .        "b": {.
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 65 6c              "mel
0400: 6f 64 79 22 3a 20 7b 20 20 23 20 49 6e 73 74 72  ody": {  # Instr
0410: 75 6d 65 6e 74 20 27 6d 65 6c 6f 64 79 27 0a 20  ument 'melody'. 
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0430: 63 73 6f 75 6e 64 5f 70 61 72 61 6d 65 74 65 72  csound_parameter
0440: 73 22 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  s": {.          
0450: 20 20 20 20 20 20 20 20 20 20 22 69 6e 73 74 72            "instr
0460: 75 6d 65 6e 74 22 3a 20 31 2c 0a 20 20 20 20 20  ument": 1,.     
0470: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 67                "g
0490: 72 61 6d 6d 61 72 73 22 3a 20 7b 20 20 23 20 4e  rammars": {  # N
04a0: 6f 74 65 73 20 66 6f 72 20 74 68 69 73 20 69 6e  otes for this in
04b0: 73 74 72 75 6d 65 6e 74 20 74 6f 20 75 73 65 20  strument to use 
04c0: 69 6e 20 74 68 69 73 20 70 69 65 63 65 0a 20 20  in this piece.  
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 22 75 22 3a 20 5b 22 49 20 56 20 49 20 49    "u": ["I V I I
04f0: 2f 32 20 49 56 2f 32 20 75 20 75 22 2c 20 22 49  /2 IV/2 u u", "I
0500: 34 20 49 56 20 75 20 75 22 2c 20 22 49 20 49 56  4 IV u u", "I IV
0510: 20 49 56 20 56 49 20 56 20 75 20 75 22 20 20 2c   IV VI V u u"  ,
0520: 20 22 65 22 5d 2c 0a 20 20 20 20 20 20 20 20 20   "e"],.         
0530: 20 20 20 20 20 20 20 20 20 20 20 22 65 22 3a 20             "e": 
0540: 5b 22 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [""],.          
0550: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
0560: 20 20 20 20 20 20 20 20 20 22 73 63 6f 72 65 22           "score"
0570: 3a 20 22 75 20 75 20 75 22 2c 0a 20 20 20 20 20  : "u u u",.     
0580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
0590: 20 20 20 20 20 20 22 72 68 79 74 68 6d 22 3a 20        "rhythm": 
05a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
05b0: 20 20 22 63 73 6f 75 6e 64 5f 70 61 72 61 6d 65    "csound_parame
05c0: 74 65 72 73 22 3a 20 7b 0a 20 20 20 20 20 20 20  ters": {.       
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
05e0: 73 74 72 75 6d 65 6e 74 22 3a 20 31 2c 0a 20 20  strument": 1,.  
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
0600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0610: 20 22 67 72 61 6d 6d 61 72 73 22 3a 20 7b 0a 20   "grammars": {. 
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 20 20 20 22 75 22 3a 20 5b 27 22 49 22 20 22 49     "u": ['"I" "I
0640: 56 22 2f 32 20 22 56 22 32 20 22 49 56 22 20 22  V"/2 "V"2 "IV" "
0650: 49 22 20 75 20 75 27 2c 20 27 22 49 22 20 22 56  I" u u', '"I" "V
0660: 49 49 22 20 22 49 56 22 20 75 20 75 27 2c 20 27  II" "IV" u u', '
0670: 22 49 22 20 22 56 22 20 22 49 56 22 20 75 20 75  "I" "V" "IV" u u
0680: 27 2c 20 22 65 22 5d 2c 0a 20 20 20 20 20 20 20  ', "e"],.       
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 22               "e"
06a0: 3a 20 5b 22 22 5d 0a 20 20 20 20 20 20 20 20 20  : [""].         
06b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
06c0: 20 20 20 20 20 20 20 20 20 20 22 73 63 6f 72 65            "score
06d0: 22 3a 20 22 75 20 75 20 75 22 2c 0a 20 20 20 20  ": "u u u",.    
06e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
06f0: 20 20 20 7d 2c 0a 20 20 20 20 7d 0a 0a 20 20 20     },.    }..   
0700: 20 66 6f 72 20 63 6f 6d 70 5f 6e 61 6d 65 2c 20   for comp_name, 
0710: 63 6f 6d 70 20 69 6e 20 63 6f 6d 70 6f 73 69 74  comp in composit
0720: 69 6f 6e 2e 69 74 65 72 69 74 65 6d 73 28 29 3a  ion.iteritems():
0730: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73  .        for ins
0740: 74 72 5f 6e 61 6d 65 2c 20 69 6e 73 74 72 20 69  tr_name, instr i
0750: 6e 20 63 6f 6d 70 2e 69 74 65 72 69 74 65 6d 73  n comp.iteritems
0760: 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ():.            
0770: 67 65 6e 65 72 61 74 65 64 5f 73 63 6f 72 65 20  generated_score 
0780: 3d 20 67 65 6e 65 72 61 74 65 5f 73 63 6f 72 65  = generate_score
0790: 28 69 6e 73 74 72 5b 22 73 63 6f 72 65 22 5d 2c  (instr["score"],
07a0: 20 69 6e 73 74 72 5b 22 67 72 61 6d 6d 61 72 73   instr["grammars
07b0: 22 5d 29 20 20 23 20 46 69 6c 6c 20 69 6e 20 74  "])  # Fill in t
07c0: 68 65 20 73 63 6f 72 65 73 20 62 79 20 67 65 6e  he scores by gen
07d0: 65 72 61 74 69 6e 67 20 74 68 65 6d 20 62 61 73  erating them bas
07e0: 65 64 20 6f 6e 20 74 68 65 20 67 72 61 6d 6d 61  ed on the gramma
07f0: 72 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  rs.#            
0800: 20 20 20 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b      composition[
0810: 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72  comp_name][instr
0820: 5f 6e 61 6d 65 5d 5b 67 72 61 6d 6d 61 72 5d 5b  _name][grammar][
0830: 22 73 63 6f 72 65 22 5d 20 3d 20 70 61 72 73 65  "score"] = parse
0840: 2e 70 61 72 73 65 28 67 65 6e 65 72 61 74 65 5f  .parse(generate_
0850: 73 63 6f 72 65 29 20 20 23 20 52 65 74 75 72 6e  score)  # Return
0860: 20 4e 6f 64 65 2f 43 68 6f 72 64 20 6f 62 6a 65   Node/Chord obje
0870: 63 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  cts.            
0880: 73 63 6f 72 65 20 3d 20 70 61 72 73 65 2e 70 61  score = parse.pa
0890: 72 73 65 28 67 65 6e 65 72 61 74 65 64 5f 73 63  rse(generated_sc
08a0: 6f 72 65 29 20 20 23 20 52 65 74 75 72 6e 20 4e  ore)  # Return N
08b0: 6f 64 65 2f 43 68 6f 72 64 20 6f 62 6a 65 63 74  ode/Chord object
08c0: 73 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
08d0: 20 47 65 6e 65 72 61 74 65 20 74 69 6d 65 73 74   Generate timest
08e0: 61 6d 70 73 20 66 6f 72 20 74 68 65 20 6e 6f 74  amps for the not
08f0: 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  es .            
0900: 74 20 3d 20 30 0a 20 20 20 20 20 20 20 20 20 20  t = 0.          
0910: 20 20 66 6f 72 20 6e 6f 74 65 20 69 6e 20 72 61    for note in ra
0920: 6e 67 65 28 6c 65 6e 28 73 63 6f 72 65 29 29 3a  nge(len(score)):
0930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0940: 20 73 63 6f 72 65 5b 6e 6f 74 65 5d 2e 74 69 6d   score[note].tim
0950: 65 20 3d 20 74 0a 20 20 20 20 20 20 20 20 20 20  e = t.          
0960: 20 20 20 20 20 20 74 20 2b 3d 20 73 63 6f 72 65        t += score
0970: 5b 6e 6f 74 65 5d 2e 64 75 72 61 74 69 6f 6e 0a  [note].duration.
0980: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70              comp
0990: 6f 73 69 74 69 6f 6e 5b 63 6f 6d 70 5f 6e 61 6d  osition[comp_nam
09a0: 65 5d 5b 69 6e 73 74 72 5f 6e 61 6d 65 5d 5b 22  e][instr_name]["
09b0: 73 63 6f 72 65 22 5d 20 3d 20 73 63 6f 72 65 0a  score"] = score.
09c0: 0a 20 20 20 20 23 20 4d 75 73 74 20 62 65 20 64  .    # Must be d
09d0: 6f 6e 65 20 61 66 74 65 72 20 61 6c 6c 20 6e 6f  one after all no
09e0: 74 65 20 74 69 6d 65 73 20 6b 65 79 65 64 20 69  te times keyed i
09f0: 6e 2c 20 65 6c 73 65 20 79 6f 75 20 63 2c 61 6e  n, else you c,an
0a00: 27 74 20 63 6f 6f 72 64 69 6e 61 74 65 20 6d 65  't coordinate me
0a10: 6c 6f 64 69 65 73 20 77 69 74 68 20 74 68 65 20  lodies with the 
0a20: 72 68 79 74 68 6d 20 63 68 6f 72 64 73 0a 20 20  rhythm chords.  
0a30: 20 20 66 6f 72 20 63 6f 6d 70 5f 6e 61 6d 65 2c    for comp_name,
0a40: 20 63 6f 6d 70 20 69 6e 20 63 6f 6d 70 6f 73 69   comp in composi
0a50: 74 69 6f 6e 2e 69 74 65 72 69 74 65 6d 73 28 29  tion.iteritems()
0a60: 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  :.        for in
0a70: 73 74 72 5f 6e 61 6d 65 2c 20 69 6e 73 74 72 20  str_name, instr 
0a80: 69 6e 20 63 6f 6d 70 2e 69 74 65 72 69 74 65 6d  in comp.iteritem
0a90: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s():.           
0aa0: 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63 6f 6d   composition[com
0ab0: 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72 5f 6e 61  p_name][instr_na
0ac0: 6d 65 5d 5b 22 73 63 6f 72 65 22 5d 20 3d 20 74  me]["score"] = t
0ad0: 72 61 6e 73 6c 69 74 65 72 61 74 65 5f 73 63 6f  ransliterate_sco
0ae0: 72 65 28 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63  re(composition[c
0af0: 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72 5f  omp_name][instr_
0b00: 6e 61 6d 65 5d 5b 22 73 63 6f 72 65 22 5d 2c 20  name]["score"], 
0b10: 6b 65 79 29 0a 23 20 20 20 20 20 20 20 20 20 20  key).#          
0b20: 20 20 70 72 69 6e 74 20 22 5c 6e 4d 6f 76 65 6d    print "\nMovem
0b30: 65 6e 74 20 25 73 20 69 6e 73 74 72 75 6d 65 6e  ent %s instrumen
0b40: 74 20 25 73 22 20 25 20 28 63 6f 6d 70 5f 6e 61  t %s" % (comp_na
0b50: 6d 65 2c 20 69 6e 73 74 72 5f 6e 61 6d 65 29 0a  me, instr_name).
0b60: 23 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  #            pri
0b70: 6e 74 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63  nt composition[c
0b80: 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72 5f  omp_name][instr_
0b90: 6e 61 6d 65 5d 5b 22 73 63 6f 72 65 22 5d 20 0a  name]["score"] .
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
0bb0: 74 20 22 66 31 20 20 30 20 20 20 32 35 36 20 31  t "f1  0   256 1
0bc0: 30 20 20 31 20 30 20 33 20 20 20 3b 20 73 69 6e  0  1 0 3   ; sin
0bd0: 65 20 77 61 76 65 20 66 75 6e 63 74 69 6f 6e 20  e wave function 
0be0: 74 61 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20  table".         
0bf0: 20 20 20 66 69 6e 61 6c 5f 73 63 6f 72 65 20 3d     final_score =
0c00: 20 67 65 6e 65 72 61 74 65 5f 63 73 6f 75 6e 64   generate_csound
0c10: 5f 73 63 6f 72 65 28 63 6f 6d 70 6f 73 69 74 69  _score(compositi
0c20: 6f 6e 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e  on[comp_name][in
0c30: 73 74 72 5f 6e 61 6d 65 5d 5b 22 73 63 6f 72 65  str_name]["score
0c40: 22 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]).            
0c50: 66 6f 72 20 6c 69 6e 65 20 69 6e 20 66 69 6e 61  for line in fina
0c60: 6c 5f 73 63 6f 72 65 3a 0a 20 20 20 20 20 20 20  l_score:.       
0c70: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 6c           print l
0c80: 69 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ine.            
0c90: 0a 0a 64 65 66 20 6d 61 6b 65 5f 73 63 61 6c 65  ..def make_scale
0ca0: 28 6b 65 79 29 3a 0a 20 20 20 20 6e 6f 74 65 73  (key):.    notes
0cb0: 20 3d 20 5b 22 41 22 2c 20 22 41 23 22 2c 20 22   = ["A", "A#", "
0cc0: 42 22 2c 20 22 43 22 2c 20 22 43 23 22 2c 20 22  B", "C", "C#", "
0cd0: 44 22 2c 20 22 44 23 22 2c 20 22 45 22 2c 20 22  D", "D#", "E", "
0ce0: 46 22 2c 20 22 46 23 22 2c 20 22 47 22 2c 20 22  F", "F#", "G", "
0cf0: 47 23 22 5d 0a 20 20 20 20 73 63 61 6c 65 20 3d  G#"].    scale =
0d00: 20 5b 6b 65 79 5d 0a 20 20 20 20 70 6f 73 20 3d   [key].    pos =
0d10: 20 6e 6f 74 65 73 2e 69 6e 64 65 78 28 6b 65 79   notes.index(key
0d20: 29 0a 20 20 20 20 70 72 6f 67 72 65 73 73 69 6f  ).    progressio
0d30: 6e 20 3d 20 5b 32 2c 32 2c 31 2c 32 2c 32 2c 32  n = [2,2,1,2,2,2
0d40: 2c 31 5d 0a 20 20 20 20 66 6f 72 20 70 20 69 6e  ,1].    for p in
0d50: 20 70 72 6f 67 72 65 73 73 69 6f 6e 3a 0a 20 20   progression:.  
0d60: 20 20 20 20 20 20 70 6f 73 20 3d 20 28 70 6f 73        pos = (pos
0d70: 20 2b 20 70 29 20 25 20 31 32 0a 20 20 20 20 20   + p) % 12.     
0d80: 20 20 20 73 63 61 6c 65 2e 61 70 70 65 6e 64 28     scale.append(
0d90: 6e 6f 74 65 73 5b 70 6f 73 5d 29 0a 20 20 20 20  notes[pos]).    
0da0: 72 65 74 75 72 6e 20 73 63 61 6c 65 0a 0a 0a 64  return scale...d
0db0: 65 66 20 67 65 6e 65 72 61 74 65 5f 73 63 6f 72  ef generate_scor
0dc0: 65 28 73 63 6f 72 65 2c 20 67 72 61 6d 6d 61 72  e(score, grammar
0dd0: 73 29 3a 0a 20 20 20 20 77 68 69 6c 65 20 31 3a  s):.    while 1:
0de0: 0a 20 20 20 20 20 20 20 20 66 6f 75 6e 64 5f 73  .        found_s
0df0: 75 62 73 74 69 74 75 74 69 6f 6e 20 3d 20 46 61  ubstitution = Fa
0e00: 6c 73 65 0a 20 20 20 20 20 20 20 20 66 6f 72 20  lse.        for 
0e10: 6b 65 79 2c 76 61 6c 75 65 20 69 6e 20 67 72 61  key,value in gra
0e20: 6d 6d 61 72 73 2e 69 74 65 72 69 74 65 6d 73 28  mmars.iteritems(
0e30: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
0e40: 66 20 73 63 6f 72 65 2e 66 69 6e 64 28 6b 65 79  f score.find(key
0e50: 29 20 21 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20  ) != -1:.       
0e60: 20 20 20 20 20 20 20 20 20 66 6f 75 6e 64 5f 73           found_s
0e70: 75 62 73 74 69 74 75 74 69 6f 6e 20 3d 20 54 72  ubstitution = Tr
0e80: 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
0e90: 20 20 20 77 68 69 6c 65 20 73 63 6f 72 65 2e 66     while score.f
0ea0: 69 6e 64 28 6b 65 79 29 20 21 3d 20 2d 31 3a 0a  ind(key) != -1:.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 73 63 6f 72 65 20 3d 20 73 63 6f 72      score = scor
0ed0: 65 2e 72 65 70 6c 61 63 65 28 6b 65 79 2c 20 72  e.replace(key, r
0ee0: 61 6e 64 6f 6d 2e 63 68 6f 69 63 65 28 67 72 61  andom.choice(gra
0ef0: 6d 6d 61 72 73 5b 6b 65 79 5d 29 2c 20 31 29 0a  mmars[key]), 1).
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 69 66 20 6c 65 6e 28 73 63 6f 72 65      if len(score
0f20: 2e 73 70 6c 69 74 28 29 29 20 3e 20 32 30 30 3a  .split()) > 200:
0f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f40: 20 20 20 20 20 20 20 20 20 73 63 6f 72 65 20 3d           score =
0f50: 20 73 63 6f 72 65 2e 72 65 70 6c 61 63 65 28 22   score.replace("
0f60: 75 22 2c 20 22 22 29 0a 20 20 20 20 20 20 20 20  u", "").        
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 73 63 6f 72 65 20 3d 20 73 63 6f 72 65 2e 72 65  score = score.re
0f90: 70 6c 61 63 65 28 22 65 22 2c 20 22 22 29 0a 20  place("e", ""). 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 63         return sc
0fc0: 6f 72 65 0a 20 20 20 20 20 20 20 20 69 66 20 66  ore.        if f
0fd0: 6f 75 6e 64 5f 73 75 62 73 74 69 74 75 74 69 6f  ound_substitutio
0fe0: 6e 20 69 73 20 46 61 6c 73 65 3a 0a 20 20 20 20  n is False:.    
0ff0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20          break.  
1000: 20 20 72 65 74 75 72 6e 20 73 63 6f 72 65 0a 0a    return score..
1010: 64 65 66 20 74 72 61 6e 73 6c 69 74 65 72 61 74  def transliterat
1020: 65 5f 73 63 6f 72 65 28 73 63 6f 72 65 2c 20 6b  e_score(score, k
1030: 65 79 29 3a 0a 20 20 20 20 73 63 61 6c 65 20 3d  ey):.    scale =
1040: 20 6d 61 6b 65 5f 73 63 61 6c 65 28 6b 65 79 29   make_scale(key)
1050: 0a 20 20 20 20 73 63 61 6c 65 5f 63 6f 6e 76 65  .    scale_conve
1060: 72 73 69 6f 6e 20 3d 20 7b 0a 20 20 20 20 20 20  rsion = {.      
1070: 20 20 22 49 22 3a 20 31 2c 0a 20 20 20 20 20 20    "I": 1,.      
1080: 20 20 22 49 49 22 3a 20 32 2c 0a 20 20 20 20 20    "II": 2,.     
1090: 20 20 20 22 49 49 49 22 3a 20 33 2c 0a 20 20 20     "III": 3,.   
10a0: 20 20 20 20 20 22 49 56 22 3a 20 34 2c 0a 20 20       "IV": 4,.  
10b0: 20 20 20 20 20 20 22 56 22 3a 20 35 2c 0a 20 20        "V": 5,.  
10c0: 20 20 20 20 20 20 22 56 49 22 3a 20 36 2c 0a 20        "VI": 6,. 
10d0: 20 20 20 20 20 20 20 22 56 49 49 22 3a 20 37 2c         "VII": 7,
10e0: 0a 20 20 20 20 20 20 20 20 22 56 49 49 49 22 3a  .        "VIII":
10f0: 20 38 2c 0a 20 20 20 20 7d 0a 20 20 20 20 6b 65   8,.    }.    ke
1100: 79 65 64 5f 73 63 6f 72 65 20 3d 20 5b 5d 0a 20  yed_score = []. 
1110: 20 20 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 67     for i in rang
1120: 65 28 6c 65 6e 28 73 63 6f 72 65 29 29 3a 0a 20  e(len(score)):. 
1130: 20 20 20 20 20 20 20 69 66 20 69 73 69 6e 73 74         if isinst
1140: 61 6e 63 65 28 73 63 6f 72 65 5b 69 5d 2c 20 70  ance(score[i], p
1150: 61 72 73 65 2e 4e 6f 74 65 29 3a 0a 20 20 20 20  arse.Note):.    
1160: 20 20 20 20 20 20 20 20 73 63 6f 72 65 5b 69 5d          score[i]
1170: 2e 76 61 6c 75 65 20 3d 20 73 63 61 6c 65 5b 73  .value = scale[s
1180: 63 61 6c 65 5f 63 6f 6e 76 65 72 73 69 6f 6e 5b  cale_conversion[
1190: 73 63 6f 72 65 5b 69 5d 2e 76 61 6c 75 65 5d 2d  score[i].value]-
11a0: 31 5d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a  1].        else:
11b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 6f  .            cho
11c0: 72 64 20 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20  rd = [].        
11d0: 20 20 20 20 72 6f 6f 74 5f 6e 6f 74 65 5f 69 6e      root_note_in
11e0: 64 65 78 20 3d 20 73 63 61 6c 65 2e 69 6e 64 65  dex = scale.inde
11f0: 78 28 6b 65 79 29 20 2b 20 73 63 61 6c 65 5f 63  x(key) + scale_c
1200: 6f 6e 76 65 72 73 69 6f 6e 5b 73 63 6f 72 65 5b  onversion[score[
1210: 69 5d 2e 76 61 6c 75 65 5d 0a 20 20 20 20 20 20  i].value].      
1220: 20 20 20 20 20 20 63 68 6f 72 64 2e 61 70 70 65        chord.appe
1230: 6e 64 28 73 63 61 6c 65 5b 72 6f 6f 74 5f 6e 6f  nd(scale[root_no
1240: 74 65 5f 69 6e 64 65 78 5d 29 0a 20 20 20 20 20  te_index]).     
1250: 20 20 20 20 20 20 20 63 68 6f 72 64 2e 61 70 70         chord.app
1260: 65 6e 64 28 73 63 61 6c 65 5b 28 72 6f 6f 74 5f  end(scale[(root_
1270: 6e 6f 74 65 5f 69 6e 64 65 78 2b 33 29 20 25 20  note_index+3) % 
1280: 38 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  8]).            
1290: 63 68 6f 72 64 2e 61 70 70 65 6e 64 28 73 63 61  chord.append(sca
12a0: 6c 65 5b 28 72 6f 6f 74 5f 6e 6f 74 65 5f 69 6e  le[(root_note_in
12b0: 64 65 78 2b 35 29 20 25 20 38 5d 29 0a 20 20 20  dex+5) % 8]).   
12c0: 20 20 20 20 20 20 20 20 20 73 63 6f 72 65 5b 69           score[i
12d0: 5d 2e 63 68 6f 72 64 20 3d 20 63 68 6f 72 64 0a  ].chord = chord.
12e0: 20 20 20 20 72 65 74 75 72 6e 20 73 63 6f 72 65      return score
12f0: 0a 0a 0a 64 65 66 20 67 65 6e 65 72 61 74 65 5f  ...def generate_
1300: 63 73 6f 75 6e 64 5f 73 63 6f 72 65 28 73 63 6f  csound_score(sco
1310: 72 65 29 3a 0a 20 20 20 20 63 73 6f 75 6e 64 5f  re):.    csound_
1320: 6e 6f 74 65 5f 76 61 6c 75 65 73 20 3d 20 7b 0a  note_values = {.
1330: 20 20 20 20 20 20 20 20 22 43 22 3a 20 22 30 30          "C": "00
1340: 22 2c 0a 20 20 20 20 20 20 20 20 22 43 23 22 3a  ",.        "C#":
1350: 20 22 30 31 22 2c 0a 20 20 20 20 20 20 20 20 22   "01",.        "
1360: 44 22 3a 20 22 30 32 22 2c 0a 20 20 20 20 20 20  D": "02",.      
1370: 20 20 22 44 23 22 3a 20 22 30 33 22 2c 0a 20 20    "D#": "03",.  
1380: 20 20 20 20 20 20 22 45 22 3a 20 22 30 34 22 2c        "E": "04",
1390: 0a 20 20 20 20 20 20 20 20 22 46 22 3a 20 22 30  .        "F": "0
13a0: 35 22 2c 0a 20 20 20 20 20 20 20 20 22 46 23 22  5",.        "F#"
13b0: 3a 20 22 30 36 22 2c 0a 20 20 20 20 20 20 20 20  : "06",.        
13c0: 22 47 22 3a 20 22 30 37 22 2c 0a 20 20 20 20 20  "G": "07",.     
13d0: 20 20 20 22 47 23 22 3a 20 22 30 38 22 2c 0a 20     "G#": "08",. 
13e0: 20 20 20 20 20 20 20 22 41 22 3a 20 22 30 39 22         "A": "09"
13f0: 2c 0a 20 20 20 20 20 20 20 20 22 41 23 22 3a 20  ,.        "A#": 
1400: 22 31 30 22 2c 0a 20 20 20 20 20 20 20 20 22 42  "10",.        "B
1410: 22 3a 20 22 31 31 22 2c 0a 20 20 20 20 7d 0a 20  ": "11",.    }. 
1420: 20 20 20 74 20 3d 20 30 20 0a 20 20 20 20 63 73     t = 0 .    cs
1430: 6f 75 6e 64 5f 73 63 6f 72 65 20 3d 20 5b 5d 0a  ound_score = [].
1440: 20 20 20 20 66 6f 72 20 74 6f 6b 65 6e 20 69 6e      for token in
1450: 20 73 63 6f 72 65 3a 0a 20 20 20 20 20 20 20 20   score:.        
1460: 69 66 20 69 73 69 6e 73 74 61 6e 63 65 28 74 6f  if isinstance(to
1470: 6b 65 6e 2c 20 70 61 72 73 65 2e 43 68 6f 72 64  ken, parse.Chord
1480: 29 3a 20 20 23 20 43 68 6f 72 64 73 0a 20 20 20  ):  # Chords.   
1490: 20 20 20 20 20 20 20 20 20 66 6f 72 20 6e 6f 74           for not
14a0: 65 20 69 6e 20 74 6f 6b 65 6e 2e 63 68 6f 72 64  e in token.chord
14b0: 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
14c0: 20 20 20 6e 6f 74 65 20 3d 20 63 73 6f 75 6e 64     note = csound
14d0: 5f 6e 6f 74 65 5f 76 61 6c 75 65 73 5b 6e 6f 74  _note_values[not
14e0: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
14f0: 20 20 20 63 73 6f 75 6e 64 5f 73 63 6f 72 65 2e     csound_score.
1500: 61 70 70 65 6e 64 28 22 69 32 20 25 28 74 69 6d  append("i2 %(tim
1510: 65 29 66 20 31 20 37 30 30 30 20 25 28 6f 63 74  e)f 1 7000 %(oct
1520: 61 76 65 29 64 2e 25 28 6e 6f 74 65 29 73 20 25  ave)d.%(note)s %
1530: 28 6f 63 74 61 76 65 29 64 2e 25 28 6e 6f 74 65  (octave)d.%(note
1540: 29 73 20 30 20 36 22 20 25 20 7b 22 74 69 6d 65  )s 0 6" % {"time
1550: 22 3a 20 74 2c 20 22 6f 63 74 61 76 65 22 3a 20  ": t, "octave": 
1560: 72 61 6e 64 6f 6d 2e 63 68 6f 69 63 65 28 5b 37  random.choice([7
1570: 2c 38 5d 29 2c 20 22 6e 6f 74 65 22 3a 20 6e 6f  ,8]), "note": no
1580: 74 65 7d 29 0a 20 20 20 20 20 20 20 20 20 20 20  te}).           
1590: 20 74 20 2b 3d 20 31 0a 20 20 20 20 20 20 20 20   t += 1.        
15a0: 65 6c 73 65 3a 20 20 23 20 49 6e 64 69 76 69 64  else:  # Individ
15b0: 75 61 6c 20 6e 6f 74 65 73 0a 20 20 20 20 20 20  ual notes.      
15c0: 20 20 20 20 20 20 6e 6f 74 65 20 3d 20 63 73 6f        note = cso
15d0: 75 6e 64 5f 6e 6f 74 65 5f 76 61 6c 75 65 73 5b  und_note_values[
15e0: 74 6f 6b 65 6e 2e 76 61 6c 75 65 5d 0a 20 20 20  token.value].   
15f0: 20 20 20 20 20 20 20 20 20 63 73 6f 75 6e 64 5f           csound_
1600: 73 63 6f 72 65 2e 61 70 70 65 6e 64 28 22 69 32  score.append("i2
1610: 20 25 28 74 69 6d 65 29 66 20 31 20 37 30 30 30   %(time)f 1 7000
1620: 20 25 28 6f 63 74 61 76 65 29 64 2e 25 28 6e 6f   %(octave)d.%(no
1630: 74 65 29 73 20 25 28 6f 63 74 61 76 65 29 64 2e  te)s %(octave)d.
1640: 25 28 6e 6f 74 65 29 73 20 30 20 36 22 20 25 20  %(note)s 0 6" % 
1650: 7b 22 74 69 6d 65 22 3a 20 74 2c 20 22 6f 63 74  {"time": t, "oct
1660: 61 76 65 22 3a 20 72 61 6e 64 6f 6d 2e 63 68 6f  ave": random.cho
1670: 69 63 65 28 5b 38 2c 39 5d 29 2c 20 22 6e 6f 74  ice([8,9]), "not
1680: 65 22 3a 20 6e 6f 74 65 7d 29 0a 20 20 20 20 20  e": note}).     
1690: 20 20 20 20 20 20 20 74 20 2b 3d 20 2e 32 35 0a         t += .25.
16a0: 20 20 20 20 72 65 74 75 72 6e 20 63 73 6f 75 6e      return csoun
16b0: 64 5f 73 63 6f 72 65 0a 0a 0a 69 66 20 5f 5f 6e  d_score...if __n
16c0: 61 6d 65 5f 5f 20 3d 3d 20 22 5f 5f 6d 61 69 6e  ame__ == "__main
16d0: 5f 5f 22 3a 20 6d 61 69 6e 28 29 20 0a           __": main() .