spiffyscore
File Annotation
Not logged in
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()