O código implementado se baseia nos capítulos 4 e 5 do livro de Pedro Kroger, "Music for Geeks & Nerds. Learn more about music with Python and a little bit of math", cujo download está disponível aqui
Foi utilizado o Python 2.7 para executar o código apresentado abaixo:
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 16 22:16:08 2019
@author: Douglas
"""
import random
from pyknon.genmidi import Midi
from pyknon.music import NoteSeq
Duracao_da_Nota = { "2", "4", "8", "16"}
# 2 corresponde a 1/2 tempo, 4 a 1/4 tempo, 8 a 1/8 tempo e 16 a 1/16 tempo
# Criando as diferentes escalas com tonalidade em C maior natural para cada
# estilo musical
C_major = {'C', 'D', 'E', 'F', 'G', 'A', 'B'}
C_major_Blues = {'C', 'D', 'D#', 'E', 'G', 'A'}
C_major_Jazz = {'C', 'C#', 'D#', 'F', 'F#', 'G#', 'A#', 'C'}
def seq_nota_aleatoria(numnotas, escalas, Duracao_da_Nota, pausas=True):
# Adicionar uma pausa as notas da escala.
if pausas:
escalas.add('r')
essa_seq = ''
for i in range(numnotas):
escala = (random.sample(escalas, 1))
Duracao_da_Nota = (random.sample(Duracao_da_Nota, 1))
essa_seq += escala[0] + Duracao_da_Nota[0] + ' '
return NoteSeq(essa_seq)
notas_C_major = seq_nota_aleatoria(100, C_major, Duracao_da_Nota)
midi = Midi(1, tempo=140)
midi.seq_notes(notas_C_major, track=0)
midi.write("C_major.mid")
notas_C_major_Blues = seq_nota_aleatoria(100, C_major_Blues, Duracao_da_Nota)
midi = Midi(1, tempo=180)
midi.seq_notes(notas_C_major_Blues, track=0)
midi.write("C_major_Blues.mid")
notas_C_major_Jazz = seq_nota_aleatoria(100, C_major_Jazz, Duracao_da_Nota)
midi = Midi(1, tempo=190)
midi.seq_notes(notas_C_major_Jazz, track=0)
midi.write("C_major_Jazz.mid")
### Abaixo, eu consigo criar um arquivo midi contendo todas as variações
### aleatórias de estilo, ritmo, escalas enunciadas acima.
### O nome dado foi "fusion".
## classic se refere a escala de C maior natural:
classic = NoteSeq(seq_nota_aleatoria(100, C_major, Duracao_da_Nota))
## blues se refere a escala de C maior para o ritmo blues:
blues = NoteSeq(seq_nota_aleatoria(100, C_major_Blues, Duracao_da_Nota))
## jazz se refere a escala de C maior (modo dórico) para o ritmo jazz:
jazz = NoteSeq(seq_nota_aleatoria(100, C_major_Jazz, Duracao_da_Nota))
### juntando as três variações de ritmo num único arquivo midi:
midi = Midi(number_tracks=3, tempo = 120)
midi.seq_notes(classic, track=0,)
midi.seq_notes(blues, track=1)
midi.seq_notes(jazz, track=2)
midi.write("fusion.midi")
links do youtube para se ouvir as músicas aleatórias geradas a partir da implementação acima:
Música aleatória no Python - C maior natural
Música aleatória no Python - C maior Blues
Música aleatória no Python - C maior Jazz
Música aleatória no Python - C maior Fusion