Index: cfg.py ================================================================== --- cfg.py +++ cfg.py @@ -13,59 +13,84 @@ random.seed(time.time()) def main(): composition = { "verse1": { - "melody": { # Instrument 'melody' - "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", - "octave": 8, - "duration": 10, - "grammars": { # Notes for this instrument to use in this piece - "u": ["C G/2 G/2 G/2 C B, F' C F C B F (w)"], - "w": ["E/4 A/4 D/4 G/4 F/4 F/4 B2 (u)"], + "intro": { + "melody": { # Instrument 'melody' + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", + "octave": 8, + "duration": 10, + "grammars": { # Notes for this instrument to use in this piece + "u": ["G/2 G/2 G/4 G/4 A/4 A/4 A/2 G G A A A3 (w)"], + "w": ["E E F F G/2 G/2 G3 (u)"], + }, + }, + }, + "body": { + "melody": { # Instrument 'melody' + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", + "octave": 8, + "duration": 10, + "grammars": { # Notes for this instrument to use in this piece + "u": ["C G/2 G/2 G/2 C B, F' C F C B F (w)"], + "w": ["E/4 A/4 D/4 G/4 F/4 F/4 B2 (u)"], + }, }, }, }, "verse2": { - "melody": { # Instrument 'melody' - "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", - "octave": 8, - "duration": 10, - "grammars": { # Notes for this instrument to use in this piece - "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"], - }, - }, - "harmony": { # Instrument 'melody' - "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", - "octave": 8, - "duration": 10, - "grammars": { # Notes for this instrument to use in this piece - "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"], + "body": { + "melody": { # Instrument 'melody' + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", + "octave": 8, + "duration": 10, + "grammars": { # Notes for this instrument to use in this piece + "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"], + }, + }, + "harmony": { # Instrument 'melody' + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2", + "octave": 8, + "duration": 10, + "grammars": { # Notes for this instrument to use in this piece + "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"], + }, }, }, }, } print '''f1 0 512 10 1 f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08 f3 0 1025 10 1 -t 0 60 +t 0 100 ''' section_start = 0 for section in ["verse1", "verse2"]: + print "; Section " + section + subsection_start = section_start section = composition[section] -# for subsection in section - instrs = [] - for instr in section.values(): - sync = None - max_time = instr["duration"] - instr_score = render_instr(instr, sync, max_time) - instrs.append(instr_score) - for line in generate_csound_score(instr_score, instr["score_line"], section_start): - print line - longest_score = max(instrs, key=lambda i: score_len(i)) - section_start += score_len(longest_score) + for subsection in ["intro", "body", "outro"]: + try: + print "; Subsection " + subsection + subsection = section[subsection] + instrs = [] + for instr in subsection: + print ";Instrument " + instr + instr = subsection[instr] + sync = None + max_time = instr["duration"] + instr_score = render_instr(instr, sync, max_time) + instrs.append(instr_score) + for line in generate_csound_score(instr_score, instr["score_line"], subsection_start): + print line + longest_score = max(instrs, key=lambda i: score_len(i)) + subsection_start += score_len(longest_score) + section_start += score_len(longest_score) + except KeyError: + pass def render_instr(instr, sync, max_time): grammars = instr["grammars"] @@ -100,11 +125,11 @@ if score_len(grammars[node][g]) <= time_remaining: options.append(grammars[node][g]) if len(options) == 0: raise ValueError("No available grammars that will fit in the score") if sync: - + pass else: phrase = random.choice(options) score = score[:node_index-1] + phrase + score[node_index+1:] return score Index: test.sco ================================================================== --- test.sco +++ test.sco @@ -1,34 +1,45 @@ f1 0 512 10 1 f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08 f3 0 1025 10 1 -t 0 60 - -i2 0.000000 0.250000 7000 8.04 2 -i2 0.250000 0.250000 7000 8.09 2 -i2 0.500000 0.250000 7000 8.02 2 -i2 0.750000 0.250000 7000 8.07 2 -i2 1.000000 0.250000 7000 8.05 2 -i2 1.250000 0.250000 7000 8.05 2 -i2 1.500000 2.000000 7000 8.11 2 -i2 3.500000 1.000000 7000 8.02 2 -i2 4.500000 1.000000 7000 8.02 2 -i2 5.500000 0.500000 7000 8.07 2 -i2 6.000000 0.500000 7000 8.09 2 -i2 6.500000 1.000000 7000 8.02 2 -i2 7.500000 1.000000 7000 8.02 2 -i2 8.500000 1.000000 7000 8.02 2 -i2 9.500000 0.500000 7000 8.07 2 -i2 10.000000 0.500000 7000 8.09 2 -i2 10.500000 1.000000 7000 8.02 2 -i2 11.500000 1.000000 7000 8.02 2 -i2 3.500000 1.000000 7000 8.02 2 -i2 4.500000 1.000000 7000 8.02 2 -i2 5.500000 0.500000 7000 8.07 2 -i2 6.000000 0.500000 7000 8.09 2 -i2 6.500000 1.000000 7000 8.02 2 -i2 7.500000 1.000000 7000 8.02 2 -i2 8.500000 1.000000 7000 8.02 2 -i2 9.500000 0.500000 7000 8.07 2 -i2 10.000000 0.500000 7000 8.09 2 -i2 10.500000 1.000000 7000 8.02 2 -i2 11.500000 1.000000 7000 8.02 2 +t 0 100 + +; Section verse1 +; Subsection intro +;Instrument melody +i2 0.000000 1.000000 7000 8.04 2 +i2 1.000000 1.000000 7000 8.04 2 +i2 2.000000 1.000000 7000 8.05 2 +i2 3.000000 1.000000 7000 8.05 2 +i2 4.000000 0.500000 7000 8.07 2 +i2 4.500000 0.500000 7000 8.07 2 +i2 5.000000 3.000000 7000 8.07 2 +; Subsection body +;Instrument melody +i2 8.000000 0.250000 7000 8.04 2 +i2 8.250000 0.250000 7000 8.09 2 +i2 8.500000 0.250000 7000 8.02 2 +i2 8.750000 0.250000 7000 8.07 2 +i2 9.000000 0.250000 7000 8.05 2 +i2 9.250000 0.250000 7000 8.05 2 +i2 9.500000 2.000000 7000 8.11 2 +; Subsection outro +; Section verse2 +; Subsection intro +; Subsection body +;Instrument melody +i2 11.500000 1.000000 7000 8.00 2 +i2 12.500000 1.000000 7000 8.00 2 +i2 13.500000 1.000000 7000 8.00 2 +i2 14.500000 1.000000 7000 8.00 2 +i2 15.500000 0.500000 7000 8.05 2 +i2 16.000000 0.500000 7000 8.05 2 +i2 16.500000 0.500000 7000 8.05 2 +;Instrument harmony +i2 11.500000 1.000000 7000 8.00 2 +i2 12.500000 1.000000 7000 8.00 2 +i2 13.500000 1.000000 7000 8.00 2 +i2 14.500000 1.000000 7000 8.00 2 +i2 15.500000 0.500000 7000 8.05 2 +i2 16.000000 0.500000 7000 8.05 2 +i2 16.500000 0.500000 7000 8.05 2 +; Subsection outro