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
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
|
#!/usr/bin/env python
from __future__ import division
import ipdb
import os
import random
import sys
import time
from midiutil.MidiFile import MIDIFile as midifile
import parse
import topsort
import yaml
import tree
random.seed(time.time())
mymidi = midifile(15)
def main():
composition = {
"intro": {
"body": {
"lead_instr": { # Instrument 'melody'
"channel": 6,
"octave": 4,
"duration": 30,
"grammars": { # Notes for this instrument to use in this piece
"u": ["A/2, B/2, C/2 D/2 (u)", "D2' D2' D2' D2' (x)"],
"v": ["C/2 C/2 C/2 C/2 (w)"],
"w": ["E/2 F/2 E/2 F/2 (u)"],
"x": ["z4 (v)"],
},
},
"follow_instr": { # Instrument 'bass'
"channel": 4,
"sync": "lead_instr",
"octave": 2,
"duration": 30,
"grammars": { # Notes for this instrument to use in this piece
"u": ["E F G E (v)"],
"v": ["G A A A (e)", "G A A A (v)"],
"e": ["B A G A (u)"],
"x": ["z4 (e)"],
},
},
},
},
}
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 ["intro"]:
print "; Section " + section
subsection_start = section_start
section = composition[section]
for subsection in ["intro", "body", "outro"]:
try:
print "; Subsection " + subsection
subsection = section[subsection]
unordered_instrs = []
for instr in subsection:
subsection[instr]["name"] = instr
if not "sync" in subsection[instr].keys():
subsection[instr]["sync"] = None
unordered_instrs.append([subsection[instr]["sync"], instr])
ordered_instrs = topsort.topsort(unordered_instrs)
ordered_instrs.remove(None) # None used as a placeholder for sort order for instruments with no sync setting
instrs = []
syncs = {}
track = 0
for instr in ordered_instrs:
print ";Instrument " + instr
instr = subsection[instr]
max_time = instr["duration"]
instr_score, syncs = render_instr(instr, syncs, max_time)
instrs.append(instr_score)
midify_instr_score(instr_score, track, instr["channel"], subsection_start)
longest_score = max(instrs, key=lambda i: score_len(i))
subsection_start += score_len(longest_score)
|
|
|
|
|
|
|
<
|
|
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
|
<
<
<
<
<
|
|
|
|
|
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
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
99
|
#!/usr/bin/env python
from __future__ import division
#import ipdb
import os
import random
import sys
import time
from midiutil.MidiFile import MIDIFile as midifile
import parse
import topsort
import yaml
import tree
random.seed(time.time())
mymidi = midifile(15)
def main():
composition = {
"intro": {
"body": {
"lead_instr": { # Instrument 'melody'
"channel": 8,
"octave": 5,
"duration": 60,
"grammars": { # Notes for this instrument to use in this piece
"u": ["C2' B2 A3 D3 B C' D C2' z (u)", "C2' C2' C2' C2' (x)"],
"v": ["G2 F2 E2 F2 D5 (u)", "B/4 C/4' B/4 A/4 D2 z"],
"x": ["z4 (v)"],
},
},
"follow_instr": { # Instrument 'bass'
"channel": 4,
"sync": "lead_instr",
"octave": 2,
"duration": 60,
"grammars": { # Notes for this instrument to use in this piece
"u": ["C/2 C/2 C/2 z/2 (u)"],
},
},
},
},
"section1": {
"body": {
"lead_instr": { # Instrument 'melody'
"channel": 6,
"octave": 5,
"duration": 60,
"grammars": { # Notes for this instrument to use in this piece
"u": ["C E A F G z (u)", "C E A F G z (v)"],
"v": ["A/2 D/2 G/2 C/2 | F/2 B/2 E/2 z/2 | (u)"],
},
},
"follow_instr": { # Instrument 'bass'
"channel": 4,
"sync": "lead_instr",
"octave": 2,
"duration": 60,
"grammars": { # Notes for this instrument to use in this piece
"u": ["C/2 C/2 C/2 z/2 (u)"],
},
},
},
},
}
section_start = 0
for section in ["intro", "section1"]:
print "Section " + section
subsection_start = section_start
section = composition[section]
for subsection in ["intro", "body", "outro"]:
try:
print "Subsection " + subsection
subsection = section[subsection]
unordered_instrs = []
for instr in subsection:
subsection[instr]["name"] = instr
if not "sync" in subsection[instr].keys():
subsection[instr]["sync"] = None
unordered_instrs.append([subsection[instr]["sync"], instr])
ordered_instrs = topsort.topsort(unordered_instrs)
ordered_instrs.remove(None) # None used as a placeholder for sort order for instruments with no sync setting
instrs = []
syncs = {}
track = 0
for instr in ordered_instrs:
print "Instrument " + instr
instr = subsection[instr]
max_time = instr["duration"]
instr_score, syncs = render_instr(instr, syncs, max_time)
instrs.append(instr_score)
midify_instr_score(instr_score, track, instr["channel"], subsection_start)
longest_score = max(instrs, key=lambda i: score_len(i))
subsection_start += score_len(longest_score)
|