Index: parse.py ================================================================== --- parse.py +++ parse.py @@ -3,24 +3,25 @@ import tree from ply import lex, yacc class Note(): def __init__(self, value, duration=1, octave=8): - self.value = value self.duration = duration + if value > 12: + self.duration += 1 + value = value % 12 + self.value = value self.octave = octave def __repr__(self): return "Note %s %s %s" % (self.value, self.duration, self.octave) class Chord(): - def __init__(self, value, duration=1, chord_type="major", octave=5): - self.value = value + def __init__(self, notes, duration=1): + self.notes = notes self.duration = duration - self.chord_type = chord_type - self.octave = octave def __repr__(self): - return "Chord %s %s %s" % (self.value, self.duration, self.chord_type, self.octave) + return "Chord %s" % (self.notes) class Rest(): def __init__(self, duration=1): self.duration = duration def __repr__(self): @@ -34,11 +35,11 @@ "BASENOTE", "ACCIDENTAL", "REST", "OCTAVE", "CHORD_TYPE", - "PAREN", + "BRACKET", "SYNCOPATE", "NODE", ) t_ignore = " |" @@ -47,11 +48,11 @@ # t_BASENOTE = r"I+V?|VI*|i+v?|vi*" t_ACCIDENTAL = r"\^{1}|_{1}|=" t_REST = r"z" t_OCTAVE = r"'+|,+" t_CHORD_TYPE = r"m|7|m7|0|o|\+|mb5|sus|sus4|maj7|mmaj7|7sus4|dim|dim7|7b5|m7b5|6|b6|m6|mb6|46|maj9|9|add9|7b9|m9" - t_PAREN = "\[|\]" + t_BRACKET = r"\[|\]" t_SYNCOPATE = "\+|-" t_NODE = r"\([a-zA-Z0-9_-]+\)" def t_NOTE_LENGTH(t): r"/?\d+" @@ -102,18 +103,20 @@ new_note.duration = p[2] p[0] = new_note def p_chord(p): - '''chord : PAREN note PAREN - | PAREN note CHORD_TYPE PAREN + '''chord : BRACKET note BRACKET + | BRACKET note CHORD_TYPE BRACKET ''' - pitch = p[2].value - pitch = pitch.upper() - p[0] = Chord(value=pitch, octave=default_octave) - if len(p) > 3: - p[0].chord_type = p[3] + root_note = p[2].value + chorded_notes = [] + + for offset in [0, 4, 7]: + chorded_notes.append(Note(root_note+offset, octave=p[2].octave)) + + p[0] = Chord(notes=chorded_notes) def p_note_syncopate(p): ''' note : note SYNCOPATE ''' Index: spiffyscore.py ================================================================== --- spiffyscore.py +++ spiffyscore.py @@ -20,11 +20,11 @@ def main(): composition = { "intro": { "body": { "percusion": { - "channel": 14, + "channel": 14, # Orchestra kit "octave": 4, "duration": 60, "grammars": { "u": ["A ^A (u)"] } @@ -31,14 +31,16 @@ }, "pan_flute": { "channel": 8, "octave": 5, "duration": 60, + "vol_offset": -15, "grammars": { # Notes for this instrument to use in this piece - "u": ["C2' B2 | A3 D3 || B | C' | D | C2' C2' | z | (u)", "C2' C2' | C2' C2' | (x)"], - "v": ["G2 F2 | E2 F2 | D5 (u)", "B/4 C/4' B/4 A/4 | D2 D2 | z | (u)"], - "x": ["z4 | (v)"], + "u": ["[C2'] C2' | [A3] A3 (u)"], +# "u": ["[C2'] [B2] | [A3] D3 || B | C' | D | C2' C2' | z | (u)", "C2' C2' | C2' C2' | (x)"], +# "v": ["G2 F2 | E2 F2 | D5 (u)", "B/4 C/4' B/4 A/4 | D2 D2 | z | (u)"], +# "x": ["z4 | (v)"], }, }, "bass": { "channel": 4, "sync": "pan_flute", @@ -47,11 +49,11 @@ "grammars": { # Notes for this instrument to use in this piece "u": ["C/2 C/2 C/2 z/2 (u)"], }, }, "horn_timbre1": { - "channel": 13, + "channel": 13, # 'Atmosphere' "octave": 2, "duration": 60, "grammars": { # Notes for this instrument to use in this piece "u": ["C4 D4 (u)"], }, @@ -142,11 +144,10 @@ instrs.append(instr_score) volume = 100 if instr.has_key("vol_offset"): volume += instr["vol_offset"] - print "\t\t\tvolume offset = %d, nev volume = %d" % (instr["vol_offset"], volume) midify_instr_score(instr_score, track, instr["channel"], subsection_start, volume=volume) longest_score = max(instrs, key=lambda i: score_len(i)) subsection_start += score_len(longest_score) section_start += score_len(longest_score) track += 1 @@ -250,13 +251,13 @@ def midify_instr_score(score, track, channel, t, volume): # Assume get_midi_note() global mymidi for token in score: - if isinstance(token, parse.Chord): # Chords - for note in token.chord: - note = get_midi_note(token.octave, note) + if isinstance(token, parse.Chord): + for note in token.notes: + note = get_midi_note(note.octave, note.value) mymidi.addNote(track=track, channel=channel,pitch=note, time=t, duration=token.duration, volume=volume) elif isinstance(token, parse.Note): # Individual notes note = get_midi_note(token.octave, token.value) mymidi.addNote(track=track, channel=channel,pitch=note, time=t, duration=token.duration, volume=volume) elif isinstance(token, tree.Tree):