spiffyscore

Hex Artifact Content
Login

Artifact 14f13b1d15cd9a4c19654020f525d835f1177984:


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 0a  d(time.time())..
0060: 67 72 61 6d 6d 61 72 73 20 3d 20 7b 0a 20 20 20  grammars = {.   
0070: 20 22 75 22 3a 20 5b 22 49 20 56 20 49 20 49 56   "u": ["I V I IV
0080: 20 75 22 2c 20 22 49 20 49 56 22 2c 20 22 49 20   u", "I IV", "I 
0090: 56 49 49 20 49 56 22 20 20 2c 20 22 65 22 5d 2c  VII IV"  , "e"],
00a0: 0a 20 20 20 20 22 65 22 3a 20 5b 22 22 5d 2c 0a  .    "e": [""],.
00b0: 7d 0a 0a 0a 64 65 66 20 6d 61 69 6e 28 29 3a 0a  }...def main():.
00c0: 20 20 20 20 73 63 6f 72 65 20 3d 20 22 75 20 75      score = "u u
00d0: 20 75 22 0a 20 20 20 20 6b 65 79 20 3d 20 22 47   u".    key = "G
00e0: 23 22 0a 20 20 20 20 73 63 6f 72 65 20 3d 20 67  #".    score = g
00f0: 65 6e 65 72 61 74 65 5f 73 63 6f 72 65 28 73 63  enerate_score(sc
0100: 6f 72 65 29 0a 20 20 20 20 73 63 6f 72 65 20 3d  ore).    score =
0110: 20 6b 65 79 69 66 79 5f 73 63 6f 72 65 28 73 63   keyify_score(sc
0120: 6f 72 65 2c 20 6b 65 79 29 0a 20 20 20 20 73 63  ore, key).    sc
0130: 6f 72 65 20 3d 20 67 65 6e 65 72 61 74 65 5f 63  ore = generate_c
0140: 73 6f 75 6e 64 5f 73 63 6f 72 65 28 73 63 6f 72  sound_score(scor
0150: 65 29 0a 20 20 20 20 70 72 69 6e 74 20 22 66 31  e).    print "f1
0160: 20 20 30 20 20 20 32 35 36 20 31 30 20 20 31 20    0   256 10  1 
0170: 30 20 33 20 20 20 3b 20 73 69 6e 65 20 77 61 76  0 3   ; sine wav
0180: 65 20 66 75 6e 63 74 69 6f 6e 20 74 61 62 6c 65  e function table
0190: 22 0a 20 20 20 20 66 6f 72 20 6c 69 6e 65 20 69  ".    for line i
01a0: 6e 20 73 63 6f 72 65 3a 0a 20 20 20 20 20 20 20  n score:.       
01b0: 20 70 72 69 6e 74 20 6c 69 6e 65 0a 0a 0a 64 65   print line...de
01c0: 66 20 6d 61 6b 65 5f 73 63 61 6c 65 28 6b 65 79  f make_scale(key
01d0: 29 3a 0a 20 20 20 20 6e 6f 74 65 73 20 3d 20 5b  ):.    notes = [
01e0: 22 41 22 2c 20 22 41 23 22 2c 20 22 42 22 2c 20  "A", "A#", "B", 
01f0: 22 43 22 2c 20 22 43 23 22 2c 20 22 44 22 2c 20  "C", "C#", "D", 
0200: 22 44 23 22 2c 20 22 45 22 2c 20 22 46 22 2c 20  "D#", "E", "F", 
0210: 22 46 23 22 2c 20 22 47 22 2c 20 22 47 23 22 5d  "F#", "G", "G#"]
0220: 0a 20 20 20 20 73 63 61 6c 65 20 3d 20 5b 6b 65  .    scale = [ke
0230: 79 5d 0a 20 20 20 20 70 6f 73 20 3d 20 6e 6f 74  y].    pos = not
0240: 65 73 2e 69 6e 64 65 78 28 6b 65 79 29 0a 20 20  es.index(key).  
0250: 20 20 70 72 6f 67 72 65 73 73 69 6f 6e 20 3d 20    progression = 
0260: 5b 32 2c 32 2c 31 2c 32 2c 32 2c 32 2c 31 5d 0a  [2,2,1,2,2,2,1].
0270: 20 20 20 20 66 6f 72 20 70 20 69 6e 20 70 72 6f      for p in pro
0280: 67 72 65 73 73 69 6f 6e 3a 0a 20 20 20 20 20 20  gression:.      
0290: 20 20 70 6f 73 20 3d 20 28 70 6f 73 20 2b 20 70    pos = (pos + p
02a0: 29 20 25 20 31 32 0a 20 20 20 20 20 20 20 20 73  ) % 12.        s
02b0: 63 61 6c 65 2e 61 70 70 65 6e 64 28 6e 6f 74 65  cale.append(note
02c0: 73 5b 70 6f 73 5d 29 0a 20 20 20 20 72 65 74 75  s[pos]).    retu
02d0: 72 6e 20 73 63 61 6c 65 0a 0a 0a 64 65 66 20 67  rn scale...def g
02e0: 65 6e 65 72 61 74 65 5f 73 63 6f 72 65 28 73 63  enerate_score(sc
02f0: 6f 72 65 29 3a 0a 20 20 20 20 77 68 69 6c 65 20  ore):.    while 
0300: 31 3a 0a 20 20 20 20 20 20 20 20 66 6f 75 6e 64  1:.        found
0310: 5f 73 75 62 73 74 69 74 75 74 69 6f 6e 20 3d 20  _substitution = 
0320: 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 66 6f  False.        fo
0330: 72 20 6b 65 79 2c 76 61 6c 75 65 20 69 6e 20 67  r key,value in g
0340: 72 61 6d 6d 61 72 73 2e 69 74 65 72 69 74 65 6d  rammars.iteritem
0350: 73 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s():.           
0360: 20 69 66 20 73 63 6f 72 65 2e 66 69 6e 64 28 6b   if score.find(k
0370: 65 79 29 20 21 3d 20 2d 31 3a 0a 20 20 20 20 20  ey) != -1:.     
0380: 20 20 20 20 20 20 20 20 20 20 20 66 6f 75 6e 64             found
0390: 5f 73 75 62 73 74 69 74 75 74 69 6f 6e 20 3d 20  _substitution = 
03a0: 54 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  True.           
03b0: 20 20 20 20 20 77 68 69 6c 65 20 73 63 6f 72 65       while score
03c0: 2e 66 69 6e 64 28 6b 65 79 29 20 21 3d 20 2d 31  .find(key) != -1
03d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
03e0: 20 20 20 20 20 20 73 63 6f 72 65 20 3d 20 73 63        score = sc
03f0: 6f 72 65 2e 72 65 70 6c 61 63 65 28 6b 65 79 2c  ore.replace(key,
0400: 20 72 61 6e 64 6f 6d 2e 63 68 6f 69 63 65 28 67   random.choice(g
0410: 72 61 6d 6d 61 72 73 5b 6b 65 79 5d 29 2c 20 31  rammars[key]), 1
0420: 29 0a 20 20 20 20 20 20 20 20 69 66 20 66 6f 75  ).        if fou
0430: 6e 64 5f 73 75 62 73 74 69 74 75 74 69 6f 6e 20  nd_substitution 
0440: 69 73 20 46 61 6c 73 65 3a 0a 20 20 20 20 20 20  is False:.      
0450: 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20        break.    
0460: 72 65 74 75 72 6e 20 73 63 6f 72 65 0a 0a 64 65  return score..de
0470: 66 20 6b 65 79 69 66 79 5f 73 63 6f 72 65 28 73  f keyify_score(s
0480: 63 6f 72 65 2c 20 6b 65 79 29 3a 0a 20 20 20 20  core, key):.    
0490: 73 63 61 6c 65 20 3d 20 6d 61 6b 65 5f 73 63 61  scale = make_sca
04a0: 6c 65 28 6b 65 79 29 0a 20 20 20 20 73 63 61 6c  le(key).    scal
04b0: 65 5f 63 6f 6e 76 65 72 73 69 6f 6e 20 3d 20 7b  e_conversion = {
04c0: 0a 20 20 20 20 20 20 20 20 22 49 22 3a 20 31 2c  .        "I": 1,
04d0: 0a 20 20 20 20 20 20 20 20 22 49 49 22 3a 20 32  .        "II": 2
04e0: 2c 0a 20 20 20 20 20 20 20 20 22 49 49 49 22 3a  ,.        "III":
04f0: 20 33 2c 0a 20 20 20 20 20 20 20 20 22 49 56 22   3,.        "IV"
0500: 3a 20 34 2c 0a 20 20 20 20 20 20 20 20 22 56 22  : 4,.        "V"
0510: 3a 20 35 2c 0a 20 20 20 20 20 20 20 20 22 56 49  : 5,.        "VI
0520: 22 3a 20 36 2c 0a 20 20 20 20 20 20 20 20 22 56  ": 6,.        "V
0530: 49 49 22 3a 20 37 2c 0a 20 20 20 20 20 20 20 20  II": 7,.        
0540: 22 56 49 49 49 22 3a 20 38 2c 0a 20 20 20 20 7d  "VIII": 8,.    }
0550: 0a 20 20 20 20 6b 65 79 65 64 5f 73 63 6f 72 65  .    keyed_score
0560: 20 3d 20 5b 5d 0a 20 20 20 20 66 6f 72 20 74 6f   = [].    for to
0570: 6b 65 6e 20 69 6e 20 73 63 6f 72 65 2e 73 70 6c  ken in score.spl
0580: 69 74 28 29 3a 0a 20 20 20 20 20 20 20 20 6b 65  it():.        ke
0590: 79 65 64 5f 73 63 6f 72 65 2e 61 70 70 65 6e 64  yed_score.append
05a0: 28 73 63 61 6c 65 5b 73 63 61 6c 65 5f 63 6f 6e  (scale[scale_con
05b0: 76 65 72 73 69 6f 6e 5b 74 6f 6b 65 6e 5d 2d 31  version[token]-1
05c0: 5d 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6b 65  ]).    return ke
05d0: 79 65 64 5f 73 63 6f 72 65 0a 0a 0a 64 65 66 20  yed_score...def 
05e0: 67 65 6e 65 72 61 74 65 5f 63 73 6f 75 6e 64 5f  generate_csound_
05f0: 73 63 6f 72 65 28 73 63 6f 72 65 29 3a 0a 20 20  score(score):.  
0600: 20 20 63 73 6f 75 6e 64 5f 6e 6f 74 65 5f 76 61    csound_note_va
0610: 6c 75 65 73 20 3d 20 7b 0a 20 20 20 20 20 20 20  lues = {.       
0620: 20 22 43 22 3a 20 22 30 30 22 2c 0a 20 20 20 20   "C": "00",.    
0630: 20 20 20 20 22 43 23 22 3a 20 22 30 31 22 2c 0a      "C#": "01",.
0640: 20 20 20 20 20 20 20 20 22 44 22 3a 20 22 30 32          "D": "02
0650: 22 2c 0a 20 20 20 20 20 20 20 20 22 44 23 22 3a  ",.        "D#":
0660: 20 22 30 33 22 2c 0a 20 20 20 20 20 20 20 20 22   "03",.        "
0670: 45 22 3a 20 22 30 34 22 2c 0a 20 20 20 20 20 20  E": "04",.      
0680: 20 20 22 46 22 3a 20 22 30 35 22 2c 0a 20 20 20    "F": "05",.   
0690: 20 20 20 20 20 22 46 23 22 3a 20 22 30 36 22 2c       "F#": "06",
06a0: 0a 20 20 20 20 20 20 20 20 22 47 22 3a 20 22 30  .        "G": "0
06b0: 37 22 2c 0a 20 20 20 20 20 20 20 20 22 47 23 22  7",.        "G#"
06c0: 3a 20 22 30 38 22 2c 0a 20 20 20 20 20 20 20 20  : "08",.        
06d0: 22 41 22 3a 20 22 30 39 22 2c 0a 20 20 20 20 20  "A": "09",.     
06e0: 20 20 20 22 41 23 22 3a 20 22 31 30 22 2c 0a 20     "A#": "10",. 
06f0: 20 20 20 20 20 20 20 22 42 22 3a 20 22 31 31 22         "B": "11"
0700: 2c 0a 20 20 20 20 7d 0a 20 20 20 20 74 20 3d 20  ,.    }.    t = 
0710: 30 20 0a 20 20 20 20 63 73 6f 75 6e 64 5f 73 63  0 .    csound_sc
0720: 6f 72 65 20 3d 20 5b 5d 0a 20 20 20 20 66 6f 72  ore = [].    for
0730: 20 74 6f 6b 65 6e 20 69 6e 20 73 63 6f 72 65 3a   token in score:
0740: 0a 20 20 20 20 20 20 20 20 6e 6f 74 65 20 3d 20  .        note = 
0750: 63 73 6f 75 6e 64 5f 6e 6f 74 65 5f 76 61 6c 75  csound_note_valu
0760: 65 73 5b 74 6f 6b 65 6e 5d 0a 20 20 20 20 20 20  es[token].      
0770: 20 20 63 73 6f 75 6e 64 5f 73 63 6f 72 65 2e 61    csound_score.a
0780: 70 70 65 6e 64 28 22 69 32 20 25 66 20 32 20 37  ppend("i2 %f 2 7
0790: 30 30 30 20 25 64 2e 25 73 20 25 64 2e 25 73 20  000 %d.%s %d.%s 
07a0: 30 20 36 22 20 25 20 28 74 2c 20 72 61 6e 64 6f  0 6" % (t, rando
07b0: 6d 2e 63 68 6f 69 63 65 28 5b 38 2c 39 5d 29 2c  m.choice([8,9]),
07c0: 20 6e 6f 74 65 2c 20 72 61 6e 64 6f 6d 2e 63 68   note, random.ch
07d0: 6f 69 63 65 28 5b 38 2c 39 5d 29 2c 20 6e 6f 74  oice([8,9]), not
07e0: 65 29 29 0a 20 20 20 20 20 20 20 20 74 20 2b 3d  e)).        t +=
07f0: 20 2e 32 35 0a 20 20 20 20 72 65 74 75 72 6e 20   .25.    return 
0800: 63 73 6f 75 6e 64 5f 73 63 6f 72 65 0a 0a 0a 69  csound_score...i
0810: 66 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d 20 22 5f  f __name__ == "_
0820: 5f 6d 61 69 6e 5f 5f 22 3a 20 6d 61 69 6e 28 29  _main__": main()
0830: 20 0a                                             .