6bfc2449ff 2010-11-04 spiffytech@gm: #!/usr/bin/env python 6bfc2449ff 2010-11-04 spiffytech@gm: 5a35ffdd27 2010-11-17 spiffytech@gm: from __future__ import division 821ac3e4d6 2011-11-27 brian: import ipdb 4f5bc3936f 2011-10-20 brian: import os 3023a967c2 2011-12-04 brian: from pprint import pprint 6bfc2449ff 2010-11-04 spiffytech@gm: import random 6bfc2449ff 2010-11-04 spiffytech@gm: import sys 6bfc2449ff 2010-11-04 spiffytech@gm: import time 689adc054e 2011-02-10 brian@linux-8: befd61cab9 2011-11-15 brian: from midiutil.MidiFile import MIDIFile as midifile 9bd31df856 2010-11-16 spiffytech@gm: import parse 689adc054e 2011-02-10 brian@linux-8: import topsort 689adc054e 2011-02-10 brian@linux-8: import yaml 689adc054e 2011-02-10 brian@linux-8: 192b8b1639 2011-10-11 brian: import tree 192b8b1639 2011-10-11 brian: 192b8b1639 2011-10-11 brian: random.seed(time.time()) 3023a967c2 2011-12-04 brian: mymidi = midifile(15, deinterleave=True) 192b8b1639 2011-10-11 brian: 6a17d4d36a 2010-11-12 spiffytech@gm: def main(): 192b8b1639 2011-10-11 brian: composition = { 872ae93059 2011-11-16 brian: "intro": { 3023a967c2 2011-12-04 brian: "intro": { 8f28834102 2011-11-27 brian: "pan_flute": { 8f28834102 2011-11-27 brian: "channel": 8, 8f28834102 2011-11-27 brian: "octave": 5, 8f28834102 2011-11-27 brian: "duration": 60, 8f28834102 2011-11-27 brian: "vol_offset": -15, 8f28834102 2011-11-27 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C2' B2 | A3 D3 || B | C' | D | C2' C2' | z | (u)", "C2' C2' | C2' C2' | (x)"], 3023a967c2 2011-12-04 brian: "v": ["G2 F2 | E2 F2 | D5 (u)", "B/4 C/4' B/4 A/4 | D2 D2 | z | (u)"], 3023a967c2 2011-12-04 brian: "x": ["z8 | (v)"], 8f28834102 2011-11-27 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "taisho_koto": { 3023a967c2 2011-12-04 brian: "channel": 11, 3023a967c2 2011-12-04 brian: "octave": 5, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "sync": "pan_flute", 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C/2 F/2 | D/2 z/2 | z4 | (u)", "C/2 F/2 | G/2 F/2 | (u)", "A/2 F/2 z/2 C/2 | z | (u)"], 3023a967c2 2011-12-04 brian: "v": ["z4 (v)"], 3023a967c2 2011-12-04 brian: "x": ["C/2 C/2 | F/2 G/2 | F/2, G/2 | z/2 C/2 | (x)", "C/2 F/2 | D/2 C/4 z/4 | F/2 G/2 A/2 C/2 | (x)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "vibraphone": { 3023a967c2 2011-12-04 brian: "channel": 14, 3023a967c2 2011-12-04 brian: "vol_offset": 27, 3023a967c2 2011-12-04 brian: "octave": 5, 3023a967c2 2011-12-04 brian: "sync": "pan_flute", 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["z4 (u)"], 3023a967c2 2011-12-04 brian: "v": ["G2 F2 | E2 F2 | D5 (u)", "B/4 C/4' B/4 A/4 | D2 D2 | z | (u)"], 3023a967c2 2011-12-04 brian: "x": ["z4 | (v)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "percusion": { 3023a967c2 2011-12-04 brian: "channel": 9, # Orchestra kit 3023a967c2 2011-12-04 brian: "octave": 4, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "grammars": { 3023a967c2 2011-12-04 brian: "u": ["A ^A (u)"] 3023a967c2 2011-12-04 brian: } 8f28834102 2011-11-27 brian: }, 8f28834102 2011-11-27 brian: "bass": { 8f28834102 2011-11-27 brian: "channel": 4, 8f28834102 2011-11-27 brian: "sync": "pan_flute", 8f28834102 2011-11-27 brian: "octave": 2, 8f28834102 2011-11-27 brian: "duration": 60, 8f28834102 2011-11-27 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C/2 C/2 C (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "horn_timbre1": { 3023a967c2 2011-12-04 brian: "channel": 13, # 'Atmosphere' 3023a967c2 2011-12-04 brian: "octave": 2, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -15, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["[C]4 [D]4 (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "body": { 3023a967c2 2011-12-04 brian: "percusion": { 3023a967c2 2011-12-04 brian: "channel": 9, # Orchestra kit 3023a967c2 2011-12-04 brian: "octave": 4, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "grammars": { 3023a967c2 2011-12-04 brian: "u": ["A ^A (u)"] 3023a967c2 2011-12-04 brian: } 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "vibraphone": { 3023a967c2 2011-12-04 brian: "channel": 14, 3023a967c2 2011-12-04 brian: "vol_offset": 27, 3023a967c2 2011-12-04 brian: "octave": 5, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C2' B2 | A3 D3 || B | C' | D | C2' C2' | z | (u)", "C2' C2' | C2' C2' | (x)"], 3023a967c2 2011-12-04 brian: "v": ["G2 F2 | E2 F2 | D5 (u)", "B/4 C/4' B/4 A/4 | D2 D2 | z | (u)"], 3023a967c2 2011-12-04 brian: "x": ["z4 | (v)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "bass": { 3023a967c2 2011-12-04 brian: "channel": 4, 3023a967c2 2011-12-04 brian: "sync": "vibraphone", 3023a967c2 2011-12-04 brian: "octave": 2, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C/2 C/2 C (u)"], f8034c7dfb 2011-11-17 brian: }, f8034c7dfb 2011-11-17 brian: }, 821ac3e4d6 2011-11-27 brian: "horn_timbre1": { 8f28834102 2011-11-27 brian: "channel": 13, # 'Atmosphere' f8034c7dfb 2011-11-17 brian: "octave": 2, f8034c7dfb 2011-11-17 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -15, f8034c7dfb 2011-11-17 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["[C]4 [D]4 (u)"], f8034c7dfb 2011-11-17 brian: }, f8034c7dfb 2011-11-17 brian: }, f8034c7dfb 2011-11-17 brian: }, f8034c7dfb 2011-11-17 brian: }, f8034c7dfb 2011-11-17 brian: "section1": { 3023a967c2 2011-12-04 brian: "intro": { 3023a967c2 2011-12-04 brian: "reverse_cymbal": { 3023a967c2 2011-12-04 brian: "channel": 5, 3023a967c2 2011-12-04 brian: "octave": 3, 3023a967c2 2011-12-04 brian: "duration": 3, 3023a967c2 2011-12-04 brian: "grammars": { 3023a967c2 2011-12-04 brian: "u": ["B3"] 3023a967c2 2011-12-04 brian: } 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "bass": { 3023a967c2 2011-12-04 brian: "channel": 4, 3023a967c2 2011-12-04 brian: "octave": 2, 3023a967c2 2011-12-04 brian: "duration": 3, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C/2 C/2 C (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "percusion": { 3023a967c2 2011-12-04 brian: "channel": 9, # Orchestra kit 3023a967c2 2011-12-04 brian: "octave": 4, 3023a967c2 2011-12-04 brian: "duration": 3, 3023a967c2 2011-12-04 brian: "vol_offset": -10, 3023a967c2 2011-12-04 brian: "grammars": { 3023a967c2 2011-12-04 brian: "u": ["E,, | z4 | (u)"] 3023a967c2 2011-12-04 brian: } 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "atmosphere1": { 3023a967c2 2011-12-04 brian: "channel": 13, 3023a967c2 2011-12-04 brian: "octave": 2, 3023a967c2 2011-12-04 brian: "duration": 3, 3023a967c2 2011-12-04 brian: "vol_offset": -15, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["[C]4 (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 4f872339ff 2011-11-07 brian: "body": { 821ac3e4d6 2011-11-27 brian: "guitar": { # Instrument 'melody' 3023a967c2 2011-12-04 brian: "channel": 11, 3023a967c2 2011-12-04 brian: "octave": 4, f8034c7dfb 2011-11-17 brian: "duration": 60, 872ae93059 2011-11-16 brian: "grammars": { # Notes for this instrument to use in this piece 821ac3e4d6 2011-11-27 brian: "u": ["C | E | A | F | G | z | (u)", "C | E | A | F | G | z | (v)"], 821ac3e4d6 2011-11-27 brian: "v": ["A/2 D/2 | G/2 C/2 | F/2 B/2 | E/2 | z/2 | (u)"], 872ae93059 2011-11-16 brian: }, 872ae93059 2011-11-16 brian: }, 821ac3e4d6 2011-11-27 brian: "bass": { # Instrument 'bass' 872ae93059 2011-11-16 brian: "channel": 4, 821ac3e4d6 2011-11-27 brian: "sync": "guitar", 821ac3e4d6 2011-11-27 brian: "octave": 2, 821ac3e4d6 2011-11-27 brian: "duration": 60, 821ac3e4d6 2011-11-27 brian: "grammars": { # Notes for this instrument to use in this piece 821ac3e4d6 2011-11-27 brian: "u": ["C/2 C/2 | C/2 z/2 | (u)"], 821ac3e4d6 2011-11-27 brian: }, 821ac3e4d6 2011-11-27 brian: }, 3023a967c2 2011-12-04 brian: "percusion": { 3023a967c2 2011-12-04 brian: "channel": 9, # Orchestra kit 3023a967c2 2011-12-04 brian: "octave": 4, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -10, 3023a967c2 2011-12-04 brian: "grammars": { 3023a967c2 2011-12-04 brian: "u": ["^G,, | ^A,, | ^G,,/2 ^A,,/2 | E,, | z4 | (u)", "E,, | z4 | (u)"] 3023a967c2 2011-12-04 brian: } 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "atmosphere1": { 821ac3e4d6 2011-11-27 brian: "channel": 13, 821ac3e4d6 2011-11-27 brian: "octave": 2, 821ac3e4d6 2011-11-27 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -15, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["[C]4 [D]4 (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "blackmore1": { 3023a967c2 2011-12-04 brian: "intro": { 3023a967c2 2011-12-04 brian: "guitar": { 3023a967c2 2011-12-04 brian: "channel": 6, 3023a967c2 2011-12-04 brian: "octave": 3, 3023a967c2 2011-12-04 brian: "duration": 60, 821ac3e4d6 2011-11-27 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C3 | C/4 D/4 E | C/4 C | (u)"], 821ac3e4d6 2011-11-27 brian: }, 821ac3e4d6 2011-11-27 brian: }, 3023a967c2 2011-12-04 brian: "contrabass": { 821ac3e4d6 2011-11-27 brian: "channel": 13, 4f872339ff 2011-11-07 brian: "octave": 2, f8034c7dfb 2011-11-17 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -45, 3023a967c2 2011-12-04 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["[C]4 [D]4 (u)"], 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: }, 3023a967c2 2011-12-04 brian: "choir": { 3023a967c2 2011-12-04 brian: "channel": 7, 3023a967c2 2011-12-04 brian: "octave": 3, 3023a967c2 2011-12-04 brian: "duration": 60, 3023a967c2 2011-12-04 brian: "vol_offset": -35, 872ae93059 2011-11-16 brian: "grammars": { # Notes for this instrument to use in this piece 3023a967c2 2011-12-04 brian: "u": ["C2 G2 F2 B,2 C3 (u)"], 872ae93059 2011-11-16 brian: }, 872ae93059 2011-11-16 brian: }, 192b8b1639 2011-10-11 brian: }, 192b8b1639 2011-10-11 brian: }, 6a17d4d36a 2010-11-12 spiffytech@gm: } 192b8b1639 2011-10-11 brian: 192b8b1639 2011-10-11 brian: section_start = 0 3023a967c2 2011-12-04 brian: for section_name in ["intro", "section1", "blackmore1"]: 821ac3e4d6 2011-11-27 brian: print "Section " + section_name 192b8b1639 2011-10-11 brian: subsection_start = section_start 821ac3e4d6 2011-11-27 brian: section = composition[section_name] 192b8b1639 2011-10-11 brian: for subsection in ["intro", "body", "outro"]: 821ac3e4d6 2011-11-27 brian: if not section.has_key(subsection): 821ac3e4d6 2011-11-27 brian: continue 821ac3e4d6 2011-11-27 brian: print "\tSubsection " + subsection 821ac3e4d6 2011-11-27 brian: subsection = section[subsection] 821ac3e4d6 2011-11-27 brian: 821ac3e4d6 2011-11-27 brian: unordered_instrs = [] 821ac3e4d6 2011-11-27 brian: for instr in subsection: 821ac3e4d6 2011-11-27 brian: subsection[instr]["name"] = instr 821ac3e4d6 2011-11-27 brian: if not "sync" in subsection[instr].keys(): 821ac3e4d6 2011-11-27 brian: subsection[instr]["sync"] = None 821ac3e4d6 2011-11-27 brian: unordered_instrs.append([subsection[instr]["sync"], instr]) 821ac3e4d6 2011-11-27 brian: ordered_instrs = topsort.topsort(unordered_instrs) 821ac3e4d6 2011-11-27 brian: ordered_instrs.remove(None) # None used as a placeholder for sort order for instruments with no sync setting 821ac3e4d6 2011-11-27 brian: for sync_instr in ordered_instrs: 821ac3e4d6 2011-11-27 brian: if sync_instr not in subsection.keys(): 821ac3e4d6 2011-11-27 brian: raise KeyError("The sync instrument '%s' does not exist in this subsection" % sync_instr) 821ac3e4d6 2011-11-27 brian: 821ac3e4d6 2011-11-27 brian: instrs = [] 821ac3e4d6 2011-11-27 brian: syncs = {} 821ac3e4d6 2011-11-27 brian: track = 0 821ac3e4d6 2011-11-27 brian: for instr in ordered_instrs: 821ac3e4d6 2011-11-27 brian: print "\t\tInstrument " + instr 821ac3e4d6 2011-11-27 brian: # if instr == "guitar": 821ac3e4d6 2011-11-27 brian: # ipdb.set_trace() 821ac3e4d6 2011-11-27 brian: instr = subsection[instr] 821ac3e4d6 2011-11-27 brian: max_time = instr["duration"] 821ac3e4d6 2011-11-27 brian: instr_score, syncs = render_instr(instr, syncs, max_time) 821ac3e4d6 2011-11-27 brian: instrs.append(instr_score) 821ac3e4d6 2011-11-27 brian: 821ac3e4d6 2011-11-27 brian: volume = 100 821ac3e4d6 2011-11-27 brian: if instr.has_key("vol_offset"): 821ac3e4d6 2011-11-27 brian: volume += instr["vol_offset"] 3023a967c2 2011-12-04 brian: mymidi.addTrackName(track, 0, instr["name"]) 821ac3e4d6 2011-11-27 brian: midify_instr_score(instr_score, track, instr["channel"], subsection_start, volume=volume) 3023a967c2 2011-12-04 brian: track += 1 821ac3e4d6 2011-11-27 brian: longest_score = max(instrs, key=lambda i: score_len(i)) 821ac3e4d6 2011-11-27 brian: subsection_start += score_len(longest_score) 821ac3e4d6 2011-11-27 brian: section_start += score_len(longest_score) befd61cab9 2011-11-15 brian: with open("out.mid", "wb") as outfile: befd61cab9 2011-11-15 brian: mymidi.writeFile(outfile) befd61cab9 2011-11-15 brian: 42c3ba150c 2011-10-18 brian: 42c3ba150c 2011-10-18 brian: 42c3ba150c 2011-10-18 brian: def render_instr(instr, syncs, max_time): 192b8b1639 2011-10-11 brian: for g in instr["grammars"]: 42c3ba150c 2011-10-18 brian: for i in range(len(instr["grammars"][g])): 3023a967c2 2011-12-04 brian: try: 3023a967c2 2011-12-04 brian: instr["grammars"][g][i] = parse.parse(instr["grammars"][g][i], default_octave=instr["octave"]) 3023a967c2 2011-12-04 brian: except topsort.CycleError: 3023a967c2 2011-12-04 brian: print "Your syncs created a loop! Fix it." 3023a967c2 2011-12-04 brian: sys.exit(1) 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: score= [] 4f5bc3936f 2011-10-20 brian: try: a9e60898b7 2011-10-20 brian: score, syncs = choose_phrase(instr, syncs, 0, max_time, None) 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: while True: 4f5bc3936f 2011-10-20 brian: score_index_to_replace = None 4f5bc3936f 2011-10-20 brian: for item in range(len(score)): # Optimize this by caching the index of the last node I replaced and startng there a9e60898b7 2011-10-20 brian: if isinstance(score[item], tree.Tree): # Also, make this use the find_next_node() function (or whatever I called it) 4f5bc3936f 2011-10-20 brian: score_index_to_replace = item 4f5bc3936f 2011-10-20 brian: if score_index_to_replace is None: 4f5bc3936f 2011-10-20 brian: raise ValueError("No more nodes to fill in") 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: time_remaining = max_time - score_len(score) a9e60898b7 2011-10-20 brian: new_phrase, syncs = choose_phrase(instr, syncs, score_len(score), time_remaining, score) 2ae36c6e68 2011-10-20 brian: score = score[:score_index_to_replace] + new_phrase + score[score_index_to_replace+1:] 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: except ValueError: 4f5bc3936f 2011-10-20 brian: return (score, syncs) 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: a9e60898b7 2011-10-20 brian: def choose_phrase(instr, syncs, current_time, time_remaining, score): 4f5bc3936f 2011-10-20 brian: '''Filters grammars for ones that match the sync option, and phrases that fit the time remaining in the score''' 4f5bc3936f 2011-10-20 brian: time_filtered_grammars = {} 4f5bc3936f 2011-10-20 brian: for grammar in instr["grammars"]: 601339a475 2011-10-20 brian: fitting_phrases = get_phrases_that_fit(instr["grammars"][grammar], time_remaining) 601339a475 2011-10-20 brian: if len(fitting_phrases) > 0: 601339a475 2011-10-20 brian: time_filtered_grammars[grammar] = fitting_phrases 4f5bc3936f 2011-10-20 brian: if len(time_filtered_grammars.keys()) == 0: 4f5bc3936f 2011-10-20 brian: raise ValueError("No available grammars that will fit in the score") 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: grammar = None 3023a967c2 2011-12-04 brian: # if instr["name"] == "taisho_koto": 3023a967c2 2011-12-04 brian: # ipdb.set_trace() 3023a967c2 2011-12-04 brian: 42c3ba150c 2011-10-18 brian: if instr["sync"] is not None: 42c3ba150c 2011-10-18 brian: guiding_instr = instr["sync"] 42c3ba150c 2011-10-18 brian: sync_node = get_sync_node_at_time(syncs[guiding_instr], current_time) 4f5bc3936f 2011-10-20 brian: if sync_node in time_filtered_grammars.keys(): 4f5bc3936f 2011-10-20 brian: grammar = sync_node a9e60898b7 2011-10-20 brian: else: a9e60898b7 2011-10-20 brian: grammar = random.choice(time_filtered_grammars.keys()) a9e60898b7 2011-10-20 brian: if score is None: 4f5bc3936f 2011-10-20 brian: grammar = random.choice(time_filtered_grammars.keys()) a9e60898b7 2011-10-20 brian: elif instr["sync"] is None: a9e60898b7 2011-10-20 brian: grammar = get_next_node(score); f8034c7dfb 2011-11-17 brian: if grammar not in instr["grammars"].keys(): f8034c7dfb 2011-11-17 brian: raise Exception("You tried to direct a grammar to a node that doesn't exist") 821ac3e4d6 2011-11-27 brian: 821ac3e4d6 2011-11-27 brian: if grammar not in time_filtered_grammars.keys(): 821ac3e4d6 2011-11-27 brian: return [], syncs 821ac3e4d6 2011-11-27 brian: 4f5bc3936f 2011-10-20 brian: phrases = time_filtered_grammars[grammar] 4f5bc3936f 2011-10-20 brian: if instr["name"] not in syncs.keys(): 4f5bc3936f 2011-10-20 brian: syncs[instr["name"]] = [] 4f5bc3936f 2011-10-20 brian: syncs[instr["name"]].append({"node": grammar, "time": current_time}) 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: return random.choice(phrases), syncs 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: 4f5bc3936f 2011-10-20 brian: def get_phrases_that_fit(grammar, time_remaining): 4f5bc3936f 2011-10-20 brian: valid_phrases = [] 4f5bc3936f 2011-10-20 brian: for phrase in grammar: 4f5bc3936f 2011-10-20 brian: if score_len(phrase) <= time_remaining: 4f5bc3936f 2011-10-20 brian: valid_phrases.append(phrase) 4f5bc3936f 2011-10-20 brian: return valid_phrases 42c3ba150c 2011-10-18 brian: 42c3ba150c 2011-10-18 brian: 42c3ba150c 2011-10-18 brian: def get_sync_node_at_time(syncs, t): 4f5bc3936f 2011-10-20 brian: for s in range(len(syncs)): 4f5bc3936f 2011-10-20 brian: if syncs[s]["time"] >= t: 42c3ba150c 2011-10-18 brian: return syncs[s]["node"] 4f5bc3936f 2011-10-20 brian: a9e60898b7 2011-10-20 brian: def get_next_node(score): a9e60898b7 2011-10-20 brian: for token in score: a9e60898b7 2011-10-20 brian: if isinstance(token, tree.Tree): a9e60898b7 2011-10-20 brian: return token.name a9e60898b7 2011-10-20 brian: 192b8b1639 2011-10-11 brian: 192b8b1639 2011-10-11 brian: def score_len(score): 192b8b1639 2011-10-11 brian: total = 0 192b8b1639 2011-10-11 brian: for n in score: 192b8b1639 2011-10-11 brian: if not isinstance(n, tree.Tree): 192b8b1639 2011-10-11 brian: total += n.duration 192b8b1639 2011-10-11 brian: return total 192b8b1639 2011-10-11 brian: 192b8b1639 2011-10-11 brian: befd61cab9 2011-11-15 brian: def get_midi_note(octave, note): befd61cab9 2011-11-15 brian: return note + 12 * (octave+1) befd61cab9 2011-11-15 brian: befd61cab9 2011-11-15 brian: 821ac3e4d6 2011-11-27 brian: def midify_instr_score(score, track, channel, t, volume): befd61cab9 2011-11-15 brian: # Assume get_midi_note() befd61cab9 2011-11-15 brian: global mymidi befd61cab9 2011-11-15 brian: 702d933446 2011-02-10 brian@linux-8: for token in score: 8f28834102 2011-11-27 brian: if isinstance(token, parse.Chord): 8f28834102 2011-11-27 brian: for note in token.notes: 8f28834102 2011-11-27 brian: note = get_midi_note(note.octave, note.value) 821ac3e4d6 2011-11-27 brian: mymidi.addNote(track=track, channel=channel,pitch=note, time=t, duration=token.duration, volume=volume) 702d933446 2011-02-10 brian@linux-8: elif isinstance(token, parse.Note): # Individual notes befd61cab9 2011-11-15 brian: note = get_midi_note(token.octave, token.value) 821ac3e4d6 2011-11-27 brian: mymidi.addNote(track=track, channel=channel,pitch=note, time=t, duration=token.duration, volume=volume) 192b8b1639 2011-10-11 brian: elif isinstance(token, tree.Tree): 192b8b1639 2011-10-11 brian: continue 192b8b1639 2011-10-11 brian: t += token.duration befd61cab9 2011-11-15 brian: befd61cab9 2011-11-15 brian: return [] 338933c1a8 2010-11-12 spiffytech@gm: 6bfc2449ff 2010-11-04 spiffytech@gm: 6a17d4d36a 2010-11-12 spiffytech@gm: if __name__ == "__main__": main()