Last active 1744895419

Revision 2f3c15bf16dd2fbeb7fd2f388d7cc42bf23c0cca

midigen.py Raw
1# sudo apt install python3-MIDIUtil
2from midiutil import MIDIFile
3
4name = "Generate Midi"
5keys = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
6track = 0
7time = 0 # In beats
8channel = 0
9semibreve = 4 # In beats
10seminima = 1 # In beats
11colcheia = 0.5 # In beats
12volume = 100 # 0-127, as per the MIDI standard
13tempo = 120 # In BPM
14step = 48
15
16def 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
31def 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
44def 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
58def 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
74def 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
92def 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
113def 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
132def 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
143def 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
159def 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
187def 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
221def 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
234def 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
245mf = 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
271name = "Naquela Mesa"
272acordes = ['Am', 'Am', 'Am', 'Dm', 'Dm', 'Dm', 'Dm', 'Am', 'Am', 'Am', 'A', 'Dm', 'Dm', 'Am', 'E', 'Am']
273mf.addTempo(track, time, 100)
274
275gerar_bateria1(acordes,mf)
276gerar_bateria2(acordes,mf)
277gerar_percussao(acordes,mf)
278gerar_percussao2(acordes,mf)
279gerar_tonica(acordes,mf)
280gerar_quinta(acordes,mf)
281gerar_terca(acordes,mf)
282gerar_acordes(acordes,mf)
283gerar_reaggae(acordes,mf)
284gerar_pedal(acordes,mf)
285gerar_baixo1(acordes,mf)
286gerar_baixo2(acordes,mf)
287gerar_baixo3(acordes,mf)
288with open(name + ".mid", "wb") as output_file:
289 mf.writeFile(output_file)