@@ -15,11 +15,11 @@ self.value = value 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 %d %s %s" % (self.value, self.duration, self.chord_type, self.octave) class Rest(): def __init__(self, duration=.25): self.duration = duration def __repr__(self): @@ -35,22 +35,24 @@ "REST", "OCTAVE", "CHORD_TYPE", "PAREN", "SYNCOPATE", + "NODE", ) t_ignore = " |" - #t_BASENOTE = r"[A-Ga-g]" t_BASENOTE = r"I+V?|VI*|i+v?|vi*" t_ACCIDENTAL = r"\^{1,2}|_{1,2}|=" 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_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_SYNCOPATE = "\+|-" +# t_NODE = "\w*(?!(([Vv][Ii]{0,3})|([Ii][Vv]?)))\w+" + t_NODE = "\S+" def t_NOTE_LENGTH(t): r"/?\d+" multiplier = float(t.value.strip("/")) if t.value.startswith("/"): @@ -69,10 +71,11 @@ def p_note_list(p): '''score : score note | score chord | score rest + | score node ''' p[0] = p[1] + [p[2]] def p_score(p): '''score : note @@ -79,10 +82,16 @@ | chord | rest ''' p[0] = [p[1]] + + def p_node(p): + '''node : NODE + ''' + p[0] = p[1] + def p_chord_length(p): ''' chord : chord NOTE_LENGTH ''' new_note = p[1] @@ -103,18 +112,19 @@ | PAREN note CHORD_TYPE PAREN ''' pitch = p[2].value pitch = pitch.upper() p[0] = Chord(value=pitch, octave=default_octave) - if len(p) > 3: + if len(p) > 4: p[0].chord_type = p[3] def p_note_syncopate(p): ''' note : note SYNCOPATE ''' - note.syncopate = p[2] + p[1].syncopate = p[2] + p[0] = p[1] def p_accidental(p): '''note : ACCIDENTAL note '''