Last active 1744895419

fls revised this gist 1744895418. 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