spiffyscore

Hex Artifact Content
Login

Artifact 6f8ab10545b49109b95e8e1541ab3e2e80f41b87:


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 66 72 6f 6d 20 5f 5f 66 75  ython..from __fu
0020: 74 75 72 65 5f 5f 20 69 6d 70 6f 72 74 20 64 69  ture__ import di
0030: 76 69 73 69 6f 6e 0a 69 6d 70 6f 72 74 20 6f 73  vision.import os
0040: 0a 69 6d 70 6f 72 74 20 70 64 62 0a 69 6d 70 6f  .import pdb.impo
0050: 72 74 20 72 61 6e 64 6f 6d 0a 69 6d 70 6f 72 74  rt random.import
0060: 20 73 79 73 0a 69 6d 70 6f 72 74 20 74 69 6d 65   sys.import time
0070: 0a 69 6d 70 6f 72 74 20 70 61 72 73 65 0a 0a 69  .import parse..i
0080: 6d 70 6f 72 74 20 74 72 65 65 0a 0a 72 61 6e 64  mport tree..rand
0090: 6f 6d 2e 73 65 65 64 28 74 69 6d 65 2e 74 69 6d  om.seed(time.tim
00a0: 65 28 29 29 0a 0a 64 65 66 20 6d 61 69 6e 28 29  e())..def main()
00b0: 3a 0a 20 20 20 20 6b 65 79 20 3d 20 22 41 22 0a  :.    key = "A".
00c0: 20 20 20 20 62 70 73 20 3d 20 36 30 2f 36 30 0a      bps = 60/60.
00d0: 20 20 20 20 74 65 6d 70 6f 20 3d 20 31 2f 62 70      tempo = 1/bp
00e0: 73 0a 20 20 20 20 6d 61 78 5f 64 75 72 61 74 69  s.    max_durati
00f0: 6f 6e 20 3d 20 31 0a 0a 20 20 20 20 63 6f 6d 70  on = 1..    comp
0100: 6f 73 69 74 69 6f 6e 20 3d 20 7b 0a 20 20 20 20  osition = {.    
0110: 20 20 20 20 22 6f 76 65 72 76 69 65 77 22 3a 20      "overview": 
0120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6d  {.            "m
0130: 65 6c 6f 64 79 22 3a 20 7b 20 20 23 20 49 6e 73  elody": {  # Ins
0140: 74 72 75 6d 65 6e 74 20 27 6d 65 6c 6f 64 79 27  trument 'melody'
0150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0160: 20 22 73 63 6f 72 65 5f 6c 69 6e 65 22 3a 20 22   "score_line": "
0170: 69 32 20 25 28 74 69 6d 65 29 66 20 25 28 64 75  i2 %(time)f %(du
0180: 72 61 74 69 6f 6e 29 66 20 37 30 30 30 20 25 28  ration)f 7000 %(
0190: 6f 63 74 61 76 65 29 64 2e 25 28 6e 6f 74 65 29  octave)d.%(note)
01a0: 73 20 32 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s 2",.          
01b0: 20 20 20 20 20 20 22 6f 63 74 61 76 65 22 3a 20        "octave": 
01c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
01d0: 20 20 20 22 64 75 72 61 74 69 6f 6e 22 3a 20 34     "duration": 4
01e0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
01f0: 20 20 20 22 67 72 61 6d 6d 61 72 73 22 3a 20 7b     "grammars": {
0200: 20 20 23 20 4e 6f 74 65 73 20 66 6f 72 20 74 68    # Notes for th
0210: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 20 74 6f  is instrument to
0220: 20 75 73 65 20 69 6e 20 74 68 69 73 20 70 69 65   use in this pie
0230: 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ce.             
0240: 20 20 20 20 20 20 20 22 75 22 3a 20 5b 22 43 20         "u": ["C 
0250: 47 2f 32 20 47 2f 32 20 47 2f 32 20 43 20 42 2c  G/2 G/2 G/2 C B,
0260: 20 46 27 20 43 20 46 20 43 20 42 20 46 20 28 75   F' C F C B F (u
0270: 29 22 5d 2c 0a 23 20 20 20 20 20 20 20 20 20 20  )"],.#          
0280: 20 20 20 20 20 20 20 20 20 20 22 77 22 3a 20 5b            "w": [
0290: 27 45 2f 34 20 41 2f 34 20 44 2f 34 20 47 2f 34  'E/4 A/4 D/4 G/4
02a0: 20 46 2f 34 20 46 2f 34 20 42 32 27 5d 2c 0a 20   F/4 F/4 B2'],. 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
02c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
02d0: 20 20 22 73 63 6f 72 65 22 3a 20 22 75 20 75 22    "score": "u u"
02e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ,.            },
02f0: 0a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  .        },.    
0300: 7d 0a 20 20 20 20 70 72 69 6e 74 20 27 27 27 66  }.    print '''f
0310: 31 20 20 30 20 20 35 31 32 20 20 31 30 20 20 31  1  0  512  10  1
0320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 32 20  .            f2 
0330: 30 20 38 31 39 32 20 31 30 20 2e 32 34 20 2e 36  0 8192 10 .24 .6
0340: 34 20 2e 38 38 20 2e 37 36 20 2e 30 36 20 2e 35  4 .88 .76 .06 .5
0350: 20 2e 33 34 20 2e 30 38 0a 20 20 20 20 20 20 20   .34 .08.       
0360: 20 20 20 20 20 66 33 20 30 20 31 30 32 35 20 31       f3 0 1025 1
0370: 30 20 31 0a 20 20 20 20 27 27 27 0a 20 20 20 20  0 1.    '''.    
0380: 6d 6f 76 65 6d 65 6e 74 5f 73 74 61 72 74 20 3d  movement_start =
0390: 20 30 0a 0a 0a 20 20 20 20 6d 61 78 5f 74 20 3d   0...    max_t =
03a0: 20 30 20 20 23 20 6d 61 78 20 74 69 6d 65 20 65   0  # max time e
03b0: 6e 63 6f 75 6e 74 65 72 65 64 20 73 6f 20 66 61  ncountered so fa
03c0: 72 2e 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 65  r. Used for move
03d0: 6d 65 6e 74 20 74 69 6d 69 6e 67 0a 20 20 20 20  ment timing.    
03e0: 70 72 6f 67 72 65 73 73 69 6f 6e 20 3d 20 22 6f  progression = "o
03f0: 76 65 72 76 69 65 77 22 0a 20 20 20 20 66 6f 72  verview".    for
0400: 20 63 6f 6d 70 5f 6e 61 6d 65 20 69 6e 20 70 72   comp_name in pr
0410: 6f 67 72 65 73 73 69 6f 6e 2e 73 70 6c 69 74 28  ogression.split(
0420: 29 3a 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 5f  ):.        comp_
0430: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 6d 61 78  start_time = max
0440: 5f 74 0a 20 20 20 20 20 20 20 20 23 20 57 65 20  _t.        # We 
0450: 6e 65 65 64 20 61 6e 20 61 72 62 69 74 72 61 72  need an arbitrar
0460: 79 20 67 72 61 6d 6d 61 72 20 66 72 6f 6d 20 74  y grammar from t
0470: 68 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 20 74  his instrument t
0480: 6f 20 73 74 61 72 74 20 74 68 65 20 73 63 6f 72  o start the scor
0490: 65 20 77 69 74 68 0a 20 20 20 20 20 20 20 20 6d  e with.        m
04a0: 61 78 5f 69 6e 73 74 72 20 3d 20 20 30 0a 20 20  ax_instr =  0.  
04b0: 20 20 20 20 20 20 6d 6f 76 65 6d 65 6e 74 5f 73        movement_s
04c0: 74 61 72 74 20 2b 3d 20 6d 61 78 5f 69 6e 73 74  tart += max_inst
04d0: 72 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  r.        for in
04e0: 73 74 72 5f 6e 61 6d 65 2c 20 69 6e 73 74 72 20  str_name, instr 
04f0: 69 6e 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63  in composition[c
0500: 6f 6d 70 5f 6e 61 6d 65 5d 2e 69 74 65 72 69 74  omp_name].iterit
0510: 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20 20 20  ems():.         
0520: 20 20 20 66 6f 72 20 67 72 61 6d 6d 61 72 20 69     for grammar i
0530: 6e 20 69 6e 73 74 72 5b 22 67 72 61 6d 6d 61 72  n instr["grammar
0540: 73 22 5d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s"]:.           
0550: 20 20 20 20 20 66 6f 72 20 67 20 69 6e 20 72 61       for g in ra
0560: 6e 67 65 28 6c 65 6e 28 69 6e 73 74 72 5b 22 67  nge(len(instr["g
0570: 72 61 6d 6d 61 72 73 22 5d 5b 67 72 61 6d 6d 61  rammars"][gramma
0580: 72 5d 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20  r])):.          
0590: 20 20 20 20 20 20 20 20 20 20 69 6e 73 74 72 5b            instr[
05a0: 22 67 72 61 6d 6d 61 72 73 22 5d 5b 67 72 61 6d  "grammars"][gram
05b0: 6d 61 72 5d 5b 67 5d 20 3d 20 70 61 72 73 65 2e  mar][g] = parse.
05c0: 70 61 72 73 65 28 69 6e 73 74 72 5b 22 67 72 61  parse(instr["gra
05d0: 6d 6d 61 72 73 22 5d 5b 67 72 61 6d 6d 61 72 5d  mmars"][grammar]
05e0: 5b 67 5d 2c 20 64 65 66 61 75 6c 74 5f 6f 63 74  [g], default_oct
05f0: 61 76 65 3d 69 6e 73 74 72 5b 22 6f 63 74 61 76  ave=instr["octav
0600: 65 22 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  e"]).           
0610: 20 67 20 3d 20 72 61 6e 64 6f 6d 2e 63 68 6f 69   g = random.choi
0620: 63 65 28 69 6e 73 74 72 5b 22 67 72 61 6d 6d 61  ce(instr["gramma
0630: 72 73 22 5d 2e 6b 65 79 73 28 29 29 0a 20 20 20  rs"].keys()).   
0640: 20 20 20 20 20 20 20 20 20 69 6e 73 5f 73 63 6f           ins_sco
0650: 72 65 20 3d 20 72 61 6e 64 6f 6d 2e 63 68 6f 69  re = random.choi
0660: 63 65 28 69 6e 73 74 72 5b 22 67 72 61 6d 6d 61  ce(instr["gramma
0670: 72 73 22 5d 5b 67 5d 29 0a 23 20 20 20 20 20 20  rs"][g]).#      
0680: 20 20 20 20 20 20 69 6e 73 5f 73 63 6f 72 65 20        ins_score 
0690: 3d 20 69 6e 73 74 72 5b 22 67 72 61 6d 6d 61 72  = instr["grammar
06a0: 73 22 5d 5b 67 5d 0a 20 20 20 20 20 20 20 20 20  s"][g].         
06b0: 20 20 20 73 63 6f 72 65 5f 63 6f 6d 70 6c 65 74     score_complet
06c0: 65 20 3d 20 46 61 6c 73 65 0a 20 20 20 20 20 20  e = False.      
06d0: 20 20 20 20 20 20 77 68 69 6c 65 20 73 63 6f 72        while scor
06e0: 65 5f 63 6f 6d 70 6c 65 74 65 20 69 73 20 46 61  e_complete is Fa
06f0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
0700: 20 20 20 20 20 69 66 20 73 63 6f 72 65 5f 6c 65       if score_le
0710: 6e 28 69 6e 73 5f 73 63 6f 72 65 29 20 3e 3d 20  n(ins_score) >= 
0720: 35 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  50:.            
0730: 20 20 20 20 20 20 20 20 73 63 6f 72 65 5f 63 6f          score_co
0740: 6d 70 6c 65 74 65 20 3d 20 54 72 75 65 0a 20 20  mplete = True.  
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0760: 20 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20    break.        
0770: 20 20 20 20 20 20 20 20 66 6f 72 20 69 20 69 6e          for i in
0780: 20 72 61 6e 67 65 28 6c 65 6e 28 69 6e 73 5f 73   range(len(ins_s
0790: 63 6f 72 65 29 29 3a 0a 20 20 20 20 20 20 20 20  core)):.        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69              if i
07b0: 73 69 6e 73 74 61 6e 63 65 28 69 6e 73 5f 73 63  sinstance(ins_sc
07c0: 6f 72 65 5b 69 5d 2c 20 74 72 65 65 2e 54 72 65  ore[i], tree.Tre
07d0: 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e):.            
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 72 6f              unro
07f0: 6c 6c 65 64 5f 73 63 6f 72 65 20 3d 20 73 65 6c  lled_score = sel
0800: 65 63 74 5f 6e 6f 64 65 28 69 6e 73 74 72 5b 22  ect_node(instr["
0810: 67 72 61 6d 6d 61 72 73 22 5d 5b 69 6e 73 5f 73  grammars"][ins_s
0820: 63 6f 72 65 5b 69 5d 2e 6e 61 6d 65 5d 29 0a 20  core[i].name]). 
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 20 20 20 20 6e 65 77 5f 73 63 6f 72 65         new_score
0850: 20 3d 20 69 6e 73 5f 73 63 6f 72 65 5b 3a 69 2d   = ins_score[:i-
0860: 31 5d 20 2b 20 75 6e 72 6f 6c 6c 65 64 5f 73 63  1] + unrolled_sc
0870: 6f 72 65 20 2b 20 69 6e 73 5f 73 63 6f 72 65 5b  ore + ins_score[
0880: 69 2b 69 3a 5d 0a 20 20 20 20 20 20 20 20 20 20  i+i:].          
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
08a0: 73 5f 73 63 6f 72 65 20 3d 20 6e 65 77 5f 73 63  s_score = new_sc
08b0: 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ore.            
08c0: 20 20 20 20 20 20 20 20 69 66 20 69 20 3d 3d 20          if i == 
08d0: 6c 65 6e 28 69 6e 73 5f 73 63 6f 72 65 29 3a 0a  len(ins_score):.
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 20 73 63 6f 72 65 5f 63 6f          score_co
0900: 6d 70 6c 65 74 65 20 3d 20 54 72 75 65 0a 20 20  mplete = True.  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20        break.    
0930: 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20          ..      
0940: 20 20 20 20 20 20 69 6e 73 5f 73 63 6f 72 65 20        ins_score 
0950: 3d 20 5b 6e 20 66 6f 72 20 6e 20 69 6e 20 69 6e  = [n for n in in
0960: 73 5f 73 63 6f 72 65 20 69 66 20 6e 6f 74 20 69  s_score if not i
0970: 73 69 6e 73 74 61 6e 63 65 28 6e 2c 20 74 72 65  sinstance(n, tre
0980: 65 2e 54 72 65 65 29 5d 0a 20 20 20 20 20 20 20  e.Tree)].       
0990: 20 20 20 20 20 63 6f 6d 70 6f 73 69 74 69 6f 6e       composition
09a0: 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74  [comp_name][inst
09b0: 72 5f 6e 61 6d 65 5d 5b 22 73 63 6f 72 65 22 5d  r_name]["score"]
09c0: 20 3d 20 69 6e 73 5f 73 63 6f 72 65 0a 0a 20 20   = ins_score..  
09d0: 20 20 20 20 20 20 20 20 20 20 23 20 47 65 6e 65            # Gene
09e0: 72 61 74 65 20 74 69 6d 65 73 74 61 6d 70 73 20  rate timestamps 
09f0: 66 6f 72 20 74 68 65 20 6e 6f 74 65 73 20 0a 23  for the notes .#
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
0a10: 63 6f 6d 70 5f 73 74 61 72 74 5f 74 69 6d 65 0a  comp_start_time.
0a20: 23 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  #            for
0a30: 20 6e 6f 74 65 20 69 6e 20 72 61 6e 67 65 28 6c   note in range(l
0a40: 65 6e 28 69 6e 73 5f 73 63 6f 72 65 29 29 3a 0a  en(ins_score)):.
0a50: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
0a60: 20 69 6e 73 5f 73 63 6f 72 65 5b 6e 6f 74 65 5d   ins_score[note]
0a70: 2e 74 69 6d 65 20 3d 20 74 0a 23 20 20 20 20 20  .time = t.#     
0a80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 5f 73             ins_s
0a90: 63 6f 72 65 5b 6e 6f 74 65 5d 2e 64 75 72 61 74  core[note].durat
0aa0: 69 6f 6e 20 2a 3d 20 74 65 6d 70 6f 0a 23 20 20  ion *= tempo.#  
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
0ac0: 2b 3d 20 73 63 6f 72 65 5b 6e 6f 74 65 5d 2e 64  += score[note].d
0ad0: 75 72 61 74 69 6f 6e 0a 23 23 20 20 20 20 20 20  uration.##      
0ae0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20            print 
0af0: 22 74 69 6d 65 20 64 69 66 66 65 72 65 6e 63 65  "time difference
0b00: 20 3d 22 2c 20 74 2d 63 6f 6d 70 5f 73 74 61 72   =", t-comp_star
0b10: 74 5f 74 69 6d 65 0a 23 23 20 20 20 20 20 20 20  t_time.##       
0b20: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 22           print "
0b30: 69 6e 73 74 72 75 6d 65 6e 74 20 64 75 72 61 74  instrument durat
0b40: 69 6f 6e 20 3d 22 2c 63 6f 6d 70 6f 73 69 74 69  ion =",compositi
0b50: 6f 6e 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e  on[comp_name][in
0b60: 73 74 72 5f 6e 61 6d 65 5d 5b 22 64 75 72 61 74  str_name]["durat
0b70: 69 6f 6e 22 5d 0a 23 20 20 20 20 20 20 20 20 20  ion"].#         
0b80: 20 20 20 20 20 20 20 69 66 20 28 74 2d 63 6f 6d         if (t-com
0b90: 70 5f 73 74 61 72 74 5f 74 69 6d 65 29 20 3e 20  p_start_time) > 
0ba0: 66 6c 6f 61 74 28 63 6f 6d 70 6f 73 69 74 69 6f  float(compositio
0bb0: 6e 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73  n[comp_name][ins
0bc0: 74 72 5f 6e 61 6d 65 5d 5b 22 64 75 72 61 74 69  tr_name]["durati
0bd0: 6f 6e 22 5d 29 3a 0a 23 23 20 20 20 20 20 20 20  on"]):.##       
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
0bf0: 6e 74 20 22 68 65 72 65 22 0a 23 20 20 20 20 20  nt "here".#     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0c10: 6e 73 5f 73 63 6f 72 65 20 3d 20 69 6e 73 5f 73  ns_score = ins_s
0c20: 63 6f 72 65 5b 3a 6e 6f 74 65 5d 0a 23 20 20 20  core[:note].#   
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 62 72 65 61 6b 0a 23 20 20 20 20 20 20 20 20   break.#        
0c50: 20 20 20 20 20 20 20 20 6d 61 78 5f 74 20 3d 20          max_t = 
0c60: 74 20 69 66 20 74 20 3e 20 6d 61 78 5f 74 20 65  t if t > max_t e
0c70: 6c 73 65 20 6d 61 78 5f 74 0a 23 20 20 20 20 20  lse max_t.#     
0c80: 20 20 20 20 20 20 20 63 6f 6d 70 6f 73 69 74 69         compositi
0c90: 6f 6e 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e  on[comp_name][in
0ca0: 73 74 72 5f 6e 61 6d 65 5d 5b 22 73 63 6f 72 65  str_name]["score
0cb0: 22 5d 20 3d 20 69 6e 73 5f 73 63 6f 72 65 0a 0a  "] = ins_score..
0cc0: 20 20 20 20 23 20 4d 75 73 74 20 62 65 20 64 6f      # Must be do
0cd0: 6e 65 20 61 66 74 65 72 20 61 6c 6c 20 6e 6f 74  ne after all not
0ce0: 65 20 74 69 6d 65 73 20 6b 65 79 65 64 20 69 6e  e times keyed in
0cf0: 2c 20 65 6c 73 65 20 79 6f 75 20 63 61 6e 27 74  , else you can't
0d00: 20 63 6f 6f 72 64 69 6e 61 74 65 20 6d 65 6c 6f   coordinate melo
0d10: 64 69 65 73 20 77 69 74 68 20 74 68 65 20 72 68  dies with the rh
0d20: 79 74 68 6d 20 63 68 6f 72 64 73 0a 23 20 20 20  ythm chords.#   
0d30: 20 66 6f 72 20 63 6f 6d 70 5f 6e 61 6d 65 20 69   for comp_name i
0d40: 6e 20 70 72 6f 67 72 65 73 73 69 6f 6e 2e 73 70  n progression.sp
0d50: 6c 69 74 28 29 3a 0a 23 20 20 20 20 20 20 20 20  lit():.#        
0d60: 70 72 69 6e 74 20 22 3b 20 4d 6f 76 65 6d 65 6e  print "; Movemen
0d70: 74 3a 22 2c 20 63 6f 6d 70 5f 6e 61 6d 65 0a 23  t:", comp_name.#
0d80: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
0d90: 72 5f 6e 61 6d 65 2c 20 69 6e 73 74 72 20 69 6e  r_name, instr in
0da0: 20 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63 6f 6d   composition[com
0db0: 70 5f 6e 61 6d 65 5d 2e 69 74 65 72 69 74 65 6d  p_name].iteritem
0dc0: 73 28 29 3a 0a 23 23 20 20 20 20 20 20 20 20 20  s():.##         
0dd0: 20 20 20 70 72 69 6e 74 20 22 5c 6e 4d 6f 76 65     print "\nMove
0de0: 6d 65 6e 74 20 25 73 20 69 6e 73 74 72 75 6d 65  ment %s instrume
0df0: 6e 74 20 25 73 22 20 25 20 28 63 6f 6d 70 5f 6e  nt %s" % (comp_n
0e00: 61 6d 65 2c 20 69 6e 73 74 72 5f 6e 61 6d 65 29  ame, instr_name)
0e10: 0a 23 23 20 20 20 20 20 20 20 20 20 20 20 20 70  .##            p
0e20: 72 69 6e 74 20 63 6f 6d 70 6f 73 69 74 69 6f 6e  rint composition
0e30: 5b 63 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74  [comp_name][inst
0e40: 72 5f 6e 61 6d 65 5d 5b 22 73 63 6f 72 65 22 5d  r_name]["score"]
0e50: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 66   .#            f
0e60: 69 6e 61 6c 5f 73 63 6f 72 65 20 3d 20 67 65 6e  inal_score = gen
0e70: 65 72 61 74 65 5f 63 73 6f 75 6e 64 5f 73 63 6f  erate_csound_sco
0e80: 72 65 28 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63  re(composition[c
0e90: 6f 6d 70 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72 5f  omp_name][instr_
0ea0: 6e 61 6d 65 5d 5b 22 73 63 6f 72 65 22 5d 2c 20  name]["score"], 
0eb0: 63 6f 6d 70 6f 73 69 74 69 6f 6e 5b 63 6f 6d 70  composition[comp
0ec0: 5f 6e 61 6d 65 5d 5b 69 6e 73 74 72 5f 6e 61 6d  _name][instr_nam
0ed0: 65 5d 5b 22 73 63 6f 72 65 5f 6c 69 6e 65 22 5d  e]["score_line"]
0ee0: 29 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 66  ).#            f
0ef0: 6f 72 20 6c 69 6e 65 20 69 6e 20 66 69 6e 61 6c  or line in final
0f00: 5f 73 63 6f 72 65 3a 0a 23 20 20 20 20 20 20 20  _score:.#       
0f10: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 20 6c           print l
0f20: 69 6e 65 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ine..           
0f30: 20 69 66 20 73 63 6f 72 65 5f 6c 65 6e 28 69 6e   if score_len(in
0f40: 73 5f 73 63 6f 72 65 29 20 3e 20 6d 61 78 5f 69  s_score) > max_i
0f50: 6e 73 74 72 3a 0a 20 20 20 20 20 20 20 20 20 20  nstr:.          
0f60: 20 20 20 20 20 20 6d 61 78 5f 69 6e 73 74 72 20        max_instr 
0f70: 3d 20 69 6e 73 5f 73 63 6f 72 65 0a 20 20 20 20  = ins_score.    
0f80: 20 20 20 20 20 20 20 20 66 6f 72 20 6c 69 6e 65          for line
0f90: 20 69 6e 20 67 65 6e 65 72 61 74 65 5f 63 73 6f   in generate_cso
0fa0: 75 6e 64 5f 73 63 6f 72 65 28 63 6f 6d 70 6f 73  und_score(compos
0fb0: 69 74 69 6f 6e 5b 63 6f 6d 70 5f 6e 61 6d 65 5d  ition[comp_name]
0fc0: 5b 69 6e 73 74 72 5f 6e 61 6d 65 5d 5b 22 73 63  [instr_name]["sc
0fd0: 6f 72 65 22 5d 2c 20 69 6e 73 74 72 5b 22 73 63  ore"], instr["sc
0fe0: 6f 72 65 5f 6c 69 6e 65 22 5d 2c 20 6d 6f 76 65  ore_line"], move
0ff0: 6d 65 6e 74 5f 73 74 61 72 74 29 3a 0a 20 20 20  ment_start):.   
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
1010: 6e 74 20 6c 69 6e 65 0a 0a 0a 64 65 66 20 73 63  nt line...def sc
1020: 6f 72 65 5f 6c 65 6e 28 73 63 6f 72 65 29 3a 0a  ore_len(score):.
1030: 20 20 20 20 74 6f 74 61 6c 20 3d 20 30 0a 20 20      total = 0.  
1040: 20 20 66 6f 72 20 6e 20 69 6e 20 73 63 6f 72 65    for n in score
1050: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74  :.        if not
1060: 20 69 73 69 6e 73 74 61 6e 63 65 28 6e 2c 20 74   isinstance(n, t
1070: 72 65 65 2e 54 72 65 65 29 3a 0a 20 20 20 20 20  ree.Tree):.     
1080: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
1090: 6e 2e 64 75 72 61 74 69 6f 6e 0a 20 20 20 20 72  n.duration.    r
10a0: 65 74 75 72 6e 20 74 6f 74 61 6c 0a 0a 64 65 66  eturn total..def
10b0: 20 73 65 6c 65 63 74 5f 6e 6f 64 65 28 67 72 61   select_node(gra
10c0: 6d 6d 61 72 29 3a 0a 20 20 20 20 72 65 74 75 72  mmar):.    retur
10d0: 6e 20 72 61 6e 64 6f 6d 2e 63 68 6f 69 63 65 28  n random.choice(
10e0: 67 72 61 6d 6d 61 72 29 0a 20 20 20 20 20 20 20  grammar).       
10f0: 20 20 20 20 20 0a 0a 64 65 66 20 67 65 6e 65 72       ..def gener
1100: 61 74 65 5f 73 63 6f 72 65 28 73 63 6f 72 65 2c  ate_score(score,
1110: 20 67 72 61 6d 6d 61 72 73 29 3a 0a 20 20 20 20   grammars):.    
1120: 70 64 62 2e 73 65 74 5f 74 72 61 63 65 28 29 0a  pdb.set_trace().
1130: 20 20 20 20 77 68 69 6c 65 20 31 3a 0a 20 20 20      while 1:.   
1140: 20 20 20 20 20 66 6f 75 6e 64 5f 73 75 62 73 74       found_subst
1150: 69 74 75 74 69 6f 6e 20 3d 20 46 61 6c 73 65 0a  itution = False.
1160: 20 20 20 20 20 20 20 20 66 6f 72 20 6b 65 79 2c          for key,
1170: 76 61 6c 75 65 20 69 6e 20 67 72 61 6d 6d 61 72  value in grammar
1180: 73 2e 69 74 65 72 69 74 65 6d 73 28 29 3a 0a 20  s.iteritems():. 
1190: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 63             if sc
11a0: 6f 72 65 2e 66 69 6e 64 28 6b 65 79 29 20 21 3d  ore.find(key) !=
11b0: 20 2d 31 3a 0a 20 20 20 20 20 20 20 20 20 20 20   -1:.           
11c0: 20 20 20 20 20 66 6f 75 6e 64 5f 73 75 62 73 74       found_subst
11d0: 69 74 75 74 69 6f 6e 20 3d 20 54 72 75 65 0a 20  itution = True. 
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
11f0: 68 69 6c 65 20 73 63 6f 72 65 2e 66 69 6e 64 28  hile score.find(
1200: 6b 65 79 29 20 21 3d 20 2d 31 3a 0a 20 20 20 20  key) != -1:.    
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 73 63 6f 72 65 20 3d 20 73 63 6f 72 65 2e 72 65  score = score.re
1230: 70 6c 61 63 65 28 6b 65 79 2c 20 72 61 6e 64 6f  place(key, rando
1240: 6d 2e 63 68 6f 69 63 65 28 67 72 61 6d 6d 61 72  m.choice(grammar
1250: 73 5b 6b 65 79 5d 29 2c 20 31 29 0a 23 20 20 20  s[key]), 1).#   
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 70 72 69 6e 74 20 73 63 6f 65 0a 20 20 20 20   print scoe.    
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 69 66 20 6c 65 6e 28 73 63 6f 72 65 2e 73 70 6c  if len(score.spl
12a0: 69 74 28 29 29 20 3e 20 32 30 30 30 3a 0a 20 20  it()) > 2000:.  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 66 6f 72 20 6b 20 69 6e 20 67        for k in g
12d0: 72 61 6d 6d 61 72 73 2e 6b 65 79 73 28 29 3a 0a  rammars.keys():.
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 63 6f 72              scor
1300: 65 20 3d 20 73 63 6f 72 65 2e 72 65 70 6c 61 63  e = score.replac
1310: 65 28 6b 2c 20 22 22 29 0a 20 20 20 20 20 20 20  e(k, "").       
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 72 65 74 75 72 6e 20 73 63 6f 72 65 0a 20 20   return score.  
1340: 20 20 20 20 20 20 69 66 20 66 6f 75 6e 64 5f 73        if found_s
1350: 75 62 73 74 69 74 75 74 69 6f 6e 20 69 73 20 46  ubstitution is F
1360: 61 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  alse:.          
1370: 20 20 62 72 65 61 6b 0a 20 20 20 20 72 65 74 75    break.    retu
1380: 72 6e 20 73 63 6f 72 65 0a 0a 0a 64 65 66 20 67  rn score...def g
1390: 65 6e 65 72 61 74 65 5f 63 73 6f 75 6e 64 5f 73  enerate_csound_s
13a0: 63 6f 72 65 28 73 63 6f 72 65 2c 20 73 63 6f 72  core(score, scor
13b0: 65 5f 6c 69 6e 65 2c 20 74 29 3a 0a 20 20 20 20  e_line, t):.    
13c0: 63 73 6f 75 6e 64 5f 6e 6f 74 65 5f 76 61 6c 75  csound_note_valu
13d0: 65 73 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22  es = {.        "
13e0: 43 22 3a 20 22 30 30 22 2c 0a 20 20 20 20 20 20  C": "00",.      
13f0: 20 20 22 43 23 22 3a 20 22 30 31 22 2c 0a 20 20    "C#": "01",.  
1400: 20 20 20 20 20 20 22 44 22 3a 20 22 30 32 22 2c        "D": "02",
1410: 0a 20 20 20 20 20 20 20 20 22 44 23 22 3a 20 22  .        "D#": "
1420: 30 33 22 2c 0a 20 20 20 20 20 20 20 20 22 45 22  03",.        "E"
1430: 3a 20 22 30 34 22 2c 0a 20 20 20 20 20 20 20 20  : "04",.        
1440: 22 46 22 3a 20 22 30 35 22 2c 0a 20 20 20 20 20  "F": "05",.     
1450: 20 20 20 22 46 23 22 3a 20 22 30 36 22 2c 0a 20     "F#": "06",. 
1460: 20 20 20 20 20 20 20 22 47 22 3a 20 22 30 37 22         "G": "07"
1470: 2c 0a 20 20 20 20 20 20 20 20 22 47 23 22 3a 20  ,.        "G#": 
1480: 22 30 38 22 2c 0a 20 20 20 20 20 20 20 20 22 41  "08",.        "A
1490: 22 3a 20 22 30 39 22 2c 0a 20 20 20 20 20 20 20  ": "09",.       
14a0: 20 22 41 23 22 3a 20 22 31 30 22 2c 0a 20 20 20   "A#": "10",.   
14b0: 20 20 20 20 20 22 42 22 3a 20 22 31 31 22 2c 0a       "B": "11",.
14c0: 20 20 20 20 7d 0a 20 20 20 20 63 73 6f 75 6e 64      }.    csound
14d0: 5f 73 63 6f 72 65 20 3d 20 5b 5d 0a 20 20 20 20  _score = [].    
14e0: 70 64 62 2e 73 65 74 5f 74 72 61 63 65 28 29 0a  pdb.set_trace().
14f0: 20 20 20 20 66 6f 72 20 74 6f 6b 65 6e 20 69 6e      for token in
1500: 20 73 63 6f 72 65 3a 0a 20 20 20 20 20 20 20 20   score:.        
1510: 69 66 20 69 73 69 6e 73 74 61 6e 63 65 28 74 6f  if isinstance(to
1520: 6b 65 6e 2c 20 70 61 72 73 65 2e 43 68 6f 72 64  ken, parse.Chord
1530: 29 3a 20 20 23 20 43 68 6f 72 64 73 0a 20 20 20  ):  # Chords.   
1540: 20 20 20 20 20 20 20 20 20 66 6f 72 20 6e 6f 74           for not
1550: 65 20 69 6e 20 74 6f 6b 65 6e 2e 63 68 6f 72 64  e in token.chord
1560: 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  : .             
1570: 20 20 20 6e 6f 74 65 20 3d 20 63 73 6f 75 6e 64     note = csound
1580: 5f 6e 6f 74 65 5f 76 61 6c 75 65 73 5b 6e 6f 74  _note_values[not
1590: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
15a0: 20 20 20 63 73 6f 75 6e 64 5f 73 63 6f 72 65 2e     csound_score.
15b0: 61 70 70 65 6e 64 28 73 63 6f 72 65 5f 6c 69 6e  append(score_lin
15c0: 65 20 25 20 7b 22 74 69 6d 65 22 3a 20 74 2c 20  e % {"time": t, 
15d0: 22 6f 63 74 61 76 65 22 3a 20 74 6f 6b 65 6e 2e  "octave": token.
15e0: 6f 63 74 61 76 65 2c 20 22 6e 6f 74 65 22 3a 20  octave, "note": 
15f0: 6e 6f 74 65 2c 20 22 64 75 72 61 74 69 6f 6e 22  note, "duration"
1600: 3a 20 74 6f 6b 65 6e 2e 64 75 72 61 74 69 6f 6e  : token.duration
1610: 7d 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  }).        elif 
1620: 69 73 69 6e 73 74 61 6e 63 65 28 74 6f 6b 65 6e  isinstance(token
1630: 2c 20 70 61 72 73 65 2e 4e 6f 74 65 29 3a 20 20  , parse.Note):  
1640: 23 20 49 6e 64 69 76 69 64 75 61 6c 20 6e 6f 74  # Individual not
1650: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  es.            n
1660: 6f 74 65 20 3d 20 63 73 6f 75 6e 64 5f 6e 6f 74  ote = csound_not
1670: 65 5f 76 61 6c 75 65 73 5b 74 6f 6b 65 6e 2e 76  e_values[token.v
1680: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20  alue].          
1690: 20 20 63 73 6f 75 6e 64 5f 73 63 6f 72 65 2e 61    csound_score.a
16a0: 70 70 65 6e 64 28 73 63 6f 72 65 5f 6c 69 6e 65  ppend(score_line
16b0: 20 25 20 7b 22 74 69 6d 65 22 3a 20 74 2c 20 22   % {"time": t, "
16c0: 6f 63 74 61 76 65 22 3a 20 74 6f 6b 65 6e 2e 6f  octave": token.o
16d0: 63 74 61 76 65 2c 20 22 6e 6f 74 65 22 3a 20 6e  ctave, "note": n
16e0: 6f 74 65 2c 20 22 64 75 72 61 74 69 6f 6e 22 3a  ote, "duration":
16f0: 20 74 6f 6b 65 6e 2e 64 75 72 61 74 69 6f 6e 7d   token.duration}
1700: 29 0a 20 20 20 20 20 20 20 20 74 20 2b 3d 20 74  ).        t += t
1710: 6f 6b 65 6e 2e 64 75 72 61 74 69 6f 6e 0a 20 20  oken.duration.  
1720: 20 20 72 65 74 75 72 6e 20 63 73 6f 75 6e 64 5f    return csound_
1730: 73 63 6f 72 65 0a 0a 0a 69 66 20 5f 5f 6e 61 6d  score...if __nam
1740: 65 5f 5f 20 3d 3d 20 22 5f 5f 6d 61 69 6e 5f 5f  e__ == "__main__
1750: 22 3a 20 6d 61 69 6e 28 29 20 0a                 ": main() .