spiffyscore

Check-in [87435601e4]
Login
Overview
Comment:Made some changes to the parser. Don't remember what.
Timelines: family | ancestors | master
Files: files | file ages | folders
SHA1: 87435601e4038963fe1778ef7599b8347d0b420b
User & Date: brian on 2011-06-12 20:32:21
Other Links: branch diff | manifest | tags
Context
2011-06-12
20:32
Made some changes to the parser. Don't remember what. Leaf check-in: 87435601e4 user: brian tags: master
2011-02-10
23:50
Program generates a render order for the instruments based on their sync order check-in: 689adc054e user: brian@linux-85dd.site tags: master
Changes

Modified cfg.py from [e9b556b4f3] to [3cbe823f2f].

28
29
30
31
32
33
34



















35
36
37
38
39
40
41
                try:
                    render_order = topsort.topsort([[composition[movement][section][instrument]["sync"], instrument] if "sync" in composition[movement][section][instrument].keys() else [None, instrument] for instrument in composition[movement][section]])
                except topsort.CycleError as ex:
                    print "Your instruments are synced in a circle! This makes no sense!"
                    print movement, section
                    print ex
                    sys.exit(1)



















                

#    for comp_name in progression.split():
#        comp_start_time = max_t
#        for instr_name, instr in composition[comp_name].iteritems():
#            generated_score = generate_score(instr["score"], instr["grammars"])  # Fill in the scores by generating them based on the grammars
##            print generated_score







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
                try:
                    render_order = topsort.topsort([[composition[movement][section][instrument]["sync"], instrument] if "sync" in composition[movement][section][instrument].keys() else [None, instrument] for instrument in composition[movement][section]])
                except topsort.CycleError as ex:
                    print "Your instruments are synced in a circle! This makes no sense!"
                    print movement, section
                    print ex
                    sys.exit(1)
                while None in render_order:
                    render_order.remove(None)
                for instrument in render_order:
                    grammars = composition[movement][section][instrument]["grammars"]
                    for grammar in grammars:
                        if isinstance(grammars[grammar], list):
                            for option in range(len(grammar)):
                                grammars[grammar][option] = parse.parse(grammars[grammar][option])
                        else:
                            grammars[grammar] = parse.parse(grammars[grammar])
                    print instrument, movement, section
                    print grammars


def generate_score_phrase(grammar, grammars):
    count_length = 
    while count_length < 100000:
    

                

#    for comp_name in progression.split():
#        comp_start_time = max_t
#        for instr_name, instr in composition[comp_name].iteritems():
#            generated_score = generate_score(instr["score"], instr["grammars"])  # Fill in the scores by generating them based on the grammars
##            print generated_score

Modified parse.py from [3ec57c3fbe] to [c06717e335].

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
51


52
53
54
55
56
57
58
class Chord():
    def __init__(self, value, duration=.5, chord_type="major", octave=5):
        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)

class Rest():
    def __init__(self, duration=.25):
        self.duration = duration
    def __repr__(self):
        return "Rest node %s" % self.duration


def parse(score, default_octave=8):
    # Tokenize (lex)
    tokens = (
        "NOTE_LENGTH",
        "BASENOTE",
        "ACCIDENTAL",
        "REST",
        "OCTAVE",
        "CHORD_TYPE",
        "PAREN",
        "SYNCOPATE",

    )

    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_PAREN = "\(|\)"
    t_SYNCOPATE = "\+|-"



    def t_NOTE_LENGTH(t):
        r"/?\d+"
        multiplier = float(t.value.strip("/"))
        if t.value.startswith("/"):
            multiplier = 1/multiplier
        t.value = multiplier







|



















>




<




|


>
>







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Chord():
    def __init__(self, value, duration=.5, chord_type="major", octave=5):
        self.value = value
        self.duration = duration
        self.chord_type = chord_type
        self.octave = octave
    def __repr__(self):
        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):
        return "Rest node %s" % self.duration


def parse(score, default_octave=8):
    # Tokenize (lex)
    tokens = (
        "NOTE_LENGTH",
        "BASENOTE",
        "ACCIDENTAL",
        "REST",
        "OCTAVE",
        "CHORD_TYPE",
        "PAREN",
        "SYNCOPATE",
        "NODE",
    )

    t_ignore = " |"


    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_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("/"):
            multiplier = 1/multiplier
        t.value = multiplier
67
68
69
70
71
72
73

74
75
76
77
78
79
80
81
82
83






84
85
86
87
88
89
90

    # Parse (yacc)

    def p_note_list(p):
        '''score : score note
                 | score chord
                 | score rest

        '''
        p[0] = p[1] + [p[2]]

    def p_score(p):
        '''score : note
                 | chord
                 | rest
        '''
        p[0] = [p[1]]








    def p_chord_length(p):
        ''' chord : chord NOTE_LENGTH
        '''
        new_note = p[1]
        new_note.duration = p[2]
        p[0] = new_note







>










>
>
>
>
>
>







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

    # Parse (yacc)

    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
                 | 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]
        new_note.duration = p[2]
        p[0] = new_note
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

116
117
118
119
120
121
122
    def p_chord(p):
        '''chord : PAREN note PAREN
                 | PAREN note CHORD_TYPE PAREN
        '''
        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]


    def p_note_syncopate(p):
        ''' note : note SYNCOPATE
        '''
        note.syncopate = p[2]



    def p_accidental(p):
        '''note : ACCIDENTAL note
        '''
        p[2].accidental = p[1]
        p[0] = p[2]







|






|
>







110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    def p_chord(p):
        '''chord : PAREN note PAREN
                 | PAREN note CHORD_TYPE PAREN
        '''
        pitch = p[2].value
        pitch = pitch.upper()
        p[0] = Chord(value=pitch, octave=default_octave)
        if len(p) > 4:
            p[0].chord_type = p[3]


    def p_note_syncopate(p):
        ''' note : note SYNCOPATE
        '''
        p[1].syncopate = p[2]
        p[0] = p[1]


    def p_accidental(p):
        '''note : ACCIDENTAL note
        '''
        p[2].accidental = p[1]
        p[0] = p[2]

Added score.yaml version [29fd4ba47c].















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
---
chorus:
    core:
        rhythm:
            csound_line: i1 %(time)f %(duration)f 7000 %(octave)d.%(note)s %(octave)d.%(note)s 0 6
            max_duration: 80
            sync: timbre
            octave: 7
            sustain: 1
            grammars:
                u: 
                    - (I) (ii)/4 (ii)/4 (IV)/2 (V)2 (IV) (ii) x u
                    - (I) (vii) (III) y u
                    - (I) (v) (IV) u u
                w: (i) (VII)2 (VI)/4 (V)/4 (i)/4 (VII)2 (VI) (V) w u
                x: (III/2) (VI)/2 (III)/2 (vii)2 (i)2 (V) u
                y: (I) (vi)2 (IV) (V) y y u

        timbre:
            csound_line: i3 %(time)f %(duration)f 2000 %(octave)d.%(note)s 2 3 5 3
            max_duration: 80
            sync: melody
            sustain: 1
            octave: 6
            grammars:
                u: 
                    - I2+ VII2 V2 VI2 I2 IV/2 V/2 III2 u
                    - I2- IV2 V2 IV I V2 III2 II2. u

        melody:
            csound_line: i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2
            max_duration: 80
            octave: 8
            grammars: 
                u: 
                    - I V/2 V/2 V/2 I VII
                    - IV' I IV I VII IV
                w: III/4 VI/4 II/4 V/4 VI/4 IV/4 VII2
                x: I/2 I/2 VI IV/2 V2 z I/2 I/2 VI IV/2 V