fls revised this gist . Go to revision
1 file changed, 289 insertions
midigen.py(file created)
@@ -0,0 +1,289 @@ | |||
1 | + | # sudo apt install python3-MIDIUtil | |
2 | + | from midiutil import MIDIFile | |
3 | + | ||
4 | + | name = "Generate Midi" | |
5 | + | keys = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'] | |
6 | + | track = 0 | |
7 | + | time = 0 # In beats | |
8 | + | channel = 0 | |
9 | + | semibreve = 4 # In beats | |
10 | + | seminima = 1 # In beats | |
11 | + | colcheia = 0.5 # In beats | |
12 | + | volume = 100 # 0-127, as per the MIDI standard | |
13 | + | tempo = 120 # In BPM | |
14 | + | step = 48 | |
15 | + | ||
16 | + | def gerar_pedal(acordes, mf): | |
17 | + | global track, channel, time, duration, volume | |
18 | + | mf.addTrackName(track, time, "Pedal") | |
19 | + | for i, chord in enumerate(acordes): | |
20 | + | pitch = keys.index(chord[:1],0) + step | |
21 | + | if (chord[1:2] == '#'): | |
22 | + | pitch = pitch + 1 | |
23 | + | if (chord[1:2] == 'b'): | |
24 | + | pitch = pitch - 1 | |
25 | + | mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume) | |
26 | + | mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume) | |
27 | + | mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume) | |
28 | + | mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume) | |
29 | + | track = track + 1 | |
30 | + | ||
31 | + | def gerar_tonica(acordes, mf): | |
32 | + | global track, channel, time, duration, volume | |
33 | + | mf.addTrackName(track, time, "Tonica") | |
34 | + | for i, chord in enumerate(acordes): | |
35 | + | pitch = keys.index(chord[:1],0) + step + 36 | |
36 | + | if (chord[1:2] == '#'): | |
37 | + | pitch = pitch + 1 | |
38 | + | if (chord[1:2] == 'b'): | |
39 | + | pitch = pitch - 1 | |
40 | + | print("Tônica: ", chord, pitch) | |
41 | + | mf.addNote(track, channel, pitch, i*4, semibreve, volume) | |
42 | + | track = track + 1 | |
43 | + | ||
44 | + | def gerar_quinta(acordes, mf): | |
45 | + | global track, channel, time, duration, volume | |
46 | + | mf.addTrackName(track, time, "Quinta") | |
47 | + | for i, chord in enumerate(acordes): | |
48 | + | pitch = keys.index(chord[:1],0) + step + 36 | |
49 | + | if (chord[1:2] == '#'): | |
50 | + | pitch = pitch + 1 | |
51 | + | if (chord[1:2] == 'b'): | |
52 | + | pitch = pitch - 1 | |
53 | + | pitch = pitch + 7 | |
54 | + | print("Quinta: ", chord, pitch) | |
55 | + | mf.addNote(track, channel, pitch, i*4, semibreve, volume) | |
56 | + | track = track + 1 | |
57 | + | ||
58 | + | def gerar_terca(acordes, mf): | |
59 | + | global track, channel, time, duration, volume | |
60 | + | mf.addTrackName(track, time, "Terca") | |
61 | + | for i, chord in enumerate(acordes): | |
62 | + | pitch = keys.index(chord[:1],0) + step + 36 | |
63 | + | if (chord[1:2] == '#'): | |
64 | + | pitch = pitch + 1 | |
65 | + | if (chord[1:2] == 'b'): | |
66 | + | pitch = pitch - 1 | |
67 | + | pitch = pitch + 4 | |
68 | + | if ("m" in chord): | |
69 | + | pitch = pitch - 1 | |
70 | + | print("terça: ", chord, pitch) | |
71 | + | mf.addNote(track, channel, pitch, i*4, semibreve, volume) | |
72 | + | track = track + 1 | |
73 | + | ||
74 | + | def gerar_acordes(acordes, mf): | |
75 | + | global track, channel, time, duration, volume | |
76 | + | mf.addTrackName(track, time, "acordes") | |
77 | + | for i, chord in enumerate(acordes): | |
78 | + | pitch = keys.index(chord[:1],0) + step + 24 | |
79 | + | if (chord[1:2] == '#'): | |
80 | + | pitch = pitch + 1 | |
81 | + | if (chord[1:2] == 'b'): | |
82 | + | pitch = pitch - 1 | |
83 | + | mf.addNote(track, channel, pitch, i*4, semibreve, volume) | |
84 | + | quinta = pitch + 7 | |
85 | + | mf.addNote(track, channel, quinta, i*4, semibreve, volume) | |
86 | + | terca = pitch + 4 | |
87 | + | if ("m" in chord): | |
88 | + | terca = terca - 1 | |
89 | + | mf.addNote(track, channel, terca, i*4, semibreve, volume) | |
90 | + | track = track + 1 | |
91 | + | ||
92 | + | def gerar_reaggae(acordes, mf): | |
93 | + | global track, channel, time, duration, volume | |
94 | + | mf.addTrackName(track, time, "reggae") | |
95 | + | for i, chord in enumerate(acordes): | |
96 | + | pitch = keys.index(chord[:1],0) + step + 24 | |
97 | + | if (chord[1:2] == '#'): | |
98 | + | pitch = pitch + 1 | |
99 | + | if (chord[1:2] == 'b'): | |
100 | + | pitch = pitch - 1 | |
101 | + | quinta = pitch + 7 | |
102 | + | terca = pitch + 4 | |
103 | + | if ("m" in chord): | |
104 | + | terca = terca - 1 | |
105 | + | mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume) | |
106 | + | mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume) | |
107 | + | mf.addNote(track, channel, terca, i*4 + 1, seminima, volume) | |
108 | + | mf.addNote(track, channel, terca, i*4 + 3, seminima, volume) | |
109 | + | mf.addNote(track, channel, quinta, i*4 + 1, seminima, volume) | |
110 | + | mf.addNote(track, channel, quinta, i*4 + 3, seminima, volume) | |
111 | + | track = track + 1 | |
112 | + | ||
113 | + | def gerar_baixo1(acordes, mf): | |
114 | + | global track, channel, time, duration, volume | |
115 | + | mf.addTrackName(track, time, "Baixo1") | |
116 | + | for i, chord in enumerate(acordes): | |
117 | + | pitch = keys.index(chord[:1],0) + step + 12 | |
118 | + | if (chord[1:2] == '#'): | |
119 | + | pitch = pitch + 1 | |
120 | + | if (chord[1:2] == 'b'): | |
121 | + | pitch = pitch - 1 | |
122 | + | quinta = pitch + 7 | |
123 | + | terca = pitch + 4 | |
124 | + | if ("m" in chord): | |
125 | + | terca = terca - 1 | |
126 | + | mf.addNote(track, channel, pitch, i*4 + 0, seminima + colcheia, volume) | |
127 | + | mf.addNote(track, channel, terca, i*4 + 1.5, colcheia, volume) | |
128 | + | mf.addNote(track, channel, quinta, i*4 + 2, seminima, volume) | |
129 | + | mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume) | |
130 | + | track = track + 1 | |
131 | + | ||
132 | + | def gerar_baixo2(acordes, mf): | |
133 | + | global track, channel, time, duration, volume | |
134 | + | mf.addTrackName(track, time, "Baixo2") | |
135 | + | for i, chord in enumerate(acordes): | |
136 | + | pitch = keys.index(chord[:1],0) + step + 12 | |
137 | + | mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume) | |
138 | + | mf.addNote(track, channel, pitch + 7, i*4 + 1, seminima, volume) | |
139 | + | mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume) | |
140 | + | mf.addNote(track, channel, pitch + 7, i*4 + 3, seminima, volume) | |
141 | + | track = track + 1 | |
142 | + | ||
143 | + | def gerar_baixo3(acordes, mf): | |
144 | + | global track, channel, time, duration, volume | |
145 | + | mf.addTrackName(track, time, "Baixo3") | |
146 | + | for i, chord in enumerate(acordes): | |
147 | + | pitch = keys.index(chord[:1],0) + step + 12 | |
148 | + | mf.addNote(track, channel, pitch, i*4 + 0, colcheia, volume) | |
149 | + | mf.addNote(track, channel, pitch + 7, i*4 + 0.5, colcheia, volume) | |
150 | + | mf.addNote(track, channel, pitch, i*4 + 1, colcheia, volume) | |
151 | + | mf.addNote(track, channel, pitch + 7, i*4 + 1.5, colcheia, volume) | |
152 | + | mf.addNote(track, channel, pitch, i*4 + 2, colcheia, volume) | |
153 | + | mf.addNote(track, channel, pitch + 7, i*4 + 2.5, colcheia, volume) | |
154 | + | mf.addNote(track, channel, pitch, i*4 + 3, colcheia, volume) | |
155 | + | mf.addNote(track, channel, pitch + 7, i*4 + 3.5, colcheia, volume) | |
156 | + | track = track + 1 | |
157 | + | ||
158 | + | ||
159 | + | def gerar_bateria1(acordes, mf): | |
160 | + | global track, channel, time, duration, volume | |
161 | + | mf.addTrackName(track, time, "Bateria1") | |
162 | + | # Bumbo | |
163 | + | mf.addNote(track, channel, 48, 0, seminima, volume) | |
164 | + | mf.addNote(track, channel, 48, 4, seminima, volume) | |
165 | + | # Caixa | |
166 | + | mf.addNote(track, channel, 53, 2, seminima, volume) | |
167 | + | mf.addNote(track, channel, 53, 6, seminima, volume) | |
168 | + | # Cimbal | |
169 | + | mf.addNote(track, channel, 60, 0, colcheia, volume + 10) | |
170 | + | mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10) | |
171 | + | mf.addNote(track, channel, 60, 1, colcheia, volume) | |
172 | + | mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10) | |
173 | + | mf.addNote(track, channel, 61, 2, colcheia, volume - 10) | |
174 | + | mf.addNote(track, channel, 60, 2.5, colcheia, volume) | |
175 | + | mf.addNote(track, channel, 61, 3, colcheia, volume + 10) | |
176 | + | mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10) | |
177 | + | mf.addNote(track, channel, 60, 4, colcheia, volume - 10) | |
178 | + | mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10) | |
179 | + | mf.addNote(track, channel, 60, 5, colcheia, volume) | |
180 | + | mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10) | |
181 | + | mf.addNote(track, channel, 62, 6, colcheia, volume + 10) | |
182 | + | mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10) | |
183 | + | mf.addNote(track, channel, 61, 7, colcheia, volume - 10) | |
184 | + | mf.addNote(track, channel, 62, 7.5, colcheia, volume) | |
185 | + | track = track + 1 | |
186 | + | ||
187 | + | def gerar_bateria2(acordes, mf): | |
188 | + | global track, channel, time, duration, volume | |
189 | + | mf.addTrackName(track, time, "Bateria2") | |
190 | + | # Bumbo | |
191 | + | mf.addNote(track, channel, 48, 0, seminima, volume) | |
192 | + | mf.addNote(track, channel, 48, 2, colcheia, volume) | |
193 | + | mf.addNote(track, channel, 48, 2.5, colcheia, volume) | |
194 | + | mf.addNote(track, channel, 48, 4, seminima, volume) | |
195 | + | mf.addNote(track, channel, 48, 6, colcheia, volume) | |
196 | + | mf.addNote(track, channel, 48, 6.5, colcheia, volume) | |
197 | + | # Caixa | |
198 | + | mf.addNote(track, channel, 53, 1, seminima, volume) | |
199 | + | mf.addNote(track, channel, 53, 3, seminima, volume) | |
200 | + | mf.addNote(track, channel, 53, 5, seminima, volume) | |
201 | + | mf.addNote(track, channel, 53, 7, seminima, volume) | |
202 | + | # Cimbal | |
203 | + | mf.addNote(track, channel, 60, 0, colcheia, volume + 10) | |
204 | + | mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10) | |
205 | + | mf.addNote(track, channel, 60, 1, colcheia, volume) | |
206 | + | mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10) | |
207 | + | mf.addNote(track, channel, 61, 2, colcheia, volume - 10) | |
208 | + | mf.addNote(track, channel, 60, 2.5, colcheia, volume) | |
209 | + | mf.addNote(track, channel, 61, 3, colcheia, volume + 10) | |
210 | + | mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10) | |
211 | + | mf.addNote(track, channel, 60, 4, colcheia, volume - 10) | |
212 | + | mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10) | |
213 | + | mf.addNote(track, channel, 60, 5, colcheia, volume) | |
214 | + | mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10) | |
215 | + | mf.addNote(track, channel, 62, 6, colcheia, volume + 10) | |
216 | + | mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10) | |
217 | + | mf.addNote(track, channel, 61, 7, colcheia, volume - 10) | |
218 | + | mf.addNote(track, channel, 62, 7.5, colcheia, volume) | |
219 | + | track = track + 1 | |
220 | + | ||
221 | + | def gerar_percussao(acordes, mf): | |
222 | + | global track, channel, time, duration, volume | |
223 | + | mf.addTrackName(track, time, "Percussao") | |
224 | + | # Bumbo | |
225 | + | mf.addNote(track, channel, 72, 0, seminima, volume) | |
226 | + | mf.addNote(track, channel, 73, 0.5, seminima, volume) | |
227 | + | mf.addNote(track, channel, 73, 3, seminima, volume) | |
228 | + | mf.addNote(track, channel, 72, 3.5, seminima, volume) | |
229 | + | mf.addNote(track, channel, 73, 5, seminima, volume) | |
230 | + | mf.addNote(track, channel, 72, 5.5, seminima, volume) | |
231 | + | mf.addNote(track, channel, 72, 6.5, seminima, volume) | |
232 | + | track = track + 1 | |
233 | + | ||
234 | + | def gerar_percussao2(acordes, mf): | |
235 | + | global track, channel, time, duration, volume | |
236 | + | mf.addTrackName(track, time, "Percussao 2") | |
237 | + | # Bumbo | |
238 | + | mf.addNote(track, channel, 77, 0.5, colcheia, volume) | |
239 | + | mf.addNote(track, channel, 78, 1.5, colcheia, volume) | |
240 | + | mf.addNote(track, channel, 79, 2, colcheia, volume) | |
241 | + | mf.addNote(track, channel, 77, 2.5, colcheia, volume) | |
242 | + | mf.addNote(track, channel, 79, 3, colcheia, volume) | |
243 | + | track = track + 1 | |
244 | + | ||
245 | + | mf = MIDIFile(13, deinterleave=True) # One track, defaults to format 1 (tempo track is created | |
246 | + | ||
247 | + | # name = "Alagados" | |
248 | + | # acordes = ['A', 'A', 'E', 'D'] | |
249 | + | # mf.addTempo(track, time, 200) | |
250 | + | ||
251 | + | # name = "Vapor Barato" | |
252 | + | # acordes = ['Am', 'Am', 'G', 'G', 'F', 'F', 'Dm', 'E'] | |
253 | + | # mf.addTempo(track, time, 132) | |
254 | + | ||
255 | + | # name = "Hey Joe" | |
256 | + | # acordes = ['C', 'G', 'D', 'A', 'E', 'E', 'E', 'E'] | |
257 | + | # mf.addTempo(track, time, 132) | |
258 | + | ||
259 | + | # name = "Ainda é cedo" | |
260 | + | # acordes = ['Dm', 'C', 'Am', 'Am'] | |
261 | + | # mf.addTempo(track, time, 132) | |
262 | + | ||
263 | + | # name = "Creep" | |
264 | + | # acordes = ['G', 'G', 'B', 'B', 'C', 'C', 'Cm', 'Cm'] | |
265 | + | # mf.addTempo(track, time, 100) | |
266 | + | ||
267 | + | # name = "Não chores mais" | |
268 | + | # acordes = ['C', 'G', 'Am', 'F'] | |
269 | + | # mf.addTempo(track, time, 100) | |
270 | + | ||
271 | + | name = "Naquela Mesa" | |
272 | + | acordes = ['Am', 'Am', 'Am', 'Dm', 'Dm', 'Dm', 'Dm', 'Am', 'Am', 'Am', 'A', 'Dm', 'Dm', 'Am', 'E', 'Am'] | |
273 | + | mf.addTempo(track, time, 100) | |
274 | + | ||
275 | + | gerar_bateria1(acordes,mf) | |
276 | + | gerar_bateria2(acordes,mf) | |
277 | + | gerar_percussao(acordes,mf) | |
278 | + | gerar_percussao2(acordes,mf) | |
279 | + | gerar_tonica(acordes,mf) | |
280 | + | gerar_quinta(acordes,mf) | |
281 | + | gerar_terca(acordes,mf) | |
282 | + | gerar_acordes(acordes,mf) | |
283 | + | gerar_reaggae(acordes,mf) | |
284 | + | gerar_pedal(acordes,mf) | |
285 | + | gerar_baixo1(acordes,mf) | |
286 | + | gerar_baixo2(acordes,mf) | |
287 | + | gerar_baixo3(acordes,mf) | |
288 | + | with open(name + ".mid", "wb") as output_file: | |
289 | + | mf.writeFile(output_file) |
Newer
Older