Index: cfg.py ================================================================== --- cfg.py +++ cfg.py @@ -9,67 +9,82 @@ grammars = { "u": ["I V I IV u", "e"], "e": [""], } -# Generate the scale for the key we're in -comp_key = "C" -notes = ["A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"] -scale = [comp_key] -pos = notes.index(comp_key) -progression = [2,2,1,2,2,2,1] -for p in progression: - pos = (pos + p) % 12 - scale.append(notes[pos]) - -scale_conversion = { - "I": 1, - "II": 2, - "III": 3, - "IV": 4, - "V": 5, - "VI": 6, - "VII": 7, - "VIII": 8, -} - -csound_note_values = { - "C": "00", - "C#": "01", - "D": "02", - "D#": "03", - "E": "04", - "F": "05", - "F#": "06", - "G": "07", - "F#": "08", - "A": "09", - "A#": "10", - "B": "11", -} - - -score = "u u u" -print score -while 1: - found_substitution = False - for key,value in grammars.iteritems(): - if score.find(key) != -1: - found_substitution = True - while score.find(key) != -1: - score = score.replace(key, random.choice(grammars[key]), 1) - print score - # time.sleep(.25) - if found_substitution is False: - break - -csound_score = [] -for token in score.split(): - csound_score.append(scale[scale_conversion[token]-1]) - -print csound_score - -t = 0 -for token in csound_score: - note = csound_note_values[token] - print "i2 %f 2 7000 %d.%s %d.%s 0 6" % (t, random.choice([8,9]), note, random.choice([8,9]), note) - t += .25 + +def main(): + score = "u u u" + key = "C" + score = generate_score(score) + score = keyify_score(score, key) + score = generate_csound_score(score) + for line in score: + print line + + +def make_scale(key): + notes = ["A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"] + scale = [key] + pos = notes.index(key) + progression = [2,2,1,2,2,2,1] + for p in progression: + pos = (pos + p) % 12 + scale.append(notes[pos]) + return scale + + +def generate_score(score): + while 1: + found_substitution = False + for key,value in grammars.iteritems(): + if score.find(key) != -1: + found_substitution = True + while score.find(key) != -1: + score = score.replace(key, random.choice(grammars[key]), 1) + if found_substitution is False: + break + return score + +def keyify_score(score, key): + scale = make_scale(key) + scale_conversion = { + "I": 1, + "II": 2, + "III": 3, + "IV": 4, + "V": 5, + "VI": 6, + "VII": 7, + "VIII": 8, + } + keyed_score = [] + for token in score.split(): + keyed_score.append(scale[scale_conversion[token]-1]) + return keyed_score + + +def generate_csound_score(score): + csound_note_values = { + "C": "00", + "C#": "01", + "D": "02", + "D#": "03", + "E": "04", + "F": "05", + "F#": "06", + "G": "07", + "F#": "08", + "A": "09", + "A#": "10", + "B": "11", + } + t = 0 + csound_score = [] + for token in score: + note = csound_note_values[token] + csound_score.append("i2 %f 2 7000 %d.%s %d.%s 0 6" % (t, random.choice([8,9]), note, random.choice([8,9]), note)) + t += .25 + return csound_score + + +if __name__ == "__main__": main() Index: test.sco ================================================================== --- test.sco +++ test.sco @@ -1,10 +1,38 @@ f1 0 256 10 1 0 3 ; sine wave function table -i2 0.000000 2 7000 9.00 8.00 0 6 -i2 0.250000 2 7000 9.07 9.07 0 6 -i2 0.500000 2 7000 8.00 9.00 0 6 -i2 0.750000 2 7000 9.05 8.05 0 6 -i2 1.000000 2 7000 9.00 8.00 0 6 +i2 0.000000 2 7000 8.00 9.00 0 6 +i2 0.250000 2 7000 8.07 8.07 0 6 +i2 0.500000 2 7000 9.00 8.00 0 6 +i2 0.750000 2 7000 8.05 9.05 0 6 +i2 1.000000 2 7000 8.00 9.00 0 6 i2 1.250000 2 7000 9.07 9.07 0 6 i2 1.500000 2 7000 9.00 9.00 0 6 -i2 1.750000 2 7000 9.05 8.05 0 6 +i2 1.750000 2 7000 8.05 9.05 0 6 +i2 2.000000 2 7000 9.00 8.00 0 6 +i2 2.250000 2 7000 8.07 9.07 0 6 +i2 2.500000 2 7000 8.00 8.00 0 6 +i2 2.750000 2 7000 9.05 9.05 0 6 +i2 3.000000 2 7000 8.00 8.00 0 6 +i2 3.250000 2 7000 8.07 9.07 0 6 +i2 3.500000 2 7000 9.00 9.00 0 6 +i2 3.750000 2 7000 8.05 9.05 0 6 +i2 4.000000 2 7000 8.00 9.00 0 6 +i2 4.250000 2 7000 9.07 9.07 0 6 +i2 4.500000 2 7000 9.00 9.00 0 6 +i2 4.750000 2 7000 8.05 8.05 0 6 +i2 5.000000 2 7000 9.00 8.00 0 6 +i2 5.250000 2 7000 8.07 8.07 0 6 +i2 5.500000 2 7000 8.00 9.00 0 6 +i2 5.750000 2 7000 9.05 9.05 0 6 +i2 6.000000 2 7000 9.00 9.00 0 6 +i2 6.250000 2 7000 9.07 9.07 0 6 +i2 6.500000 2 7000 9.00 8.00 0 6 +i2 6.750000 2 7000 8.05 8.05 0 6 +i2 7.000000 2 7000 9.00 9.00 0 6 +i2 7.250000 2 7000 8.07 9.07 0 6 +i2 7.500000 2 7000 8.00 8.00 0 6 +i2 7.750000 2 7000 9.05 8.05 0 6 +i2 8.000000 2 7000 9.00 8.00 0 6 +i2 8.250000 2 7000 8.07 8.07 0 6 +i2 8.500000 2 7000 9.00 9.00 0 6 +i2 8.750000 2 7000 8.05 9.05 0 6