spiffyscore

Check-in [f653a4fa10]
Login

Check-in [f653a4fa10]

Overview
Comment:Added back in support for subsections
Timelines: family | ancestors | descendants | both | feature/abc
Files: files | file ages | folders
SHA1: f653a4fa1046734d8b1cdf93e96149f2f5bab309
User & Date: brian on 2011-09-22 18:30:17
Other Links: branch diff | manifest | tags
Context
2011-10-11
15:19
Played around a little with melodies and instruments Closed-Leaf check-in: 29231e328a user: brian tags: feature/abc
2011-09-22
18:30
Added back in support for subsections check-in: f653a4fa10 user: brian tags: feature/abc
18:04
Fixed bug that prevented more than two sections from working properly check-in: b2ce9522e9 user: brian tags: feature/abc
Changes

Modified cfg.py from [fb69d16646] to [0cb9a22d0b].

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
40
41
42















43
44
45
46
47
48
49
50

51
52
53
54


55
56
57
58
59
60
61
62
63
64
65
66



















67
68
69
70
71
72
73
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
40
41
42














43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

65
66
67
68
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







+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







-
+




+
+

-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







import tree

random.seed(time.time())

def main():
    composition = {
        "verse1": {
            "intro": {
            "melody": {  # Instrument 'melody'
                "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                "octave": 8,
                "duration": 10,
                "grammars": {  # Notes for this instrument to use in this piece
                    "u": ["C G/2 G/2 G/2 C B, F' C F C B F (w)"],
                    "w": ["E/4 A/4 D/4 G/4 F/4 F/4 B2 (u)"],
                },
            },
        },
                "melody": {  # Instrument 'melody'
                    "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                    "octave": 8,
                    "duration": 10,
                    "grammars": {  # Notes for this instrument to use in this piece
                        "u": ["G/2 G/2 G/4 G/4 A/4 A/4 A/2 G G A A A3 (w)"],
                        "w": ["E E F F G/2 G/2 G3 (u)"],
                    },
                },
            },
            "body": {
                "melody": {  # Instrument 'melody'
                    "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                    "octave": 8,
                    "duration": 10,
                    "grammars": {  # Notes for this instrument to use in this piece
                        "u": ["C G/2 G/2 G/2 C B, F' C F C B F (w)"],
                        "w": ["E/4 A/4 D/4 G/4 F/4 F/4 B2 (u)"],
                    },
                },
            },
        },
        "verse2": {
            "body": {
            "melody": {  # Instrument 'melody'
                "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                "octave": 8,
                "duration": 10,
                "grammars": {  # Notes for this instrument to use in this piece
                    "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"],
                },
            },
            "harmony": {  # Instrument 'melody'
                "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                "octave": 8,
                "duration": 10,
                "grammars": {  # Notes for this instrument to use in this piece
                    "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"],
                "melody": {  # Instrument 'melody'
                    "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                    "octave": 8,
                    "duration": 10,
                    "grammars": {  # Notes for this instrument to use in this piece
                        "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"],
                    },
                },
                "harmony": {  # Instrument 'melody'
                    "score_line": "i2 %(time)f %(duration)f 7000 %(octave)d.%(note)s 2",
                    "octave": 8,
                    "duration": 10,
                    "grammars": {  # Notes for this instrument to use in this piece
                        "u": ["C C C C F/2 F/2 F/2 (u)", "D D G/2 A/2 D D (u)"],
                    },
                },
            },
        },
    }
    print '''f1 0 512 10 1
f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08
f3 0 1025 10 1
t 0 60
t 0 100
    '''

    section_start = 0
    for section in ["verse1", "verse2"]:
        print "; Section " + section
        subsection_start = section_start
        section = composition[section]
#        for subsection in section
        instrs = []
        for instr in section.values():
            sync = None
            max_time = instr["duration"]
            instr_score = render_instr(instr, sync, max_time)
            instrs.append(instr_score)
            for line in generate_csound_score(instr_score, instr["score_line"], section_start):
                print line
        longest_score = max(instrs, key=lambda i: score_len(i))
        section_start += score_len(longest_score)
        for subsection in ["intro", "body", "outro"]:
            try:
                print "; Subsection " + subsection
                subsection = section[subsection]
                instrs = []
                for instr in subsection:
                    print ";Instrument " + instr
                    instr = subsection[instr]
                    sync = None
                    max_time = instr["duration"]
                    instr_score = render_instr(instr, sync, max_time)
                    instrs.append(instr_score)
                    for line in generate_csound_score(instr_score, instr["score_line"], subsection_start):
                        print line
                longest_score = max(instrs, key=lambda i: score_len(i))
                subsection_start += score_len(longest_score)
                section_start += score_len(longest_score)
            except KeyError:
                pass
        


