spiffyscore

Check-in [f02f66468f]
Login

Check-in [f02f66468f]

Overview
Comment:Now supports minor chords
Timelines: family | ancestors | descendants | both | tld
Files: files | file ages | folders
SHA1: f02f66468f3954b37cc4ffd28fce21ead388e225
User & Date: spiffytech@gmail.com on 2010-11-17 05:32:12
Other Links: branch diff | manifest | tags
Context
2010-11-17
06:27
TLD now accepts ordering of movements. Also, fixed bug that caused all movements and instruments to play simultaneously. check-in: db1df2f460 user: spiffytech@gmail.com tags: tld
05:32
Now supports minor chords check-in: f02f66468f user: spiffytech@gmail.com tags: tld
00:07
Added support for top-down composition check-in: 7c7ce6adb8 user: spiffytech@gmail.com tags: tld
Changes

Modified cfg.py from [f6edc4689f] to [79cec58b40].

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import parse

def main():
    key = "A"

    composition = {
        "a": {  # Movement block 'a' for reuse throughout the piece
            "melody": {  # Instrument 'melody'
                "csound_parameters": {
                    "instrument": 1,
                },
                "grammars": {  # Notes for this instrument to use in this piece
                    "u": ["I V V V I I IV u u", "I IV u u", "I VII IV u u"  , "e"],
                    "e": [""],
                },
                "score": "u u u",
            },
            "rhythm": {
                "csound_parameters": {
                    "instrument": 1,
                },
                "grammars": {
                    "u": ['"I" "IV"/2 "V"2 "IV" "I" u u', '"I" "VII" "IV" u u', '"I" "V" "IV" u u', "e"],

                    "e": [""]
                },
                "score": "u u u",
            },
        },
        "b": {
            "melody": {  # Instrument 'melody'
                "csound_parameters": {
                    "instrument": 1,
                },
                "grammars": {  # Notes for this instrument to use in this piece
                    "u": ["I V I I/2 IV/2 u u", "I4 IV u u", "I IV IV VI V u u"  , "e"],
                    "e": [""],
                },
                "score": "u u u",
            },
            "rhythm": {
                "csound_parameters": {
                    "instrument": 1,
                },
                "grammars": {
                    "u": ['"I" "IV"/2 "V"2 "IV" "I" u u', '"I" "VII" "IV" u u', '"I" "V" "IV" u u', "e"],
                    "e": [""]
                },
                "score": "u u u",
            },
        },
    }

    for comp_name, comp in composition.iteritems():
        for instr_name, instr in comp.iteritems():
            generated_score = generate_score(instr["score"], instr["grammars"])  # Fill in the scores by generating them based on the grammars
#                composition[comp_name][instr_name][grammar]["score"] = parse.parse(generate_score)  # Return Node/Chord objects
            score = parse.parse(generated_score)  # Return Node/Chord objects







|
|
|
|
|
|
|
|
|
|





|
>





|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import parse

def main():
    key = "A"

    composition = {
        "a": {  # Movement block 'a' for reuse throughout the piece
#            "melody": {  # Instrument 'melody'
#                "csound_parameters": {
#                    "instrument": 1,
#                },
#                "grammars": {  # Notes for this instrument to use in this piece
#                    "u": ["I V V V I I IV u u", "I IV u u", "I VII IV u u"  , "e"],
#                    "e": [""],
#                },
#                "score": "u u u",
#            },
            "rhythm": {
                "csound_parameters": {
                    "instrument": 1,
                },
                "grammars": {
#                    "u": ['"I" "ii"/4 "ii"/4 "IV"/2 "V"2 "IV" "I" u u', '"I" "vii" "IV" u u', '"I" "v" "IV" u u', "e"],
                    "u": ['"i" "I" "ii" "II" "v" "V" u', "e"],
                    "e": [""]
                },
                "score": "u u u",
            },
        },
#        "b": {
#            "melody": {  # Instrument 'melody'
#                "csound_parameters": {
#                    "instrument": 1,
#                },
#                "grammars": {  # Notes for this instrument to use in this piece
#                    "u": ["I V I I/2 IV/2 u u", "I4 IV u u", "I IV IV VI V u u"  , "e"],
#                    "e": [""],
#                },
#                "score": "u u u",
#            },
#            "rhythm": {
#                "csound_parameters": {
#                    "instrument": 1,
#                },
#                "grammars": {
#                    "u": ['"I" "IV"/2 "V"2 "IV" "I" u u', '"I" "VII" "IV" u u', '"I" "V" "IV" u u', "e"],
#                    "e": [""]
#                },
#                "score": "u u u",
#            },
#        },
    }

    for comp_name, comp in composition.iteritems():
        for instr_name, instr in comp.iteritems():
            generated_score = generate_score(instr["score"], instr["grammars"])  # Fill in the scores by generating them based on the grammars
