@@ -16,23 +16,19 @@ max_duration = 1 composition = { "a": { # Movement block 'a' for reuse throughout the piece "melody": { # Instrument 'melody' - "csound_parameters": { - "instrument": 1, - }, + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6", "grammars": { # Notes for this instrument to use in this piece "u": ["I V V V I I IV u u", "I IV u u", "I VII IV u u" , "e"], "e": [""], }, "score": "u u u u u", }, "rhythm": { - "csound_parameters": { - "instrument": 1, - }, + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6", "grammars": { "u": ['"I" "ii"/4 "ii"/4 "IV"/2 "V"2 "IV" "I" u u', '"I" "vii" "IV" u u', '"I" "v" "IV" u u', "e"], # "u": ['"i" "I" "ii" "II" "v" "V" u', "e"], "e": [""] }, @@ -39,24 +35,19 @@ "score": "u u u", }, }, "b": { "melody": { # Instrument 'melody' - "csound_parameters": { - "instrument": 1, - }, + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6", "grammars": { # Notes for this instrument to use in this piece "u": ["I V I I/2 IV/2 u u", "I2 IV u u", "I IV IV VI V u u" , "e"], -# "u": ["I IV I V u u u", "e"], "e": [""], }, "score": "u u u", }, "rhythm": { - "csound_parameters": { - "instrument": 1, - }, + "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6", "grammars": { "u": ['"I" "IV"/2 "V"2 "IV" "I" u u', '"I" "VII" "IV" u u', '"I" "V" "IV" u u', "e"], "e": [""] }, "score": "u u u", @@ -74,15 +65,12 @@ # Generate timestamps for the notes t = instr_start_time for note in range(len(score)): score[note].time = t -# print "Original duration:", score[note].duration score[note].duration *= tempo -# print "New duration:", score[note].duration t += score[note].duration -# print "t:", t max_t = t if t > max_t else max_t composition[comp_name][instr_name]["score"] = score # Must be done after all note times keyed in, else you can't coordinate melodies with the rhythm chords for comp_name in progression.split(): @@ -89,11 +77,11 @@ for instr_name, instr in composition[comp_name].iteritems(): composition[comp_name][instr_name]["score"] = transliterate_score(composition[comp_name][instr_name]["score"], key) # print "\nMovement %s instrument %s" % (comp_name, instr_name) # print composition[comp_name][instr_name]["score"] print "f1 0 256 10 1 0 3 ; sine wave function table" - final_score = generate_csound_score(composition[comp_name][instr_name]["score"]) + final_score = generate_csound_score(composition[comp_name][instr_name]["score"], composition[comp_name][instr_name]["score_line"]) for line in final_score: print line def make_scale(key): @@ -152,11 +140,11 @@ elif isinstance(score[i], parse.Rest): pass return score -def generate_csound_score(score): +def generate_csound_score(score, score_line): csound_note_values = { "C": "00", "C#": "01", "D": "02", "D#": "03", @@ -172,13 +160,15 @@ csound_score = [] for token in score: if isinstance(token, parse.Chord): # Chords for note in token.chord: note = csound_note_values[note] - csound_score.append("i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6" % {"time": token.time, "octave": random.choice([7,8]), "note": note, "duration": token.duration}) +# csound_score.append("i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6" % {"time": token.time, "octave": random.choice([7,8]), "note": note, "duration": token.duration}) + csound_score.append(score_line % {"time": token.time, "octave": random.choice([7,8]), "note": note, "duration": token.duration}) elif isinstance(token, parse.Note): # Individual notes note = csound_note_values[token.value] - csound_score.append("i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6" % {"time": token.time, "octave": random.choice([8,9]), "note": note, "duration": token.duration}) + csound_score.append(score_line % {"time": token.time, "octave": random.choice([8,9]), "note": note, "duration": token.duration}) +# csound_score.append("i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6" % {"time": token.time, "octave": random.choice([8,9]), "note": note, "duration": token.duration}) return csound_score if __name__ == "__main__": main()