spiffyscore

Check-in [f653a4fa10]
Login
Overview
SHA1:f653a4fa1046734d8b1cdf93e96149f2f5bab309
Date: 2011-09-22 18:30:17
User: brian
Comment:Added back in support for subsections
Timelines: family | ancestors | descendants | both | feature/abc
Downloads: Tarball | ZIP archive
Other Links: files | file ages | folders | manifest
Tags And Properties
Context
2011-10-11
15:19
[29231e328a] Closed-Leaf: Played around a little with melodies and instruments (user: brian, tags: feature/abc)
2011-09-22
18:30
[f653a4fa10] Added back in support for subsections (user: brian, tags: feature/abc)
18:04
[b2ce9522e9] Fixed bug that prevented more than two sections from working properly (user: brian, tags: feature/abc)
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

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
..
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import tree

random.seed(time.time())

def main():
    composition = {
        "verse1": {

            "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": {

            "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
    '''

    section_start = 0
    for section in ["verse1", "verse2"]:


        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)


        


def render_instr(instr, sync, max_time):
    grammars = instr["grammars"]
    for g in instr["grammars"]:
        for i in range(len(grammars[g])):
................................................................................
    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:
        
    else:
        phrase = random.choice(options)
    score = score[:node_index-1] + phrase + score[node_index+1:]
    return score


def score_len(score):







>
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
>

>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>







|




>
>

|
>
>
>
|
|
>
>
|
|
|
|
|
|
|
>
|
>
>







 







|







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
...
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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": ["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)"],
                    },
                },
            },
        },
    }
    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 100
    '''

    section_start = 0
    for section in ["verse1", "verse2"]:
        print "; Section " + section
        subsection_start = section_start
        section = composition[section]
        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])):
................................................................................
    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

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
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 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 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 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 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




|

>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
>
>
>
>
>
|
|
<
<
|
|
<
|
|
>
>
|
|
|
|
|
|
<
<
<
|
<
<
<
>
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 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 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 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 16.500000 0.500000 7000 8.05 2



; Subsection outro