def render_instr(instr, sync, max_time):
    grammars = instr["grammars"]
    for g in instr["grammars"]:
        for i in range(len(grammars[g])):
98
99
100
101
102
103
104
105

106
107
108
109
110
111
112
123
124
125
126
127
128
129

130
131
132
133
134
135
136
137







-
+







    options = []
    for g in range(len(grammars[node])):
        if score_len(grammars[node][g]) <= time_remaining:
            options.append(grammars[node][g])
    if len(options) == 0:
        raise ValueError("No available grammars that will fit in the score")
    if sync:
        
        pass
    else:
        phrase = random.choice(options)
    score = score[:node_index-1] + phrase + score[node_index+1:]
    return score


def score_len(score):

Modified test.sco from [ec3cdf0cc7] to [b5abda4892].

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

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
40
41
42
43




44



45



-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
-
-
-
+
f1 0 512 10 1
f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08
f3 0 1025 10 1
t 0 60
    
i2 0.000000 0.250000 7000 8.04 2
i2 0.250000 0.250000 7000 8.09 2
i2 0.500000 0.250000 7000 8.02 2
i2 0.750000 0.250000 7000 8.07 2
t 0 100
    
; Section verse1
; Subsection intro
;Instrument melody
i2 0.000000 1.000000 7000 8.04 2
i2 1.000000 1.000000 7000 8.04 2
i2 2.000000 1.000000 7000 8.05 2
i2 3.000000 1.000000 7000 8.05 2
i2 4.000000 0.500000 7000 8.07 2
i2 4.500000 0.500000 7000 8.07 2
i2 5.000000 3.000000 7000 8.07 2
; Subsection body
;Instrument melody
i2 8.000000 0.250000 7000 8.04 2
i2 8.250000 0.250000 7000 8.09 2
i2 8.500000 0.250000 7000 8.02 2
i2 8.750000 0.250000 7000 8.07 2
i2 9.000000 0.250000 7000 8.05 2
i2 9.250000 0.250000 7000 8.05 2
i2 9.500000 2.000000 7000 8.11 2
; Subsection outro
; Section verse2
; Subsection intro
; Subsection body
;Instrument melody
i2 1.000000 0.250000 7000 8.05 2
i2 1.250000 0.250000 7000 8.05 2
i2 1.500000 2.000000 7000 8.11 2
i2 3.500000 1.000000 7000 8.02 2
i2 4.500000 1.000000 7000 8.02 2
i2 11.500000 1.000000 7000 8.00 2
i2 12.500000 1.000000 7000 8.00 2
i2 5.500000 0.500000 7000 8.07 2
i2 6.000000 0.500000 7000 8.09 2
i2 6.500000 1.000000 7000 8.02 2
i2 7.500000 1.000000 7000 8.02 2
i2 13.500000 1.000000 7000 8.00 2
i2 14.500000 1.000000 7000 8.00 2
i2 8.500000 1.000000 7000 8.02 2
i2 9.500000 0.500000 7000 8.07 2
i2 10.000000 0.500000 7000 8.09 2
i2 10.500000 1.000000 7000 8.02 2
i2 11.500000 1.000000 7000 8.02 2
i2 3.500000 1.000000 7000 8.02 2
i2 4.500000 1.000000 7000 8.02 2
i2 5.500000 0.500000 7000 8.07 2
i2 6.000000 0.500000 7000 8.09 2
i2 15.500000 0.500000 7000 8.05 2
i2 16.000000 0.500000 7000 8.05 2
i2 16.500000 0.500000 7000 8.05 2
;Instrument harmony
i2 11.500000 1.000000 7000 8.00 2
i2 12.500000 1.000000 7000 8.00 2
i2 13.500000 1.000000 7000 8.00 2
i2 14.500000 1.000000 7000 8.00 2
i2 15.500000 0.500000 7000 8.05 2
i2 16.000000 0.500000 7000 8.05 2
i2 6.500000 1.000000 7000 8.02 2
i2 7.500000 1.000000 7000 8.02 2
i2 8.500000 1.000000 7000 8.02 2
i2 9.500000 0.500000 7000 8.07 2
i2 16.500000 0.500000 7000 8.05 2
i2 10.000000 0.500000 7000 8.09 2
i2 10.500000 1.000000 7000 8.02 2
i2 11.500000 1.000000 7000 8.02 2
; Subsection outro