295 lines
10 KiB
Python
295 lines
10 KiB
Python
---
|
|
author: "Flávio Schiavoni"
|
|
description:
|
|
---
|
|
|
|
# sudo apt install python3-MIDIUtil
|
|
from midiutil import MIDIFile
|
|
|
|
name = "Generate Midi"
|
|
keys = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
|
|
track = 0
|
|
time = 0 # In beats
|
|
channel = 0
|
|
semibreve = 4 # In beats
|
|
seminima = 1 # In beats
|
|
colcheia = 0.5 # In beats
|
|
volume = 100 # 0-127, as per the MIDI standard
|
|
tempo = 120 # In BPM
|
|
step = 48
|
|
|
|
def gerar_pedal(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Pedal")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
|
track = track + 1
|
|
|
|
def gerar_tonica(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Tonica")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 36
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
print("Tônica: ", chord, pitch)
|
|
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
|
track = track + 1
|
|
|
|
def gerar_quinta(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Quinta")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 36
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
pitch = pitch + 7
|
|
print("Quinta: ", chord, pitch)
|
|
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
|
track = track + 1
|
|
|
|
def gerar_terca(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Terca")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 36
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
pitch = pitch + 4
|
|
if ("m" in chord):
|
|
pitch = pitch - 1
|
|
print("terça: ", chord, pitch)
|
|
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
|
track = track + 1
|
|
|
|
def gerar_acordes(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "acordes")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 24
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
mf.addNote(track, channel, pitch, i*4, semibreve, volume)
|
|
quinta = pitch + 7
|
|
mf.addNote(track, channel, quinta, i*4, semibreve, volume)
|
|
terca = pitch + 4
|
|
if ("m" in chord):
|
|
terca = terca - 1
|
|
mf.addNote(track, channel, terca, i*4, semibreve, volume)
|
|
track = track + 1
|
|
|
|
def gerar_reaggae(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "reggae")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 24
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
quinta = pitch + 7
|
|
terca = pitch + 4
|
|
if ("m" in chord):
|
|
terca = terca - 1
|
|
mf.addNote(track, channel, pitch, i*4 + 1, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
|
mf.addNote(track, channel, terca, i*4 + 1, seminima, volume)
|
|
mf.addNote(track, channel, terca, i*4 + 3, seminima, volume)
|
|
mf.addNote(track, channel, quinta, i*4 + 1, seminima, volume)
|
|
mf.addNote(track, channel, quinta, i*4 + 3, seminima, volume)
|
|
track = track + 1
|
|
|
|
def gerar_baixo1(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Baixo1")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 12
|
|
if (chord[1:2] == '#'):
|
|
pitch = pitch + 1
|
|
if (chord[1:2] == 'b'):
|
|
pitch = pitch - 1
|
|
quinta = pitch + 7
|
|
terca = pitch + 4
|
|
if ("m" in chord):
|
|
terca = terca - 1
|
|
mf.addNote(track, channel, pitch, i*4 + 0, seminima + colcheia, volume)
|
|
mf.addNote(track, channel, terca, i*4 + 1.5, colcheia, volume)
|
|
mf.addNote(track, channel, quinta, i*4 + 2, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 3, seminima, volume)
|
|
track = track + 1
|
|
|
|
def gerar_baixo2(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Baixo2")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 12
|
|
mf.addNote(track, channel, pitch, i*4 + 0, seminima, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 1, seminima, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 2, seminima, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 3, seminima, volume)
|
|
track = track + 1
|
|
|
|
def gerar_baixo3(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Baixo3")
|
|
for i, chord in enumerate(acordes):
|
|
pitch = keys.index(chord[:1],0) + step + 12
|
|
mf.addNote(track, channel, pitch, i*4 + 0, colcheia, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 0.5, colcheia, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 1, colcheia, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 1.5, colcheia, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 2, colcheia, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 2.5, colcheia, volume)
|
|
mf.addNote(track, channel, pitch, i*4 + 3, colcheia, volume)
|
|
mf.addNote(track, channel, pitch + 7, i*4 + 3.5, colcheia, volume)
|
|
track = track + 1
|
|
|
|
|
|
def gerar_bateria1(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Bateria1")
|
|
# Bumbo
|
|
mf.addNote(track, channel, 48, 0, seminima, volume)
|
|
mf.addNote(track, channel, 48, 4, seminima, volume)
|
|
# Caixa
|
|
mf.addNote(track, channel, 53, 2, seminima, volume)
|
|
mf.addNote(track, channel, 53, 6, seminima, volume)
|
|
# Cimbal
|
|
mf.addNote(track, channel, 60, 0, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 1, colcheia, volume)
|
|
mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 61, 2, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 2.5, colcheia, volume)
|
|
mf.addNote(track, channel, 61, 3, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 4, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 60, 5, colcheia, volume)
|
|
mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 62, 6, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 61, 7, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 62, 7.5, colcheia, volume)
|
|
track = track + 1
|
|
|
|
def gerar_bateria2(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Bateria2")
|
|
# Bumbo
|
|
mf.addNote(track, channel, 48, 0, seminima, volume)
|
|
mf.addNote(track, channel, 48, 2, colcheia, volume)
|
|
mf.addNote(track, channel, 48, 2.5, colcheia, volume)
|
|
mf.addNote(track, channel, 48, 4, seminima, volume)
|
|
mf.addNote(track, channel, 48, 6, colcheia, volume)
|
|
mf.addNote(track, channel, 48, 6.5, colcheia, volume)
|
|
# Caixa
|
|
mf.addNote(track, channel, 53, 1, seminima, volume)
|
|
mf.addNote(track, channel, 53, 3, seminima, volume)
|
|
mf.addNote(track, channel, 53, 5, seminima, volume)
|
|
mf.addNote(track, channel, 53, 7, seminima, volume)
|
|
# Cimbal
|
|
mf.addNote(track, channel, 60, 0, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 61, 0.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 1, colcheia, volume)
|
|
mf.addNote(track, channel, 62, 1.5, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 61, 2, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 2.5, colcheia, volume)
|
|
mf.addNote(track, channel, 61, 3, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 62, 3.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 60, 4, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 61, 4.5, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 60, 5, colcheia, volume)
|
|
mf.addNote(track, channel, 61, 5.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 62, 6, colcheia, volume + 10)
|
|
mf.addNote(track, channel, 60, 6.5, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 61, 7, colcheia, volume - 10)
|
|
mf.addNote(track, channel, 62, 7.5, colcheia, volume)
|
|
track = track + 1
|
|
|
|
def gerar_percussao(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Percussao")
|
|
# Bumbo
|
|
mf.addNote(track, channel, 72, 0, seminima, volume)
|
|
mf.addNote(track, channel, 73, 0.5, seminima, volume)
|
|
mf.addNote(track, channel, 73, 3, seminima, volume)
|
|
mf.addNote(track, channel, 72, 3.5, seminima, volume)
|
|
mf.addNote(track, channel, 73, 5, seminima, volume)
|
|
mf.addNote(track, channel, 72, 5.5, seminima, volume)
|
|
mf.addNote(track, channel, 72, 6.5, seminima, volume)
|
|
track = track + 1
|
|
|
|
def gerar_percussao2(acordes, mf):
|
|
global track, channel, time, duration, volume
|
|
mf.addTrackName(track, time, "Percussao 2")
|
|
# Bumbo
|
|
mf.addNote(track, channel, 77, 0.5, colcheia, volume)
|
|
mf.addNote(track, channel, 78, 1.5, colcheia, volume)
|
|
mf.addNote(track, channel, 79, 2, colcheia, volume)
|
|
mf.addNote(track, channel, 77, 2.5, colcheia, volume)
|
|
mf.addNote(track, channel, 79, 3, colcheia, volume)
|
|
track = track + 1
|
|
|
|
mf = MIDIFile(13, deinterleave=True) # One track, defaults to format 1 (tempo track is created
|
|
|
|
# name = "Alagados"
|
|
# acordes = ['A', 'A', 'E', 'D']
|
|
# mf.addTempo(track, time, 200)
|
|
|
|
# name = "Vapor Barato"
|
|
# acordes = ['Am', 'Am', 'G', 'G', 'F', 'F', 'Dm', 'E']
|
|
# mf.addTempo(track, time, 132)
|
|
|
|
# name = "Hey Joe"
|
|
# acordes = ['C', 'G', 'D', 'A', 'E', 'E', 'E', 'E']
|
|
# mf.addTempo(track, time, 132)
|
|
|
|
# name = "Ainda é cedo"
|
|
# acordes = ['Dm', 'C', 'Am', 'Am']
|
|
# mf.addTempo(track, time, 132)
|
|
|
|
# name = "Creep"
|
|
# acordes = ['G', 'G', 'B', 'B', 'C', 'C', 'Cm', 'Cm']
|
|
# mf.addTempo(track, time, 100)
|
|
|
|
# name = "Não chores mais"
|
|
# acordes = ['C', 'G', 'Am', 'F']
|
|
# mf.addTempo(track, time, 100)
|
|
|
|
name = "Naquela Mesa"
|
|
acordes = ['Am', 'Am', 'Am', 'Dm', 'Dm', 'Dm', 'Dm', 'Am', 'Am', 'Am', 'A', 'Dm', 'Dm', 'Am', 'E', 'Am']
|
|
mf.addTempo(track, time, 100)
|
|
|
|
gerar_bateria1(acordes,mf)
|
|
gerar_bateria2(acordes,mf)
|
|
gerar_percussao(acordes,mf)
|
|
gerar_percussao2(acordes,mf)
|
|
gerar_tonica(acordes,mf)
|
|
gerar_quinta(acordes,mf)
|
|
gerar_terca(acordes,mf)
|
|
gerar_acordes(acordes,mf)
|
|
gerar_reaggae(acordes,mf)
|
|
gerar_pedal(acordes,mf)
|
|
gerar_baixo1(acordes,mf)
|
|
gerar_baixo2(acordes,mf)
|
|
gerar_baixo3(acordes,mf)
|
|
with open(name + ".mid", "wb") as output_file:
|
|
mf.writeFile(output_file)
|