#                composition[comp_name][instr_name][grammar]["score"] = parse.parse(generate_score)  # Return Node/Chord objects
            score = parse.parse(generated_score)  # Return Node/Chord objects
125
126
127
128
129
130
131



132
133
134
135
136
137
138
139
    for i in range(len(score)):
        if isinstance(score[i], parse.Note):
            score[i].value = scale[scale_conversion[score[i].value]-1]
        else:
            chord = []
            root_note_index = scale.index(key) + scale_conversion[score[i].value]
            chord.append(scale[root_note_index])



            chord.append(scale[(root_note_index+3) % 8])
            chord.append(scale[(root_note_index+5) % 8])
            score[i].chord = chord
    return score


def generate_csound_score(score):
    csound_note_values = {







>
>
>
|







126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
    for i in range(len(score)):
        if isinstance(score[i], parse.Note):
            score[i].value = scale[scale_conversion[score[i].value]-1]
        else:
            chord = []
            root_note_index = scale.index(key) + scale_conversion[score[i].value]
            chord.append(scale[root_note_index])
            if score[i].chord_type == "m":  # Minor chords, flat the 3rd
                chord.append(scale[(root_note_index+2) % 8])
            else:
                chord.append(scale[(root_note_index+3) % 8])
            chord.append(scale[(root_note_index+5) % 8])
            score[i].chord = chord
    return score


def generate_csound_score(score):
    csound_note_values = {

Modified parse.py from [503badc6f2] to [b7fd05b171].

100
101
102
103
104
105
106


107
108
109
110
111
112
113
114
        p[0] = new_note


    def p_chord(p):
        '''chord : QUOTE pitch QUOTE
                | QUOTE pitch CHORD_TYPE QUOTE
        '''


        p[0] = Chord(value=p[2].value)
        if len(p) > 3:
            p[0].chord_type = p[3]


    def p_accidental(p):
        '''pitch : ACCIDENTAL pitch
        '''







>
>
|







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
        p[0] = new_note


    def p_chord(p):
        '''chord : QUOTE pitch QUOTE
                | QUOTE pitch CHORD_TYPE QUOTE
        '''
        pitch = p[2].value
        pitch = pitch.upper()
        p[0] = Chord(value=pitch)
        if len(p) > 3:
            p[0].chord_type = p[3]


    def p_accidental(p):
        '''pitch : ACCIDENTAL pitch
        '''

Modified test.sco from [da39a3ee5e] to [7126d43817].















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
46
47
48
49
50
51
52
53
54
55
f1  0   256 10  1 0 3   ; sine wave function table
i2 0.000000 1 7000 7.11 7.11 0 6
i2 0.000000 1 7000 7.04 7.04 0 6
i2 0.000000 1 7000 8.08 8.08 0 6
i2 1.000000 1 7000 8.11 8.11 0 6
i2 1.000000 1 7000 8.04 8.04 0 6
i2 1.000000 1 7000 8.08 8.08 0 6
i2 2.000000 1 7000 8.01 8.01 0 6
i2 2.000000 1 7000 8.06 8.06 0 6
i2 2.000000 1 7000 8.09 8.09 0 6
i2 3.000000 1 7000 7.01 7.01 0 6
i2 3.000000 1 7000 7.06 7.06 0 6
i2 3.000000 1 7000 8.09 8.09 0 6
i2 4.000000 1 7000 7.06 7.06 0 6
i2 4.000000 1 7000 7.09 7.09 0 6
i2 4.000000 1 7000 7.01 7.01 0 6
i2 5.000000 1 7000 8.06 8.06 0 6
i2 5.000000 1 7000 7.09 7.09 0 6
i2 5.000000 1 7000 7.01 7.01 0 6
i2 6.000000 1 7000 7.11 7.11 0 6
i2 6.000000 1 7000 7.04 7.04 0 6
i2 6.000000 1 7000 8.08 8.08 0 6
i2 7.000000 1 7000 8.11 8.11 0 6
i2 7.000000 1 7000 7.04 7.04 0 6
i2 7.000000 1 7000 7.08 7.08 0 6
i2 8.000000 1 7000 8.01 8.01 0 6
i2 8.000000 1 7000 8.06 8.06 0 6
i2 8.000000 1 7000 7.09 7.09 0 6
i2 9.000000 1 7000 8.01 8.01 0 6
i2 9.000000 1 7000 7.06 7.06 0 6
i2 9.000000 1 7000 8.09 8.09 0 6
i2 10.000000 1 7000 8.06 8.06 0 6
i2 10.000000 1 7000 7.09 7.09 0 6
i2 10.000000 1 7000 8.01 8.01 0 6
i2 11.000000 1 7000 8.06 8.06 0 6
i2 11.000000 1 7000 8.09 8.09 0 6
i2 11.000000 1 7000 8.01 8.01 0 6
i2 12.000000 1 7000 7.11 7.11 0 6
i2 12.000000 1 7000 7.04 7.04 0 6
i2 12.000000 1 7000 8.08 8.08 0 6
i2 13.000000 1 7000 7.11 7.11 0 6
i2 13.000000 1 7000 8.04 8.04 0 6
i2 13.000000 1 7000 7.08 7.08 0 6
i2 14.000000 1 7000 7.01 7.01 0 6
i2 14.000000 1 7000 7.06 7.06 0 6
i2 14.000000 1 7000 7.09 7.09 0 6
i2 15.000000 1 7000 8.01 8.01 0 6
i2 15.000000 1 7000 8.06 8.06 0 6
i2 15.000000 1 7000 7.09 7.09 0 6
i2 16.000000 1 7000 8.06 8.06 0 6
i2 16.000000 1 7000 8.09 8.09 0 6
i2 16.000000 1 7000 7.01 7.01 0 6
i2 17.000000 1 7000 7.06 7.06 0 6
i2 17.000000 1 7000 7.09 7.09 0 6
i2 17.000000 1 7000 7.01 7.01 0 6

Modified todo.org from [9bec386f24] to [0747c315e6].

1
2
3
4

5
6


7
8






* Features [0/5]
- [ ] Top-down composition
- [ ] Transition the melody between chords appropriately
- [ ] Set maximum song length


* Bugs [0/1]


- [ ] Doesn't handle minor chords
- [ ] Duration syntax is absolute, not relative to BPM






|
|


>

|
>
>
|

>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
* Features [1/4]
- [X] Top-down composition
- [ ] Transition the melody between chords appropriately
- [ ] Set maximum song length
- [ ] Need to support all chord types

* Bugs [1/5]
- [ ] TLD resets clock for each movement
- [ ] TLD doesn't accept an ordering for the movements
- [X] Doesn't handle minor chords
- [ ] Duration syntax is absolute, not relative to BPM
- [ ] Chords don't respect octaves


* Structure [0/2]
- [ ] Chords should be composed of Notes, not ordinary arrays
- [ ] Generate score with proper generation tools