exemplos-compmus/_examples/python/midigen.py

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)