ver/abrir - Repositório do Departamento de Ciência da Computação

Transcrição

ver/abrir - Repositório do Departamento de Ciência da Computação
Universidade de Brasília
Instituto de Ciências Exatas
Departamento de Ciência da Computação
AlgoMusica: Um Protótipo para Produção de
Melodias a partir de Algoritmos
André Marra Gonçalves Araújo
Brasília
2009
Universidade de Brasília
Instituto de Ciências Exatas
Departamento de Ciência da Computação
AlgoMusica: Um Protótipo para Produção de
Melodias a partir de Algoritmos
André Marra Gonçalves Araújo
Monografia apresentada como requisito parcial
para conclusão do Bacharelado em Ciência da Computação
Orientador
Prof. Dr. Márcio da Costa Pereira Brandão
Brasília
2009
Universidade de Brasília — UnB
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Bacharelado em Ciência da Computação
Coordenador: Prof. Dr. Marcus Vinicius Lamar
Banca examinadora composta por:
Prof. Dr. Márcio da Costa Pereira Brandão (Orientador) — CIC/UnB
Prof. Dr. Carlos Eduardo Viena de Mello — MUS/UnB
Prof. Dr. Marco Aurélio de Carvalho — CIC/UnB
CIP — Catalogação Internacional na Publicação
Araújo, André Marra Gonçalves.
AlgoMusica: Um Protótipo para Produção de Melodias a partir de
Algoritmos / André Marra Gonçalves Araújo. Brasília : UnB, 2009.
60 p. : il. ; 29,5 cm.
Monografia (Graduação) — Universidade de Brasília, Brasília,
2009.
1. composição musical, 2. composição algorítmica, 3. computação
sônica, 4. lilypond, 5. l-systems
CDU 004.4
Endereço:
Universidade de Brasília
Campus Universitário Darcy Ribeiro — Asa Norte
CEP 70910-900
Brasília–DF — Brasil
Universidade de Brasília
Instituto de Ciências Exatas
Departamento de Ciência da Computação
AlgoMusica: Um Protótipo para Produção de
Melodias a partir de Algoritmos
André Marra Gonçalves Araújo
Monografia apresentada como requisito parcial
para conclusão do Bacharelado em Ciência da Computação
Prof. Dr. Márcio da Costa Pereira Brandão (Orientador)
CIC/UnB
Prof. Dr. Carlos Eduardo Viena de Mello
MUS/UnB
Prof. Dr. Marco Aurélio de Carvalho
CIC/UnB
Prof. Dr. Marcus Vinicius Lamar
Coordenador do Bacharelado em Ciência da Computação
Brasília, 11 de dezembro de 2009
Agradecimentos
Agradeço a Deus pelo caminho que ele tem traçado em minha vida, pelos momentos
difíceis que me fizeram crescer e por tudo que passei porque tenho certeza que tudo
isso me preparou para conquistar essa vitória.
Agradeço a meus pais que sempre me deram o suporte que eu precisei pra que
eu superasse mais essa etapa da minha vida. Aos meus amigos que me deram
apoio e sempre falavam que ia dar tudo certo.
Ao professor Márcio Brandão por tornar possível escrever essa monografia juntando os temas que mais me interessam: computação e música. Por me orientar
no tema, me ajudar a definir o escopo e por confiar no meu projeto dando ótimas
ideias durante a codificação do programa.
Agradeço especialmente ao meu pai que me ajudou bastante na revisão dessa
monografia, pela preocupação e tempo investido.
iv
Resumo
Com o desenvolvimento da tecnologia, muitas pesquisas vêm sendo feitas sobre
o uso de computadores na criação de músicas. Este trabalho apresenta a implementação de um protótipo com o objetivo de auxiliar a composição de músicas pelo
computador com o uso de algoritmos. Um algoritmo é uma sequência finita de passos específicos que devem ser dados para se alcançar um determinado objetivo. Foi
feita uma experimentação com algoritmos como sequência de Fibonacci, cadeia de
DNA, números constantes e L-Systems. Assim, os números gerados por tais algoritmos são mapeados para gerar notas com duas informações básicas: altura e
duração. Outros aspectos como intensidade, harmonia, dinâmica e expressão não
são abordados. A saída é, então, transcrita num sistema de notação musical muito
poderoso, o Lilypond e, a partir desse interpretador, pode-se obter uma representação gráfica em PDF (Portable Document Format) da partitura e uma representação
sônica em arquivo MIDI.
Palavras-chave: composição musical, composição algorítmica, computação sônica,
lilypond, l-systems
v
Abstract
With the development of technology, many researches have been made about the
use of computer for creating music. This project presents the implementation of
a prototype with the aim of helping the composition of music by computer using
algorithms. An algorithm is a finite sequence of specific steps that should be taken
to achieve a certain goal. An experiment was made with algorithms such as the
Fibonacci sequence, the DNA sequence, constant numbers and L-Systems. Thus,
the numbers generated by such algorithms are mapped to generate scores with
two basic information: pitch and duration. Other aspects like intensity, harmony,
dynamics and expression are not addressed. The output is then transcribed into
a powerful musical notation system, Lilypond, and, through that interpreter, you
can get a graphical representation of the sheet in PDF (Portable Document Format)
and a sonic one in a MIDI file.
Keywords: musical composition, algorithmic composition, computer music, lilypond, l-systems
vi
Sumário
1 Introdução
1
2 Revisão Teórica
5
2.1 A composição musical . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.2 A composição algorítmica . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3 História . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.4 Música gerada por computador . . . . . . . . . . . . . . . . . . . . . .
8
2.4.1 Partituras geradas por computador para interpretação pelo
homem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.4.2 Música composta e interpretada por computadores
. . . . . .
9
2.5 Composição algorítmica assistida por computador . . . . . . . . . . .
11
2.5.1 Improvisação . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.6 Modelos para composição algorítmica . . . . . . . . . . . . . . . . . . .
12
2.6.1 Modelos matemáticos . . . . . . . . . . . . . . . . . . . . . . . .
13
2.6.2 Sistemas baseados em conhecimento . . . . . . . . . . . . . . .
13
2.6.3 Gramáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.6.4 Métodos evolucionários . . . . . . . . . . . . . . . . . . . . . . .
16
2.6.5 Sistemas de aprendizado . . . . . . . . . . . . . . . . . . . . . .
17
2.6.6 Sistemas híbridos . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.7 L-Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.7.1 D0L-Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.8 Trabalhos recentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
vii
2.9 O futuro da composição algorítmica . . . . . . . . . . . . . . . . . . . .
3 Implementação
22
24
3.1 O Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.1.1 Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.1.2 Extensão dos instrumentos . . . . . . . . . . . . . . . . . . . .
31
3.1.3 Escalas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
3.2 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
3.3 Ferramentas utilizadas . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.3.1 A Linguagem C++ . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.3.2 O LilyPond . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.3.3 MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3.3.4 Interface gráfica - Qt . . . . . . . . . . . . . . . . . . . . . . . .
42
4 Conclusão
4.1 Resultados obtidos
45
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
4.1.1 Composições . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
4.2 Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
Referências
49
viii
Lista de Figuras
2.1 Uma sequência de números criados com um fractal . . . . . . . . . . .
14
2.2 Kunststoff, quinto movimento. Notação do tipo piano roll . . . . . . .
14
2.3 Band-in-a-box: sistema baseado em conhecimento . . . . . . . . . . .
15
2.4 Strasheela: sistema de composição musical baseado em restrições . .
16
2.5 Curva do dragão com 10 iterações . . . . . . . . . . . . . . . . . . . . .
20
2.6 Uma simples representação das derivações de um D0L-System . . . .
21
3.1 Tela principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.2 Janela de entrada de dados para DNA — altura. . . . . . . . . . . . .
28
3.3 Janela de entrada de dados para DNA — duração. . . . . . . . . . . .
29
3.4 Janela de entrada de dados para L-Systems — altura. . . . . . . . . .
30
3.5 Janela de entrada de dados para L-Systems — duração. . . . . . . . .
31
3.6 Oitavas centrais dos instrumentos disponíveis no aplicativo . . . . . .
31
3.7 Exemplo de partitura gerada por L-Systems . . . . . . . . . . . . . . .
32
3.8 Atuação do método ArrangeForBestOctaves . . . . . . . . . . . . . . .
32
3.9 Exemplo de composição gerada pela sequência de Fibonacci . . . . . .
33
3.10 Sequência de Fibonacci ajustada ao tom de Ré maior . . . . . . . . .
33
3.11 Classe TAlgo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
3.12 Classe TMusical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
3.13 Método ArrangeOverKey . . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.14 Método ArrangeForBestOctaves . . . . . . . . . . . . . . . . . . . . . .
37
3.15 Classe TWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
ix
3.16 Arquivo no formato Lilypond com música para violino e piano . . . .
41
3.17 Música para violino e piano . . . . . . . . . . . . . . . . . . . . . . . .
41
3.18 Exemplo de aplicação em Qt . . . . . . . . . . . . . . . . . . . . . . . .
43
4.1 Composição em Ré maior. . . . . . . . . . . . . . . . . . . . . . . . . . .
46
4.2 Composição em Dó maior. . . . . . . . . . . . . . . . . . . . . . . . . .
46
4.3 Composição em Sol menor. . . . . . . . . . . . . . . . . . . . . . . . . .
47
x
Capítulo 1
Introdução
Comumente, quando se pensa no uso da tecnologia aplicada à música, tem-se por
referência a música computacional — composições geradas pelo computador ou com
auxílio parcial do mesmo — ou a música eletroacústica — que tem na produção do
som o seu diferencial. Também é possível pensar no uso de dispositivos eletrônicos,
software, composições, gravações, armazenamento e reprodução de músicas. Muitos dos recursos disponíveis, hoje em dia, na tecnologia inserida na música quase
passam despercebidos à medida que computadores vêm desenvolvendo um papel
cada vez maior na produção musical, uma vez que já é possível produzir e gerar
músicas completas com apenas alguns passos, simular efeitos analógicos, reproduzir qualquer instrumento com uma boa qualidade, etc.
Em composições recentes realizadas como parte da pesquisa “Ambiente de composição e performance com suporte tecnológico" (Ferraz 1999), foi levado em conta
esse jogo das possibilidades do auxílio do computador, não como uma máquina de
calcular, ou como um modo de transformação e geração de áudio, mas sobretudo
como um modo de se pensar a música. Dessa forma, os procedimentos utilizados
na composição eletroacústica e computacional foram agregados no intuito de dirigir
o modo de pensar a composição.
Composição musical e computação estão cada vez mais próximos uma vez que
músicos compositores, quando não auxiliados em suas composições pelo computador, o usam para, pelo menos, formalizar a obra em notação musical impressa por
algum software. Por isso, não se pode evitar também que o homem queira fazer o
uso de computadores para o auxiliar no processo criativo de uma composição. Assim, a composição algorítmica vai conquistando seu espaço nas pesquisas da ciência
da computação.
1
Composição algorítmica é a técnica que usa algoritmos para criar música (Roads 1996). Este trabalho aborda esse processo de criação musical o qual consiste
em dar uma tarefa ao computador e este se transforma num assistente composicional, viabilizando e explicitando ideias de um compositor (Figueiró 2005) através
de algoritmos. O objetivo da composição algorítmica não é o de substituir o papel
criativo do ser humano na composição de músicas, mas o de auxiliar o processo
composicional.
Ferraz (1999) trabalha com a ideia de que o pensamento composicional induz a
criação de ambientes de composição ao computador expondo suas ideias da seguinte
forma:
“É interessante notar que esta passagem da matéria sonora a material composicional, embora pareça rápida, ela já vem permeada por processos previstos
no próprio software. Ou seja, a passagem não é tão rápida assim, tal qual
quando nos defrontamos com composições realizadas com base em processos
composicionais já tradicionais (a tonalidade, as improvisações modais ou modelos seriais); a aparente intuição e rapidez com que a matéria sonora se torna
material composicional não se dá senão por ingenuidade, pois os processos todos de transformação já vêm previstos e largamente desenvolvidos no próprio
campo de composição.”
Ao tratar de composição algorítmica, Roads (1996) já associava composição e
representação simbólica. Segundo afirma, o computador, naquele tempo, já poderia
servir como um veículo para ideias musicais conforme visto abaixo.
“Modelos de processos são naturais ao pensamento musical. Enquanto escutamos, parte de nós bebe na sensual experiência do som, enquanto outra parte
está constantemente colocando uma espera perceptual, e fazendo isso, construindo hipóteses de processos musicais. Compositores sabem há séculos que
qualquer processo musical pode ser formalizado em uma representação simbólica. Uma composição algorítmica formal é uma máquina de criação musical;
neste caso, o computador pode servir como um veículo para ideias musicais.”
Algoritmos geram valores que, de alguma forma, fazem sentido à computação
e à matemática. Mas é bem verdade que algoritmos, em geral, geram valores tais
que dificilmente serão úteis à composição pois um compositor com alguma experiência não pode abrir mão da estética musical para compor algo sem sentido a
pelo menos uma pessoa ou a si mesmo. Muitos algoritmos que não têm relevância
musical imediata são usados por compositores como inspiração criativa para suas
músicas (Algorithmic Music 2009). Além da utilidade em composição, algoritmos
como fractais, L-systems, modelos probabilísticos e estocásticos também são úteis
2
para interpretação musical (Essl 2007). Mesmo que sejam notados muitos avanços
nesta área, ainda há campos para descoberta pois compositores que são programadores ainda podem pesquisar e usufruir do resultado obtido.
Por não estarem familiarizados com uma linguagem de edição ou software, muitas vezes, os músicos podem ter dificuldades em trabalhar tanto na composição
como na edição de partituras e ter poucas influências em seu estilo de composição.
Essas dificuldades podem residir na parte criativa do processo. Por isso, esta pesquisa foi desenvolvida na tentativa de acrescentar experiências musicais a músicos
iniciantes e profissionais que ainda não tiveram a oportunidade de compor ou, pelo
menos, obter ajuda do computador na composição.
Assim, o objetivo geral deste trabalho é o desenvolvimento de um software que
permita a qualquer usuário compor uma música através de passos específicos, ou
seja, gerar música através de uma composição guiada que utiliza expressões matemáticas e algoritmos computacionais para a geração de notas musicais tanto no
aspecto da altura (posição da nota na pauta) como no aspecto do tempo, da duração da nota. O resultado esperado é que tais expressões matemáticas e algoritmos
acrescentem novas formas de frases, intervalos musicais, estilos a músicos compositores e intérpretes (Middleton 2004). Uma composição musical com o auxílio do
computador usando essa implementação como ferramenta, enriqueceria tal obra,
facilitaria o processo e faria com que usuários que nunca tiveram a oportunidade
de compor uma música compusessem, mesmo que fosse como um experimento que
nunca seria publicado.
Para atingir o objetivo geral, o software do qual trata este trabalho deverá ser
capaz de guiar um usuário na composição de peças musicais disponibilizando uma
partitura e/ou um arquivo MIDI como saída — para futuras consultas audíveis —,
utilizar um bom sistema de notação musical em partituras necessitando, assim, de
corretude na notação musical e ser capaz de salvar o resultado num bom formato
de arquivos.
Dessa forma, foi implementada uma interface de saída gráfica que mostra todos
os passos e opções para gerar a peça musical desejada. O software foi escrito na
linguagem de programação C++ com interface gráfica Qt. Este trabalho também
envolveu uma pesquisa para integração de algoritmos e expressões matemáticas
que são o núcleo da geração das peças musicais. Além disso, foram implementadas
funções que transformaram a saída natural dos algoritmos geradores, nem sempre
aplicáveis devido à estética musical, para aproveitar ao máximo a utilidade dos
mesmos.
3
Este trabalho está estruturado da seguinte forma: no capítulo 2, faz-se uma revisão teórica abordando o contexto deste trabalho na área de atuação e os elementos
utilizados para a construção do aplicativo, revisa pontos e aspectos importantes na
história da música gerada por computadores, métodos utilizados além de nomes
importantes na área e suas contribuições para a evolução da computação na área
da música; o capítulo 3 trata dos detalhes de implementação, dos algoritmos geradores, escolha das ferramentas e como foram utilizadas, funções implementadas
de forma a melhorar o resultado musical de tais algoritmos e decisões que foram
tomadas ao longo desse período de codificação; o capítulo 4, por fim, conclui o trabalho com a análise dos resultados obtidos e propõe sugestões de trabalhos futuros
para a melhoria do software.
4
Capítulo 2
Revisão Teórica
Várias áreas de pesquisa relacionam a música a fatores exclusivos das mesmas:
matemática, psicologia, física, etc. Tem-se notado com bastante frequência que a
música compartilha relações muito próximas com a matemática e que noções dessa
ciência e estética musical podem ter algumas semelhanças (Schillinger 1948). Essa
fundamentação matemática na música deu origem a uma área da ciência da computação, a computação musical, que estuda a aplicação dos computadores ligados a
problemas musicais: métodos, técnicas e algoritmos para processamento e geração
de som e música, representações digitais e armazenamento de informação sônica
e musical (Miletto et al. 2004). Um dos problemas de investigação da computação
musical é a composição algorítmica.
Este capítulo aborda uma revisão de conceitos importantes que envolvem o assunto tratado por este trabalho e o estado da arte no tocante à composição algorítmica.
2.1
A composição musical
A composição musical pode ser entendida como o processo pelo qual uma peça é
originada. Acadêmicamente, é a disciplina que estuda os métodos, técnicas e regras da composição (Schoenberg 1967). Quem se ocupa desse trabalho é chamado
de compositor — um profissional que, ao realizar uma composição, utiliza o conhecimento da teoria musical e das características de um determinado gênero musical,
dentre outros procedimentos como o ritmo, a instrumentação utilizada e a duração
da mesma.
5
A composição geralmente é escrita e publicada em notação musical (partituras)
ou em outros métodos de notação, como notação cifrada e tablaturas. Quando um
sistema de notação não é utilizado, a composição é transmitida em simples gravações das trilhas sonoras ou até mesmo por repetição e memorização. Esse é o
método utilizado na maior parte das canções tradicionais como, por exemplo, peças
folclóricas, indígenas e de roda. Mesmo não se sabendo do criador de tais obras,
essas ainda continuam sendo composições musicais sendo possível transcrevê-las
em partituras, cifras e tablaturas, preservando a peça musical.
Dentre as diversas etapas do processo de composição, está a produção do arranjo
musical — a divisão da música em partes a serem executadas por cada um dos
instrumentos e/ou vozes. Não há uma regra que determine quem deve executar
esse processo, e por isso muitas vezes é o próprio compositor quem o faz. Em geral,
compositores de música clássica, por exemplo, além de compor uma peça musical,
produzem o arranjo e realizam a primeira execução da obra. Em outros casos, o
arranjo é realizado por um músico especializado, o arranjador.
2.2
A composição algorítmica
Composição algorítmica é uma técnica que usa algoritmos para gerar música. Um
algoritmo é um conjunto de passos sequenciais com um objetivo a ser alcançado. O
respirar, o piscar, as batidas do coração, e assim por diante, são algoritmos que ocorrem naturalmente e mantém os seres vivos. O DNA, o alicerce da vida, representa
um bom exemplo de um algoritmo comum. Também usa-se algoritmos quando
faz-se um bolo e joga-se jogos de tabuleiro. Semelhantemente, um algoritmo de
computador é um código de passos sequenciais para produzir algum resultado desejado. Rotineiramente, faz-se o uso de tais algoritmos ao se realizar uma busca
na Internet, a edição de um texto, reprodução de um arquivo de áudio, etc. Composição algorítmica, portanto, é uma receita de passos sequenciais para criar novas
composições musicais (Cope apud Muscutt 2007).
Segundo Roads (1996), para um compositor que não é um programador, programas de composição totalmente automatizados demandam pouca criatividade.
A interação do compositor é limitada a fornecer uma pequena quantidade de dados iniciais antes de executar o programa. A estratégia de composição é fixada no
programa e o usuário simplesmente colhe o resultado quando finalizado. Em sua
forma mais extrema, a composição automatizada remonta uma forma de “achado
artístico”; o compositor seleciona a saída, então assina, informa um meio de execu6
ção e coloca um título no trabalho. Mesmo em casos semelhantes alguns compositores acham fascinante iniciar um conjunto complexo de processos musicais.
Uma maneira de ultrapassar a estratégia fixa é modificar a lógica do programa.
Nesse caso, um compositor, que também é um programador assume total responsabilidade. Outra maneira de se mudar a estratégia é controlando e introduzindo
algoritmos originais na composição (Verostko 1999).
2.3
História
O uso de computadores não é novo na composição de peças musicais. Desde o século
XIX, já se pensava na possibilidade de gerar música com a máquina de analisar de
Babbage. Em 1957, o trabalho de Max Matthews nos laboratórios Bell resultaram
no MUSIC I, um dos primeiros programas para criar música num computador digital e, certamente, o primeiro a ganhar aceitação da comunidade de pesquisa na
área da computação musical como viável para executar tal tarefa. Mais tarde, se
evoluiu para o influente programa de computador MUSIC V, o último na linha de
desenvolvimento dos laboratórios Bell. O Csound, uma linguagem de programação
de áudio, descende do MUSIC 11. A partir desse ponto, começaram a aparecer programas para sequenciar melodias e escrever partituras. Com o passar do tempo, a
pesquisa na composição algorítmica passou da estruturação musical — uma abordagem mais geral — para a geração da parte micro — notas, melodias, ritmos,
intensidade. Isso gera uma necessidade maior da teoria matemática na pesquisa.
Por décadas, o computador tem sido usado para compor obras musicais através
de métodos probabilísticos e estocásticos1 . Artigos escritos por Lorrain (1980) e
Jones (1980) proveem boas descrições da matemática envolvida.
Até o meio dos anos 80, muito da atenção estava para a obtenção de bons timbres ao invés da estruturação da música composta, o que é aceitável dado o estado
da arte da época, pelos limites computacionais e pela escassez de fontes de ricos
sons. Com o avanço da tecnologia, computadores ficaram mais poderosos e capazes
de resolver tarefas mais complexas. Com isso, compositores têm usado computadores para modelar com maior precisão o processo criativo e isto não tem ocorrido
somente na música, mas onde há, ou possa haver, um processo criativo como criação
1
O termo estocástico foi introduzido na música por Xenakis (1971), sinônimo de aleatório, mas
tem sido mais usado no meio científico. Xenakis a usou para qualificar seu uso da teoria de probabilidade.
7
artística de tipos de letras e fontes — grafismos limitados a uma grade (Hofstadler
1995).
A composição algorítmica é uma metodologia que possibilitou o homem a compor
mais rapidamente e com mais opções. Considerando esse avanço da tecnologia, o
sucesso da composição depende de dois fatores:
1. Uma boa combinação entre o processo criativo do compositor e o algoritmo
implementado;
2. Um mecanismo exato para determinar a viabilidade de uso de uma frase específica.
O problema da composição musical assistida por computador deixa, então, de
responder à pergunta mais geral “como criar música?” podendo ser decomposto em
duas perguntas um pouco mais detalhadas:
• Quais passos usar para compor música?
• Que tipos de movimento harmônico mais se adequam à composição?
2.4
Música gerada por computador
Música gerada por computador é a música composta, integral ou parcialmente,
pelo computador. Pode-se distinguir dois grupos de música gerada por computador:
aquela na qual o computador gerou a partitura, que poderia ser interpretada pelo
homem2 ; e a que é composta e interpretada por computadores3 .
2.4.1
Partituras geradas por computador para interpretação
pelo homem
Muitos sistemas de geração "automática"de partituras musicais existiram bem antes da era dos computadores. Um destes era o Musikalisches Würfelspiel de Mozart,
um sistema que usava dados para escolher entre compassos de uma grande coleção
de frases musicais e gerar música aleatoriamente (Noguchi 1997). Quando postas
juntas, essas frases combinavam uma criação de uma peça musical que poderia ser
2
3
Como, por exemplo, Übung, 3 Asko Pieces, Beitrag, entre outras obras
Como o sistema “Lexinkin-Sonate por Karlheinz”
8
interpretada por humanos. Embora essas obras não fossem efetivamente compostas por um computador, no sentido moderno, elas usavam uma forma rudimentar
das técnicas combinatórias aleatórias por vezes utilizadas na composição gerada
por computador.
A primeira música digital do mundo foi reproduzida na Austrália, em 1951, pelo
programador Geoff Hill no computador CSIRAC que foi projetado e construído por
Trevor Pearcey e Maston Beard (Doornbusch 2009). Posteriormente, um dos primeiros compositores a escrever música com um computador foi Iannis Xenakis. Ele
escreveu programas em FORTRAN que geravam dados numéricos que ele transcrevia em notas a serem tocadas por instrumentos musicais tradicionais. Um exemplo
é o ST/48 de 1962 (Barthel-Calvet 2002). Embora Xenakis pudesse ter escrito essa
música à mão, a intensidade de cálculos necessários para a transformação probabilística matemática em notação musical era melhor realizada pelo poder numérico
dos computadores.
Computadores também têm sido utilizados na tentativa de imitar a música dos
grandes compositores do passado, tais como Mozart. Como uma referência nessa
técnica, Cope (apud Muscutt 2007) escreveu programas de computadores que analisavam obras de outros compositores para produzir novas obras num estilo parecido. Ele tem usado esses programas obtendo grandes resultados com compositores
como J. S. Bach e Mozart4 , e também com suas próprias peças, combinando suas
próprias criações com aquelas do computador.
2.4.2
Música composta e interpretada por computadores
Compositores como Gottfried Michael Koenig tinham computadores que geravam
sons e partituras (Buxton 1977). Koenig produziu programas de composição algorítmica que eram uma generalização de sua própria prática de composição por serialismo. Não é exatamente similar ao trabalho de Xenakis porque ele usou abstrações matemáticas e examinou quão longe ele poderia explorar isto musicalmente.
O programa de Koenig traduziu o cálculo de equações matemáticas em códigos que
representavam uma notação musical. Esses códigos podiam ser convertidos em
notação musical manualmente e depois interpretada por humanos. Seus programas Project 1 (Koenig 1970a) e Project 2 (Koenig 1970b) são exemplos desse tipo
de software. Depois, ele estendeu os mesmos princípios na síntese, habilitando o
computador a diretamente produzir sons (Supper 2001).
4
Seu programa Experiments in Musical Intelligence é famoso por criar a “42a Sinfonia de Mozart”
9
Procedimentos como esses usados por Koenig e Xenakis ainda são usados atualmente. Desde a invenção do sistema MIDI no início dos anos 80 (Association 2009),
por exemplo, algumas pessoas trabalharam com programas que mapeavam notas
MIDI a um algoritmo e então era possível escutar sons ou música através da placa
de som do computador ou salvar em um arquivo de áudio para outros programas
reproduzirem. Alguns desses programas são baseados em fractais. Assim, eles podem mapear notas MIDI a fractais específicos ou equações de fractais. Apesar de
tais programas estarem disponíveis e muitas vezes serem vistos como brinquedos
para leigos em música, alguns músicos profissionais têm levado os mesmos a sério. A música resultante pode soar tanto como algo sem sentido quanto familiar e
prazeroso. Essa é uma questão subjetiva.
Tal como acontece com muitas peças musicais algorítmicas, e a arte algorítmica
em geral, o resultado depende mais do modo como os parâmetros são mapeados
para aspectos dessas equações do que nas próprias equações. Assim, por exemplo,
a mesma equação pode produzir peças de música tanto líricas quanto melódicas no
estilo do meio do século XIX, e uma fantástica cacofonia dissonante mais similar à
música de vanguarda dos anos 50 e 60.
Outros programas podem mapear fórmulas matemáticas e constantes para produzir sequência de notas. Dessa maneira, um número irracional pode gerar uma
sequência infinita de notas onde cada uma delas é um dígito na dízima desse número. Essa sequência, por sua vez, pode ser considerada uma composição em si ou
simplesmente a base para elaborações adicionais. Operações como essa, e até operações mais elaboradas, também podem ser realizadas em linguagens de programação de computação musical como Max/MSP5 , SuperCollider6 , Csound7 , Pure Data
(PD)8 , KeyKit9 e ChucK10 . Agora, esses programas rodam na maioria dos computadores pessoais e são frequentemente capazes de calcular funções mais complexas
do que aquelas que eram calculadas nos mainframes mais poderosos há décadas
atrás.
Outra abordagem para composição algorítmica utiliza hardware especializado
para detectar estímulos externos que são então mapeados pelo computador para
realizar a performance. Exemplos desse estilo de computação musical pode ser encontrado no trabalho do meio dos anos oitenta de David Rokeby onde gestos físicos
5
Disponível em:
Disponível em:
7
Disponível em:
8
Disponível em:
9
Disponível em:
10
Disponível em:
6
http://cycling74.com/downloads/
http://supercollider.sourceforge.net/
http://www.csounds.com/
http://sourceforge.net/projects/pure-data/
http://nosuch.com/keykit/
http://chuck.cs.princeton.edu/
10
do intérprete são traduzidos para segmentos MIDI11 . Música controlada por computador também é encontrada nas peças do compositor canadense Udo Kasemets
tal como Mace(ntennia)l Circus C(ag)elebrating Duchamp (1987)12 .
2.5
Composição algorítmica assistida por computador
Composição algorítmica assistida por computador é a implementação e o uso de técnicas de composição algorítmica em software. Esse rótulo é derivado da combinação
de outros dois rótulos, ambos vagos para uso rotineiro. O rótulo “Composição assistida por computador” não especifica o uso de algoritmos generativos. Peças musicais produzidas com notação ou software de sequenciamento poderiam facilmente
ser consideradas composições assistidas por computador. O rótulo “composição algorítmica” é igualmente muito amplo, particularmente porque ele não especifica a
utilização de um computador. Tais rótulos se confundem bastante pois a composição algorítmica é uma área científica ainda recente. Rótulos como composição algorítmica, composição automática, pré-processamento de composição, composição
assistida por computador, computação musical e composição procedural têm sido
usados para descrever projetos idênticos, às vezes, neste campo de pesquisa (Ariza
2005). Alguns pesquisadores já tentaram diferenciar tais rótulos: Spiegel (1989),
Cope (1991; pg. 220), Burns (1994; pg. 195), Miranda (2000; pg. 9-10), Taube
(2004) e Gerhard and Hepting (2004; pg. 505).
2.5.1
Improvisação
A improvisação é um importante aspecto da música em geral. Ela é a atividade
criativa de uma composição musical imediata, que combina performance com comunicação de emoções e técnica instrumental como resposta espontânea a outros
músicos, quando presentes. Assim, idéias musicais na improvisação são espontâneas, mas podem ser baseadas em mudanças de acordes da música ocidental. Para
Harris (2009), “na música, improvisação significa compor algo novo na qual ainda
não tinha sido notado, algo ‘não-previsto’ literalmente”.
11
SoftVNS que agora pode ser encontrado em: http://homepage.mac.com/davidrokeby/
softVNS.html
12
Uma realização do processo de Marcel Duchamp usando um trem elétrico para a coleta de um
carro-gafanhoto de pedras a serem depositadas em um tambor ligado por um fio a um conversor
A/D, mapeando o impacto das pedras a notas.
11
A improvisação feita pela máquina utiliza algoritmos computacionais para criar
improvisações em algum material musical existente. Isso geralmente é feito por
sofisticadas combinações musicais extraídas da música existente, seja ao vivo ou
gravada. Para atingir improvisações aceitáveis num estilo musical em particular,
a improvisação realizada pela máquina utiliza algoritmos de aprendizado e de combinação de padrões para analisar exemplos de obras existentes. Então, os padrões
resultantes são utilizados para criar novas variações no estilo da música original,
desenvolvendo uma noção de reinjeção estilística.
Desenvolvido no IRCAM — Institut de Recherche et Coordination Acoustique/
Musique —, o OMax é um ambiente de software que aprende, em tempo real, características estilísticas de um músico e interpreta interativamente com ele, como
uma improvisação. OMax usa OpenMusic e Max. Ele é baseado em pesquisas em
modelagem estilística efetuadas por Gerard Assayag e Shlomo Dubnov e pesquisas
em improvisação com o computador por G. Assayag, M. Chemillier e G. Bloch no
grupo de representações musicais do IRCAM.
2.6
Modelos para composição algorítmica
Não há um método universal para dividir modelos e algoritmos de composição em
categorias, mas uma maneira de fazê-lo é percebendo a influência que um algoritmo
toma no processo composicional (Algorithmic Music 2009). Assim, os resultados do
processo podem ser divididos em:
1. Composição de música feita por computador13
2. Composição de música assistida por computador
Uma outra maneira de categorizar algoritmos é examinando os resultados de
seus processos composicionais (Algorithmic Music 2009). Algoritmos podem prover informações em notação (partituras) para outros instrumentos ou prover informações independentes por síntese de som (tocando a composição por si só). Há
algoritmos que proveem as duas formas de informação.
No entanto, o modo mais comum de categorizar um algoritmo é por sua estrutura e o modo de processamento de dados musicais. Assim, pode-se criar seis divisões que englobam, praticamente, todos os algoritmos (Algorithmic Music 2009):
13
Pode-se afirmar que uma música foi composta por um computador quando este teve a capacidade de fazer escolhas durante o processo de composição.
12
1. Modelos matemáticos;
2. Sistemas baseados em conhecimento;
3. Gramáticas;
4. Métodos evolucionários;
5. Sistemas de aprendizado;
6. Sistemas híbridos.
2.6.1
Modelos matemáticos
Modelos matemáticos são baseados em equações matemáticas e eventos aleatórios.
A maneira mais comum de se compor por modelos matemáticos é por processos
estocásticos onde uma parte da música é composta como um resultado de métodos não-determinísticos. O processo composicional só é parcialmente controlado
pelo compositor avaliando as possibilidades de eventos aleatórios. Algoritmos estocásticos são muitas vezes utilizados em conjunto com outros algoritmos em vários
processos de tomadas de decisão.
Peças musicais também têm sido compostas através de fenômenos naturais. Estes modelos caóticos criam composições de fenômenos harmônicos e não harmônicos da natureza. Como exemplo, têm-se os fractais que têm sido estudados desde a
década de 70 como modelos para composição algorítmica.
Anders (2007) usa a sequência de números gerados por um fractal similar à
curva de Koch, vista na Figura 2.1, e mapeou essa sequência para parâmetros
musicais gerando o quinto movimento de Kunststoff visto na Figura 2.2.
2.6.2
Sistemas baseados em conhecimento
Uma outra maneira de compor é isolando o padrão estético de um determinado
gênero musical e usá-lo para criar novas composições similares. Esses sistemas
são baseados em um conhecido conjunto de argumentos que podem ser usados para
compor novas obras do mesmo estilo ou gênero. Normalmente, essas composições
são realizadas por um conjunto de regras ou testes que precisam ser seguidos para
a conclusão do trabalho.
13
Figura 2.1: Uma sequência de números criados com um fractal
Figura 2.2: Kunststoff, quinto movimento. Notação do tipo piano roll
14
Band-in-a-box14 , Figura 2.3, é um software bem conhecido no mercado que gera
acompanhamentos inteligentes baseados em um estilo musical a partir de uma
sequência de acordes inseridos pelo usuário. Esses acompanhamentos são gerados
com 3 a 5 partes e podem conter baixo, bateria, piano, violão, guitarra e cordas.
O estilo musical pode variar bastante indo do Clássico ao Rock, do Jazz ao Latino
e também há a possibilidade de se incluir novos estilos. Com esse software pode
gerar solos ou improvisos em qualquer progressão de acordes e também cria peças
inteiras gerando acordes, melodia, introdução, etc. Essas características o tornam
uma ótima ferramenta para composição e exemplfica muito bem um sistema baseado em conhecimento.
Figura 2.3: Band-in-a-box: sistema baseado em conhecimento
2.6.3
Gramáticas
A música também pode ser vista como uma linguagem com um conjunto de regras
ou gramáticas. Composições são criadas construindo, primeiramente, a gramática
musical, que é usada para criar peças musicais compreensíveis. Gramáticas muitas
vezes incluem regras para composição em nível macro, para harmonias e ritmos,
ao invés de únicas notas — nível micro.
14
Disponível em: http://www.band-in-a-box.com/pt/
15
Visto na Figura 2.4, o Strasheela15 , desenvolvido por Anders (2007), é um sistema de composição musical baseado em restrições. O usuário define teorias musicais formuladas como problemas de satisfação de restrições (CSP) pelos conjuntos
de regras composicionais. Entre essas teorias, pode-se usar L-Systems (ver Seção 2.7). A interface com o usuário é a linguagem de programação Oz e os resultados podem ser salvos em MIDI, Csound e Lilypond.
Figura 2.4: Strasheela: sistema de composição musical baseado em restrições
2.6.4
Métodos evolucionários
Os métodos evolucionários são baseados em algoritmos de busca genética, ou seja,
a composição vai sendo construída por meio do processo evolucionário. Através de
mutação e seleção natural, diferentes soluções evoluem para uma boa peça musical. Ações iterativas do algoritmo eliminam as soluções consideradas ruins e criam
novas. Os resultados do processo são supervisionados pela crítica, uma parte vital
do algoritmo que controla a qualidade das composições.
O livro de Miranda and Billies (2007), descreve o uso de evolução na música com
capítulos que abordam composição, interpretação, improvisação, outros aspectos da
produção de peças musicais e estudos usando algoritmos genéticos. Um exemplo
de uso desses algoritmos se encontra no aplicativo GeneticDrummer, desenvolvido
15
Disponível em: http://strasheela.sourceforge.net/
16
por Dostál (2002), que cria acompanhamentos rítmicos por um instrumento selecionado pelo usuário.
2.6.5
Sistemas de aprendizado
Sistemas de aprendizado são programas que não têm conhecimento algum sobre
o gênero de música que eles estão trabalhando. Assim, eles coletam um material
de aprendizado de amostragens providas pelo usuário ou programador. O material é processado em uma peça de música similar aos exemplos da amostragem.
Esse método de composição algorítmica é fortemente ligado a estudos como ciência
cognitiva e redes neurais.
Mozer (1994) desenvolveu um trabalho em redes neurais criando a CONCERT
— uma rede treinada com um conjunto de peças musicais com o objetivo de aprender regularidades estilísticas para, então, compor novas obras. Também foram
feitos experimentos no treinamento desta rede neural com peças de J. S. Bach
2.6.6
Sistemas híbridos
Programas baseados em um único modelo de algoritmo raramente são bem sucedidos em criar resultados esteticamente satisfatórios. Por essa razão, algoritmos
de diferentes tipos são frequentemente usados para combinar forças e diminuir
fraquezas uns dos outros. A criação de sistemas híbridos para composição musical tem aberto o campo da composição algorítmica e criado muitas novas maneiras
de construir composições com algoritmos. O maior problema de sistemas híbridos
é a complexidade que aumenta gradativamente e a necessidade de recursos para
combinar e testar esses algoritmos.
2.7
L-Systems
L-Systems, desenvolvidas por Lindenmayer (1968)16 , são gramáticas de reescrita
de strings. Inicialmente, a ênfase no uso desse modelo matemático era aplicada no
desenvolvimento de células e na modelagem de sistemas biológicos e, recentemente,
ganhou seu espaço no estudo em sistemas de composições musicais. Prusinkiewicz
(1986), em um dos seus trabalhos, usou L-Systems para gerar gráficos através da
16
Húngaro, botânico e biólogo teórico da universidade de Utrecht
17
interpretação baseada na geometria Turtle-Graphics sendo que os tamanhos e direções das arestas determinavam altura e duração das notas, respectivamente.
L-Systems fornecem uma maneira compacta de representar padrões complexos que têm algum grau de repetição e têm diversas variações que relacionam
noções como não-determinismo, determinismo, contexto à esquerda ou à direita,
interpretação de suas derivações e gramáticas multidimensionais. Por essa razão, os L-Systems representam uma hierarquia de linguagem alternativa à de
Chomsky. Formalmente, Chomsky definiu uma gramática gerativa G como a quádrupla G = hN, S, ω, P i onde:
• N é o conjunto finito de símbolos não-terminais (variáveis);
• S é o conjunto finito de símbolos terminais separados de N (constantes);
• ω é o axioma, uma cadeia de símbolos de N que definem o estado inicial do
sistema;
• P é o conjunto finito de regras de produções que definem como variáveis podem ser substituídas por outras variáveis e/ou constantes. Uma produção
consiste em duas cadeias de símbolos, o predecessor e o sucessor: a → χ.
A diferença essencial de uma gramática gerativa de Chomsky e um L-System
é que, neste último, a reescrita é paralela, não sequencial. Isto significa que, em
cada etapa de derivação, todos os símbolos da cadeia são substituídos simultaneamente e não um por um. A razão desta decisão se explica em Prusinkiewicz and
Lindenmayer (1990; pg. 3):
Essa diferença reflete uma motivação biológica dos L-Systems. Produções são
destinadas a capturar divisões celulares em organismos multi-celulares onde
muitas divisões podem ocorrer ao mesmo tempo. A aplicação de produções paralelas tem impacto importante nas propriedades formais de sistemas de reescrita. Por exemplo, existem linguagens que podem ser geradas por L-Systems
livres de contexto (OL-Systems) mas não por gramáticas de Chomsky livres de
contexto.
L-Systems são categorizadas pelo tipo de gramáticas que usam. Gramáticas
diferentes geram linguagens formais diferentes. Essas gramáticas podem ser classificadas em diferentes formas de acordo com o modo que as regras de produção são
aplicadas. A gramática de um L-System pode ser:
• livre de contexto (0L-System) ou sensível ao contexto (IL-System);
18
• determinística (DL-System) ou não-determinística;
• com colchetes;
• propagativa (PL-System) ou não-propagativa;
• com tabelas (TL-System);
• paramétrica;
• com extensões (EL-System).
Estes tipos de gramáticas podem ser combinadas em um L-System. Assim,
um D0L-System é um sistema determinístico livre de contexto enquanto um EILSystem é um sistema sensível ao contexto com extensões.
Uma forma interessante de interpretar os símbolos de um L-System é combinando cada um com um comando da linguagem baseada em Turtle-Graphics, na
qual uma tartaruga desenha na tela de acordo com instruções dadas a ela. Um
exemplo clássico é a curva do dragão que é dado pelo sistema G = hN, S, ω, δ, P i
onde N = {X, Y } é o conjunto de variáveis, S = {F, +, −} é o conjunto de constantes, ω = F X é o axioma, δ = 90 é o angulo que a tartaruga deve girar dados
os comandos + e − e P = {(X, X + Y F ), (Y, F X − Y )} é o conjunto de regras de
produção (P1 = X → X + Y F e P2 = Y → F X − Y ). Aqui, F significa “andar para
a frente”, − significa “girar 90 graus à esquerda” e + “girar 90 graus à direita”. X
e Y não correspondem a qualquer comando de desenho e são usados apenas como
controle da evolução da curva. A Figura 2.5 ilustra a curva para 10 iterações do
L-System descrito anteriormente.
2.7.1
D0L-Systems
Num sistema determinístico, cada palavra (símbolo) aparece uma única vez na
parte esquerda da regra de produção, significando que um predecessor é sempre
substituído pelo mesmo sucessor. Ao mesmo tempo, produções livres de contexto
tem a forma
precedessor → sucessor
onde o predecessor é um símbolo do alfabeto Σ e o sucessor é uma palavra sobre Σ,
possivelmente vazia. Essas são as duas características de uma D0L-System. Por
exemplo, seja o sistema onde:
19
Figura 2.5: Curva do dragão com 10 iterações
Alfabeto: Σ = {A, B}
Regras de produção: P = {(A, AB), (B, A)}, ou seja,
P1 : A → AB
P2 : B → A
Axioma: ω : B
e que, em cada derivação, a string produzida na etapa n é:
n = 0: B
n = 1: A
n = 2: AB
n = 3: ABA
n = 4: ABAAB
n = 5: ABAABABA
Esse é um L-System original de Lindenmayer para modelar o crescimento de algas. A seguir, uma simples representação gráfica dessas produções (Prusinkiewicz
and Lindenmayer 1990; pg. 4):
20
Figura 2.6: Uma simples representação das derivações de um D0L-System
2.8
Trabalhos recentes
McCormak (1996) usava, primeiramente, L-Systems para a computação gráfica
mas teve algumas ideias interessantes para o uso desses sistemas na composição
musical. Ele sugere o uso de algoritmos genéticos, que têm o objetivo de abstrair e
explicar os processos adaptativos em sistemas naturais, para transformar a gramática inicial. Sua implementação, que tem os símbolos representando notas (A a G)
e gera a saída no formato MIDI, tem performance em tempo real apesar de ter problemas de atraso com gramáticas muito complexas durante o processamento (McCormak 1996; pg. 11).
Manousakis (2006) implementou um framework para desenvolver L-Systems
que geram estruturas musicais. Ele apresenta um novo modelo musical de LSystem baseado na implementação do próprio autor em Max/MAP/Jitter.
Nauert (2007) trabalha com modelos rítmicos baseados em divisão e adição em
um sistema de composição assistido por computador. Em seu trabalho, ele descreve
uma série de algoritmos de composição por ele utilizados e investiga algumas vantagens e desvantagens que cada um desses algoritmos herdam do modelo de ritmo
particular no qual é baseado. O desenvolvimento desses algoritmos foi formado por,
pelo menos, dois objetivos composicionais - criar música para performance humana
e expressá-la usando notação musical ocidental que seja comum à prática.
Lourenço (2009) faz uma abordagem abrangente de como extrair notas musicais de L-Systems. Em seu trabalho, ele introduz algumas idéias que produzem
variabilidade na interpretação musical de L-Systems com operações genéticas so21
bre as produções no sucessor, mais especificamente durante as iterações: crossover
e mutation.
2.9
O futuro da composição algorítmica
Acredita-se que, em um futuro não muito distante, a composição algorítmica se
torne uma abordagem normal quanto à composição musical. Muscutt (2007) afirma
que o sucesso do Workshop anual em Música algorítmica computacional sugere que
muitos compositores veem a racionalidade de usar algoritmos computacionais. Na
verdade, muitos compositores já usam algoritmos formais como técnicas de composição sem titubeios.
Segundo Cope (apud Muscutt 2007):
“Uma vez pensei que música algorítmica pegaria o mundo musical como uma
tempestade. Agora, contudo, eu acho que a mudança vai acontecer lentamente
e sutilmente ao longo do tempo, com a maioria dos compositores usando algoritmos no papel e então convertendo-os para algoritmos computacionais tão logo
programas apropriados se tornem disponíveis. Os resultados desse processo
não irão produzir, necessariamente, compositores algorítmicos mas criarão ao
menos compositores que usam algoritmos.
Essa distinção que faço entre “compositores que usam algoritmos"e “compositores algorítmicos"é um assunto importante pra mim, a propósito. Compositores
que usam algoritmos usam diversas técnicas algorítmicas quando compõem,
incluindo serialismo, métodos estocásticos, e assim por diante, mas ainda compõem tradicionalmente. Quando uso o termo “compositor algorítmico", me refiro àqueles compositores, me incluindo, que criam obras completas a partir de
algoritmos lidando, assim, computacionalmente com estruturas formais bem
como detalhes internos."
O presente trabalho propõe uma composição interativa onde o compositor pode
escolher dentre um conjunto de algoritmos que irão ajudar no processo criativo da
composição. Nesse sentido, a implementação pode atuar tanto na área da altura
quanto na duração da nota fazendo com que a obra seja enriquecida com o poder
composicional dos algoritmos.
Neste capítulo, informações essencialmente importantes para o entendimento
do trabalho e seu contexto foram abordadas: o estado da arte na área de composição algorítmica, onde ela se insere na Ciência da Computação, pessoas importantes
que contribuíram para a evolução dessa área, métodos utilizados na composição e
os tipos de composição (gerada e assistida por computador). Viu-se que a composição algorítmica já vem sendo muito utilizada, de variadas formas, com muitas
22
opções. Além disso, ela ainda vem sendo objeto de várias pesquisas e com avanços
que tornam o computador uma ótima ferramenta no auxílio à composição, também
mostrando que os algoritmos, criados pelo homem, têm a capacidade de compor por
si só.
23
Capítulo 3
Implementação
Neste capítulo, apresenta-se uma visão geral sobre um protótipo construído para
explorar a área da composição guiada e gerada por algoritmos computacionais e
sequências matemáticas, que foi denominado AlgoMusica. O sistema foi codificado
na linguagem de programação C++ com interface gráfica em Qt1 , o Lilypond foi
utilizado para converter os resultados no tradicional sistema de notação musical.
O planejamento e a própria implementação acabaram por gerar algumas características interessantes que deram uma forma interessante ao protótipo, uma vez
que algumas características pesam na decisão do usuário de usar ou não o software
e também na decisão de programadores de ajudar na evolução do mesmo. São elas:
1. Portabilidade. O principal instrumento deste protótipo na guia da composição, a interface gráfica, é portável para vários sistemas operacionais como
descrito na Seção 3.3.4. Além da interface, acrescenta-se a portabilidade da
linguagem de programação C++ — Seção 3.3.1 — e do sistema de notação musical — Seção 3.3.2. Assim, é possível atingir uma gama de usuários muito
grande, hospedando o aplicativo nos sistemas operacionais mais populares do
mercado, comerciais ou não.
2. Modularidade. O aplicativo foi totalmente modularizado sendo possível incrementar e adicionar funcionalidades, utilizar outras bibliotecas de interface
gráfica e outros sistemas de notação musical. De outra maneira, também é
possível inserir o núcleo do aplicativo em programas já existentes no mercado, adicionando ou melhorando as ferramentas de composição algorítmica
nos mesmos.
1
como “cute” em inglês
24
3. Orientação a objetos. Parte da modularidade descrita anteriormente se
deve à utilização dessa metodologia de programação. Atualmente, esse é um
paradigma vastamente utilizado na implementação de sistemas computacionais. É tida como a melhor estratégia, e mais natural, para eliminar a dificuldade recorrente de se modelar o mundo real no melhor conjunto de componentes que descrevem o software, as classes. Outras vantagens importantes
e que devem ser mencionadas são a reusabilidade do código, escalabilidade e
mantenabilidade.
4. Experimentação. Faz parte da escalabilidade do sistema que é a possibilidade de facilmente inserir outros algoritmos no aplicativo e melhorá-los
para colher os resultados desejados. Assim, aumenta-se o poder de escolha do
usuário e incentiva-se a cooperação de outros programadores e músicos para
a experimentação de novas técnicas na composição algorítmica.
O presente capítulo trata também de aspectos relevantes no processo de implementação, as ferramentas e os algoritmos que foram utilizados, decisões de projeto,
as classes que foram modeladas e detalhes na construção do aplicativo. Nas seções
a seguir, o aplicativo é exposto e detalhado ao nível de código para compreensão do
que acontece na sua execução e o que está envolvido em cada etapa.
3.1
O Sistema
Assim que o sistema é executado, percebe-se a intenção de ajudar o usuário na
composição. Tudo foi feito de modo que esse processo fosse intuitivo e o mais fácil
possível de ser concluído. No entanto, por se utilizar de um sistema de notação à
parte, é necessário, antes da composição, indicar o caminho onde o mesmo está localizado no sistema de arquivos. Do contrário, embora essa configuração só precise
ser feita uma única vez, o usuário terá que executar o Lilypond por conta própria
com o arquivo de saída gerado ao final da execução.
A execução guiada do sistema se dá na sua execução, que só habilita certos componentes da interface quando as etapas anteriores forem sendo cumpridas. Dessa
maneira, não é possível escolher um algoritmo gerador para as durações antes de
escolher o mesmo para a frequência (ou altura) da nota. Portanto, o usuário não
tem dúvidas sobre quais campos devem ser preenchidos evitando que o arquivo
de saída não seja salvo com erros de sintaxe do formato padrão do Lilypond (ver
Seção 3.3.2).
25
A Figura 3.1 mostra a tela principal do aplicativo. Nela, são apresentadas as
duas etapas relacionadas à composição. Na primeira etapa, a musical, o usuário
precisa:
• escolher o tom musical, seja ele maior ou menor. Nesse ajuste, é possível ver
a armadura da escala na figura ao lado do tom escolhido;
• decidir se a geração do algoritmo deve se ajustar à escala do tom escolhido
marcando a opção “Ajustar à escala”. Do contrário, as notas terão suas alturas
absolutas de acordo com a geração do algoritmo escolhido;
• inserir o número de notas que devem ser geradas pelos algoritmos — com exceção do L-Systems que gera as notas de acordo com o número de derivações,
este também inserido pelo usuário;
• requisitar, ou não, a geração do arquivo MIDI. Nesta etapa, quando se escolhe
por gerar o arquivo MIDI, escolhe-se também a velocidade, em bpm (beats per
minute), que o instrumento deve interpretar a peça musical gerada ao final
da execução;
No caso da geração do arquivo MIDI, o usuário precisa:
• escolher o instrumento desejado para interpretar a peça gerada;
• decidir se as notas devem se posicionar nas oitavas centrais do instrumento
escolhido.
Para a interpretação da partitura no arquivo MIDI, foram escolhidos 6 instrumentos: piano, xilofone, violino, cello, saxofone tenor e flauta. O piano foi adotado
como instrumento padrão para o aplicativo por dois motivos: notas fora da extensão do piano não são muito utilizadas em composições musicais e, mantendo essa
extensão, não há o risco do aplicativo gerar notas fora do espectro audível dos humanos. Por isso, todas as notas devem estar no intervalo de 1 a 88, o número de
teclas do piano. Quando os algoritmos geram números fora desse intervalo, esses são projetados na última oitava do piano — visto que não foi implementado
algoritmo que gera número negativo — e quando o número gerado é 0 (zero), o
aplicativo trata o mesmo como uma pausa.
Na segunda etapa, a algorítmica, o usuário precisa escolher os algoritmos geradores para as alturas e durações das notas e são 4 os algoritmos: Fibonacci, DNA,
Constantes e L-Systems. Os mesmos são descritos na Seção 3.1.1.
26
Figura 3.1: Tela principal
Mesmo implementando todo o núcleo do aplicativo em C++, a compilação foi
feita no Qt Creator para o Apple Mac OS, usando a versão 4.5.3 do Qt devido às
bibliotecas gráficas utilizadas para a geração das telas.
27
3.1.1
Algoritmos
Foram implementados 4 algoritmos mais uma forma de entrada customizada do
usuário, ou seja, é possível, além de inserir valores próprios do usuário, modificar
a geração dos algoritmos — caso algum já o tenha feito.
Fibonacci
A sequência de Fibonacci é, resumidamente, uma sequência de números na qual
∀n > 1, F (n) = F (n − 1) + F (n − 2) sendo que F (0) = 0 e F (1) = 1, ou seja, um
número é sempre a soma dos seus dois antecessores.
DNA
Esse é o algoritmo gerador que associa 4 valores determinados pelo usuário às proteínas A, T, G e C de uma sequência de DNA. Assim, o usuário escolhe as notas
que devem ser associadas às proteínas e, para o tempo, escolhe as figuras musicais que devem ser associadas às proteínas. Ambas associações podem ser vistas
nas Figuras 3.2 e 3.3, respectivamente. Assim que escolhidos os valores, o usuário
deve escrever a cadeia de DNA na caixa de texto que será habilitada com as proteínas. A caixa de texto não é case sensitive. Esse é um algoritmo interessante pois
transforma uma cadeia de DNA de um determinado ser vivo em música.
Figura 3.2: Janela de entrada de dados para DNA — altura.
28
Figura 3.3: Janela de entrada de dados para DNA — duração.
Constantes
Um outro algoritmo gera n números iguais, estes escolhidos pelo usuário. Este
pode ser útil para verificar e experimentar um determinado algoritmo para notas
— sendo, então, usado no tempo — ou para verificar um para tempos — sendo,
então, usado nas notas.
L-Systems
A opção L-Systems implementa as ideias de McCormak (1996) relatadas na Seção 2.8, interpretando cada letra do alfabeto do sistema como uma nota musical,
mais especificamente de acordo com a notação inglesa. A única diferença é a inclusão da letra P no alfabeto do sistema que gera um silêncio, uma pausa. Dessa
maneira, seja a seguinte tripla G = hΣ, P, αi onde Σ é o alfabeto do sistema2 ,
α ∈ Σ+ é uma palavra não nula chamada de axioma e P ⊂ Σ × Σ∗ é o conjunto
finito de regras de produção. Considere essa definição de L-Systems com o alfabeto
Σ = {A, B, C, D, E, F, G, P }, correspondente aos nomes das notas musicais na notação inglesa mais o P que é representada como uma pausa, o axioma α = C e duas
produções: C → CE, E → EGC. Assim, as palavras obtidas por três derivações
Σ∗ é o conjunto de todas as palavras sobre Σ e Σ+ é o conjunto de todas as palavras não nulas
sobre Σ.
2
29
dessas produções sobre α geram, em cada etapa, as seguintes strings: CE, CEEGC,
CEEGCEGCGCE. Ao final, concatena-se todas essas strings e o axioma gerando o
seguinte resultado: CCECEEGCCEEGCEGCGCE.
Na Figura 3.4, são vistos os parâmetros de entrada para a altura da nota: o
axioma, o número de derivações e as produções — até 4, no máximo. Na Figura 3.5
também são vistos os mesmos parâmetros de entrada para a duração da nota.
Figura 3.4: Janela de entrada de dados para L-Systems — altura.
Usuário
Finalmente, a última opção trata-se da inserção aleatória do usuário, que pode ser
considerado um algoritmo estocástico. Porém, quando o usuário solicita a um outro
algoritmo que gere os valores e posteriormente seleciona esta opção, o aplicativo
não descarta o que já foi gerado. Assim, a caixa de texto é habilitada para edição
permitindo a ação direta do usuário no resultado desejado sendo necessário apenas
que os valores sejam separados por vírgulas
30
Figura 3.5: Janela de entrada de dados para L-Systems — duração.
3.1.2
Extensão dos instrumentos
Durante a fase de testes, percebeu-se uma necessidade de poder ajustar as notas a oitavas mais naturais dos instrumentos escolhidos e de uma forma a evitar
intervalos compostos (ver Med 1986; pg. 62). Isso se deve ao fato de, muito frequentemente, execuções de peças musicais não utilizarem toda a extensão dos instrumentos. Certamente, isso limitaria ouvir absolutamente a geração dos algoritmos.
Por isso, criou-se uma opção que pode ser habilitada, ou não, pelo usuário: Oitavas
centrais. A Figura 3.6 mostra a faixa de abrangência adotada pelo sistema — não
toda a extensão dos respectivos instrumentos.
Figura 3.6: Oitavas centrais dos instrumentos disponíveis no aplicativo
31
Para explicar o ajuste das notas quanto ao menor intervalo possível, toma-se
como exemplo a string anterior gerada a partir de um L-Systems na Seção 3.1.1.
Esse exemplo gerou a partitura vista na Figura 3.7. Percebe-se que a partitura
está sempre no intervalo de uma determinada oitava. Assim, quando a opção Oitavas centrais é habilitada, a partitura não mais se posiciona numa única oitava —
respeitando a regra do menor intervalo — gerando a partitura vista na Figura 3.8.
Olhando com um pouco mais de atenção à Figura 3.8, é possível verificar a ação
deste algoritmo do menor intervalo justamente na passagem da nota Sol para a
nota Dó no segundo compasso.
Figura 3.7: Exemplo de partitura gerada por L-Systems
Figura 3.8: Atuação do método ArrangeForBestOctaves
3.1.3
Escalas
Algoritmos geram sequências de números que, quando transformados em notas
musicais, não respeitam as regras tonais da música ocidental. Pensando nesse problema, projetou-se um método, ArrangeOverKey, que faria exatamente esse ajuste
deixando qualquer algoritmo gerador útil para experimentação na composição musical. Esse método é chamado quando a opção “Ajustar à escala” é selecionada na
interface gráfica como visto na parte superior esquerda da Figura 3.1. Dessa maneira, o usuário pode ter a composição gerada por quaisquer algoritmos no tom
musical desejado, ajustando as notas à escala maior ou menor.
Na Figura 3.9, usou-se o algoritmo gerador da sequência de Fibonacci para a
altura e, para o tempo, constantes. Percebe-se que não há uma percepção tonal à
medida que as notas são geradas. Já na Figura 3.10, foi feito um ajuste da mesma
sequência para o tom de Ré maior. Apesar de, nas duas figuras, a armadura apontar o mesmo tom, há uma diferença quando se ajusta a peça gerada à escala do tom
escolhido.
32
Figura 3.9: Exemplo de composição gerada pela sequência de Fibonacci
Figura 3.10: Sequência de Fibonacci ajustada ao tom de Ré maior
3.2
Classes
A idealização do projeto envolveu uma pesquisa sobre as ferramentas de apoio à
programação e sobre a linguagem a ser utilizada. Após essa pesquisa, foi necessário
planejar como o programa seria construído. Precisava-se saber quais os tipos de
entrada que o programa iria tratar, a estratégia de programação na divisão dos
módulos, a responsabilidade de cada módulo e como seria o fluxo de dados e a
geração da saída. Sabia-se que a implementação seria orientada a objetos e, por
isso, usou-se a linguagem UML para modelar o sistema.
A UML (Unified Modeling Language) tem origem na compilação, em 1994, das
melhores práticas de engenharia de software3 que provaram ter sucesso na modelagem de sistemas grandes e complexos. É uma linguagem de modelagem livre
que permite aos desenvolvedores a facilidade de visualizar o sistema em diagramas
padronizados sendo que a utilização desses diagramas facilitam a documentação,
manutenção e também ajudam a compreender melhor os requisitos de um sistema
antes de implementá-lo (Fowler 2003). A ferramenta escolhida para trabalhar com
a modelagem UML foi o Jude4 , por ser escrito em Java, ou seja, pode ser executado em qualquer computador que contenha uma máquina virtual Java instalada
no sistema operacional.
3
Segundo Fernandes (2003), "A engenharia de software é a disciplina do conhecimento humano
que tem por objetivo definir e exercitar processos (humanos atuando como máquinas), métodos
(planos de processos), ferramentas e ambientes (máquinas apoiando processos e métodos) para
construção de software que satisfaça necessidades de cliente e usuário dentro de prazos e custos
previsíveis."
4
Embora seja conhecido agora como astah* UML, ainda era conhecido como Jude no período de
implementação do aplicativo. Essa ferramenta pode ser facilmente encontrada no seguinte endereço: http://astah.change-vision.com/en/product/astah-uml.html
33
Três classes foram modeladas independentemente da interface gráfica. Essas
classes são o núcleo do sistema e responsáveis por transformar todos os dados inseridos pelo usuário em notas musicais no formato do Lilypond.
A Figura 3.11 mostra a classe TAlgo que é a responsável por calcular a saída
dos algoritmos utilizados na geração da altura e das durações das notas musicais. Todos os dados calculados são guardados em dois atributos vetores do tipo
inteiro: NoteFromAlgorithm, para as notas (melodia); e TimeFromAlgorithm, para
as durações das notas (ritmo). Os métodos dessa classe getFib, getConst, getDNA
e getLSystems são os responsáveis por gerar os dados relacionados à sequência de
Fibonacci, às constantes, à sequência de DNA e às derivações das produções do
L-Systems, respectivamente. Os métodos NormalizeNotes e NormalizeTimes têm o
papel de normalizar os valores obtidos pelos algoritmos, ou seja, o primeiro coloca
todos os valores até 88 e o segundo até 155 , no máximo.
Figura 3.11: Classe TAlgo
A Figura 3.12 apresenta a classe TMusical. Esta classe trata de tudo o que
diz respeito à parte musical do sistema. Nela estão informações como compasso,
tom (maior ou menor), altura e duração das notas e o instrumento que irá inter5
Quinze são as possibilidades de duração implementadas no aplicativo incluindo figuras pontuadas
34
pretar a música no arquivo MIDI. Também estão métodos que ajustam as notas a
um determinado tom — ArrangeOverKey, auxiliado pelos métodos ArrangeMajor
(Figura 3.13) e ArrangeMinor — e a oitavas centrais do instrumento escolhido —
ArrangeForBestOctaves (Figura 3.14). O método ArrangeForBestOctaves também
mantém o menor intervalo entre as notas geradas e só é chamado quando a opção
“Oitavas centrais”, vista na Figura 3.1, é selecionada. Quando nenhum instrumento é escolhido, usa-se o piano como instrumento padrão.
Figura 3.12: Classe TMusical
35
Figura 3.13: Método ArrangeOverKey
O método ArrangeMinor tem a mesma estrutura do método ArrangeMajor mudando apenas os valores dos intervalos que diferem da escala maior para a escala
menor.
Após gerar as notas e durações e ajustá-las musicalmente, foi necessário escrevêlas no arquivo de saída no formato padrão do Lilypond. Nessa etapa, a classe TWriter, Figura 3.15, trata toda a geração desse arquivo. O método WriteLy escreve, no
arquivo, os comandos da sintaxe no formato padrão do Lilypond sendo auxiliado pe-
36
Figura 3.14: Método ArrangeForBestOctaves
los métodos WriteMIDI — que escreve os comandos para se gerar o arquivo MIDI
quando requisitado —, WriteKeySignature — que escreve o tom musical escolhido
37
pelo usuário — e WriteForInstrument — que escreve o nome do instrumento escolhido pelo usuário e, no caso do piano, escreve as partes da clave de sol e de fá.
Quando a escrita de uma nota é solicitada, o método WriteNote recebe um vetor
contendo todas as informações da nota — nome, acidente, oitava correspondente
(altura) e duração — e então interpreta essas informações escrevendo no arquivo
de saída.
Figura 3.15: Classe TWriter
Para a interface gráfica, quatro classes foram projetadas para cada uma das
quatro telas de input do sistema: DNA (altura), DNA (tempo), L-Systems (altura),
L-Systems (tempo). Essas classes tratam apenas da formatação dos dados inseridos
pelo usuário em cada tela e os transferem para a classe principal do sistema que,
por sua vez, transfere para as classes TAlgo, TMusical e TWriter.
A classe principal, MainWindow, guarda todos esses dados. É ela quem cria
os objetos relacionados às três classes mencionadas anteriormente sendo o cérebro
de todo o sistema chamando os métodos quando devem ser chamados, colocando
as informações nos seus devidos objetos, chamando outras telas e tratando ações
como sair do sistema e salvar o arquivo de saída. Na Figura 3.1, vê-se, na tela principal do sistema, as opções relacionadas tanto à parte musical quanto à parte algorítmica da composição guiada, antes exposta como um dos objetivos do trabalho.
38
Nesta tela, foram utilizados várias classes do Qt como QComboBox, QCheckBox,
QTextLineEdit, QGraphicsView, QRadioButton, etc.
3.3
Ferramentas utilizadas
A escolha das ferramentas se deu pela praticidade e facilidade de codificação, objetivando prover a melhor experiência para o usuário final do protótipo e a melhor
estrutura de apoio para possíveis trabalhos futuros. Estas são de alta confiabilidade e tradição, cada uma em sua área.
3.3.1
A Linguagem C++
C++ é uma linguagem de programação orientada a objetos de uso geral. Desde a
década de 90, é uma das linguagens mais populares no meio comercial, sendo também utilizada no meio acadêmico, por ser de alto desempenho. Stroustrup (1994)
desenvolveu o C++6 em 1983 no Bell Labs como um adicional à linguagem C7 e, com
o tempo, novas características foram sendo adicionadas como: sobrecarga de operadores, herança múltipla, templates e tratamento de exceções (Stroustrup 1994).
Em seu livro The Design and Evolution of C++, Stroustrup (1994) descreve algumas características e regras dessa linguagem de programação:
• C++ é desenvolvido para suportar vários paradigmas;
• C++ é desenvolvido para ser o mais compatível possível com C, fornecendo
transições simples para código C;
• C++ é desenvolvido para ser uma linguagem tipada estaticamente e de propósito geral que é tão eficiente e portátil quanto o C.
O C++ introduziu alguns conceitos da orientação a objetos à linguagem de programação C, como exemplificado pelas classes, que apresentam quatro características presentes em linguagem de programação orientadas a objeto: abstração, encapsulamento, herança e polimorfismo. Cada vez que uma classe é instanciada, é
6
O C++ originalmente era chamado de C with Classes, ou seja, C com classes
A linguagem C foi criada por Dennis Ritchie em 1972 no Bell Labs. A primeira grande utilização
dessa linguagem foi o desenvolvimento do sistema operacional UNIX, que até então era escrito
em assembly. É uma linguagem de propósito geral, no entanto, é mais utilizada para escrever
compiladores, analisadores léxicos, bancos de dados, editores de textos, enfim, softwares básicos.
7
39
criado um objeto na memória, que é basicamente um conjunto de atributos (variáveis) e métodos (funções).
Pontos positivos do C++ incluem: a produção de código o mais eficiente possível,
fazendo uso de otimizações agressivas e sofisticadas dos compiladores mantendo,
no entanto, alta flexibilidade, portabilidade e consistência; a linguagem não está
ligada a nenhuma empresa como o Java — Sun Microsystems — ou Visual Basic
— Microsoft —, assim, a padronização é responsabilidade da ISO.
3.3.2
O LilyPond
O LilyPond é um sistema multiplataforma de formatação automática de músicas e
tem uma sintaxe amigável para a composição gerada em seus arquivos de entrada
que são compilados para gerar partituras (Horsburgh 2007). Essas podem ser geradas no formato PDF (Portable Document File), PNG (Portable Network Graphics),
PostScript e TEX, visando a impressão de alta qualidade além de produzir arquivos
no formato MIDI com a introdução do comando \midi, viabilizando escutar a obra
gerada.
Fazia-se necessário um bom sistema de notação musical que fosse possível de
ser incorporado na aplicação uma vez que construir tal sistema não fazia parte dos
objetivos do trabalho. Assim, foi possível fazer com que o programa gerasse, na
saída, o arquivo de entrada para o sistema de notação que se encarrega de gerar
um arquivo de áudio, caso requisitado, e o arquivo de leitura, gerado em todas as
execuções do aplicativo.
Esses são os arquivos de texto em ASCII8 contendo os comandos que serão compilados pelo LilyPond e, basicamente, a versão e as notas. As notas e os comandos,
segundo Horsburgh (2007), devem estar entre chaves como visto na Figura 3.16:
Esse conteúdo já basta para criar a partitura, Figura 3.17, em qualquer formato
suportado pelo LilyPond. O comando \version é usado para a compatibilidade de
partituras entre as versões do LilyPond. A versão adotada para a utilização no
projeto foi a “2.12.2” instalado no sistema Mac OS X da Apple. Sua execução se
dá por linha de comando, o que torna o programa bem leve mas há softwares que
implementam interfaces gráficas para o LilyPond como o Denemo.
8
American Standard Code for Information Interchange. É uma codificação de caracteres de sete
bits baseada no alfabeto inglês.
40
Figura 3.16: Arquivo no formato Lilypond com música para violino e piano
Figura 3.17: Música para violino e piano
3.3.3
MIDI
MIDI é abreviação de Musical Instrument Digital Interface e é uma tecnologia padronizada de comunicação entre instrumentos musicais e equipamentos eletrônicos
possibilitando que uma composição musical seja executada, transmitida ou manipulada por qualquer dispositivo que reconheça esse padrão. MIDI é um protocolo
que, diferentemente de outros formatos (como MP3 e OGG Vorbis), não contém o
áudio propriamente dito, mas instruções para produzi-lo. Ele foi desenvolvido em
um ambiente onde a comunicação entre instrumentos musicais não existia. Então,
um grupo de fabricantes se juntou para criar esse padrão.
Cada mensagem MIDI é, geralmente, composta por 3 palavras e é enviada serialmente. Cada palavra é composta de 10 bits, sendo 8 bits de dados e 2 bits
para sinalização de início e final de palavra. Os arquivos MIDI guardam notações
musicais e informações que a placa de som precisa para tocá-las. Assim, os arquivos MIDI são bem pequenos e fáceis de se copiar e disponibilizar via Internet. Há
uma especificação para sintetizadores onde vários requisitos são impostos além da
41
norma MIDI mais geral: o General MIDI. Inicialmente, os instrumentos compatíveis com o General MIDI têm que (Association 2009):
• permitir 24 vozes de polifonia;
• responder à velocidade;
• suportar 16 canais simultâneos (o canal 10 deve ser reservado para ritmo);
• suportar polifonia em cada canal.
Os instrumentos também devem obedecer às convenções para eventos de programa e controles. Os eventos de program change correspondem a um número de 1
a 128 com pianos, percussão cromática e não-cromática, órgãos, guitarras, baixos,
cordas, orquestra, metais, palhetas, flautas, solos sintéticos (onda quadrada, onda
dente de serra, etc), fundos sintéticos, efeitos sonoros sintéticos, instrumentos étnicos e efeitos sonoros (respiração, helicóptero, aplausos, etc). O canal 10, reservado
para ritmo, corresponde a um número de 35 a 81. Os efeitos de controle são operações realizadas por vários controladores tais como modulação, volume, expressão,
desligar todas as notas, etc.
3.3.4
Interface gráfica - Qt
O Qt é um framework de aplicações multiplataforma que teve o desenvolvimento
iniciado em 1991. Usando o Qt, é possível desenvolver aplicações e interfaces gráficas de uma vez e implementá-los em muitos desktops e sistemas operacionais sem
reescrever o código fonte. O Qt é notavelmente utilizado na interface KDE, Opera,
Google Earth, Skype, etc. A empresa responsável pela criação do Qt é a norueguesa
Trolltech. A seguir, um exemplo de aplicação que pode ser desenvolvida em Qt na
Figura 3.18.
Esse framework é bastante utilizado para o desenvolvimento de programas com
interface gráfica mas também é utilizado para o desenvolvimento de programas
que não tenham interface gráfica como ferramentas de console e servidores. O
Qt usa C++ com diversas extensões “não-padrões” implementadas por um préprocessador adicional que gera código C++ padrão antes da compilação. O Qt também pode ser utilizado em diversas linguagens de programação: Ada (QtAda), C#
(Qyoto/Kimono), Java (Qt Jambi), Pascal, Perl, PHP (PHP-Qt), Ruby (RubyQt) e
Python (PyQt).
42
Figura 3.18: Exemplo de aplicação em Qt
Liberado pela Trolltech9 , é disponível nas seguintes plataformas:
• Unix/Linux - Qt/X11 para sistema “X Window”
• Mac OS X (Apple) - Qt/Mac
• Microsoft Windows - Qt/Windows
• Plataformas embarcadas (PDA, Smartphone, etc.) - Qt/Embedded
• Windows CE - Qt/WinCE
• Java - Qt Jambi
• Plataforma de aplicação para dispositivos computacionais móveis
baseados em Linux - Qt Extended
Há quatro edições do Qt disponíveis para cada uma dessas plataformas:
• Qt Console - edição para desenvolvimento sem interface gráfica
• Qt Desktop Light - edição leve para desenvolvimento com interface gráfica
sem suporte a web a base de dados
• Qt Desktop - edição completa
9
Recentemente, esta empresa foi comprada pela Nokia.
43
• Qt Open Source Edition - edição completa com algumas exceções. Para
desenvolvedores de software livre e de código aberto.
O Qt pode ser encontrado no link http://qt.nokia.com/ onde tem todas as
informações necessárias para a instalação, a
O desenvolvimento desse software foi, primeiramente, concluído no XCode, um
ambiente de desenvolvimento para Mac OS X, sem a interface gráfica e com as
bibliotecas padrão do C++. Após alguns testes de composição, que se verificou
a usabilidade e a corretude do código, acrescentou-se a interface gráfica. Desta
forma, este capítulo abordou os detalhes de codificação do protótipo de utilização
de algoritmos na composição musical.
44
Capítulo 4
Conclusão
No presente trabalho, foi implementado um programa capaz de ser uma boa ferramenta no auxílio à composição. São várias as opções que ajudam o compositor
a expandir seus próprios horizontes para ajudá-lo no processo criativo de composições como os algoritmos implementados e diferenciados para altura e tempo da
nota, deixando ele mesmo interferir na saída do algoritmo para melhor atender às
suas necessidades e ideias, e opções variadas de instrumentos que ajudam a ver
como a obra soará no final.
Os objetivos estabelecidos foram alcançados, o que proporcionou grande aprendizado para este autor na modelagem das classes, na programação orientada a
objetos e na implementação de uma interface gráfica.
4.1
Resultados obtidos
A implementação da função ArrangeOverKey, auxiliada pelas funções ArrangeMajor e ArrangeMinor, ajudou na possibilidade de inserção e utilização de qualquer
algoritmo no protótipo já que esses agora passam a não mais gerar valores “soltos”
musicalmente passando a atender às regras tonais da música ocidental.
O método ArrangeForBestOctaves, auxiliado pelo ArrangeForOctaves, revelouse muito útil no ajuste musical das saídas dos algoritmos geradores. Ele propiciou
uma sonoridade melhor às peças até então testadas trazendo as notas dos extremos
para a região central do instrumento tornando, também, os intervalos os menores
possível para tornar a execução da peça mais natural. Assim, caso a composição
45
esteja sendo feita para uma interpretação cantada, não haverá dificuldades para o
intérprete além de tornar a obra um pouco mais atraente também.
A implementação dos L-Systems, para altura e duração da nota, também foi
uma grande conquista para o trabalho já que no início das pesquisas, do projeto e da
implementação ainda não se planejava implementá-los. A partir disso, percebeuse a grande característica do protótipo: a possibilidade de fácil inserção de novos
algoritmos e a rapidez de fazê-lo.
4.1.1
Composições
As figuras abaixo mostram alguns resultados de composições obtidos através de
testes variados com diferentes combinações de algoritmos geradores.
L-Systems (altura) e L-Systems (duração)
Figura 4.1: Composição em Ré maior.
DNA (altura) e DNA (duração)
Figura 4.2: Composição em Dó maior.
46
Fibonacci (altura) e Constantes (duração)
Figura 4.3: Composição em Sol menor.
4.2
Trabalhos futuros
Viu-se que é muito difícil achar algoritmos puros que gerem boas composições. Por
isso, é necessário gerar formas de fazer com que o compositor os altere de maneira
a servi-lo com os melhores resultados que ele poderia ter com aquele algoritmo.
Com essa visão, trabalhos futuros podem incluir novos algoritmos geradores
tais como:
• Cadeias de Markov;
• Triângulo de pascal;
• Constante π;
• Fractais;
• Autômatos celulares;
• L-Systems probabilísticos;
• etc.
Também há uma necessidade de se fazer melhor integração do protótipo com
o Lilypond a fim de incorporar o máximo de recursos possível desse sistema de
notação musical. Pode-se fazer também com que o protótipo trabalhe mais musicalmente pois ele não respeita a métrica dos compassos por causa dos algoritmos
que apenas geram valores deixando uma fraca divisão de compassos com o próprio sistema de notação musical. Com isso, seria possível trabalhar com outros
compassos além do 4/4 que está sendo usado. Essas melhorias dariam uma maior
47
liberdade para o usuário pois quanto menos restrito musicalmente o protótipo for,
melhor vai ser o auxílio do mesmo na parte criativa do compositor. É possível que
se implemente uma pré-visualização da partitura que será gerada com os recursos
do Qt que possibilita também a execução do arquivo MIDI no próprio protótipo.
Finalmente, trabalhos futuros podem incluir a possibilidade de se compor mais
vozes além da melodia que já se gera, trabalhando a harmonia, incluindo acordes,
mais instrumentos tocando simultaneamente, etc.
48
Referências
Algorithmic Music (2009). Algorithmic composition. In Internet: http://
en.wikipedia.org/wiki/Algorithmic\_music/. Acessado em Setembro de
2008.
Anders, T. (2007). Composing Music by Composing Rules: Design and Usage of a
Generic Music Constraint System. PhD thesis, Queen’s University Belfast.
Ariza, C. (2005). Navigating the landscape of computer-aided algorithmic composition. In Proceedings of the International Computer Music Conference, pages
765–772.
Association, M. M. (2009). The Complete MIDI 1.0 Detailed Specification.
Barthel-Calvet, A.-S. (2002). Portrait(s) de Iannis Xenakis. François-Bernard Mâche.
Burns, K. H. (1994). The History and Development of Algorithms in Music Composition. PhD thesis, Ball State University.
Buxton, W. (1977). A composer’s introduction to computer music. Interface, 6(2):57–
72.
Cope, D. (1991). Computer and Musical Style. Oxford University Press, Oxford.
Doornbusch, P. (2009). The music of csirac. In Internet: http://www.csse.
unimelb.edu.au/dept/about/csirac/music/introduction.html. Acessado em Novembro de 2009.
Dostál, M. (2002). Genetické algoritmy jako nástroj automatického generování
rytmického doprovodu. Master’s thesis, Slezská univerzita.
Essl, K. (2007). Algorithmic Composition. Cambridge University Press.
Fernandes, J. H. C. (2003). Qual a prática do desenvolvimento de software? Ciência
e Cultura, 55(2).
Ferraz, S. (1999). Criação musical com suporte tecnológico. In Internet: http:
//silvioferraz.net/anp99.htm. Acessado em Dezembro de 2008.
Figueiró, C. (2005). Composição interativa - estratégias e relatos de processos.
Master’s thesis, Universidade Federal de Goiás.
49
Fowler, M. (2003). UML Distilled: A brief guide to the Standard Object modeling
language. Addison-Wesley.
Gerhard, D. and Hepting, D. H. (2004). Cross-modal parametric composition. In
Proceedings of the International Computer Music Conference, pages 505–512.
Harris, W. (2009). The art of realtime composition. In Internet: http://
community.middlebury.edu/~harris/MusicPapers/MusicAlive.html.
Acessado em Novembro de 2009.
Hofstadler, D. (1995). Fluid concepts and creative analogies: Computer models of
the fundamental mechanisms of thought. Basic Books.
Horsburgh, C. (2007). Lilypond documentation. In Internet: http://lilypond.
org/doc/v2.10/Documentation/. Acessado em Outubro de 2008.
Jones, K. (1980). Compositional applications of stochastic processes. Computer
Music Journal, 5(2):45–61.
Koenig, G. M. (1970a). Project 1: A programme for musical composition. Electronic
Music Report, 2:32–44.
Koenig, G. M. (1970b). Project 2: A programme for musical composition. Electronic
Music Report, 3:1–16.
Lindenmayer, A. (1968). Mathematical models for cellular interaction in development, parts i and ii. Journal of Theoretical Biology, 3.
Lorrain, D. (1980). A panoply of stochastic ‘cannons’. Computer Music Journal,
4(1):53–81.
Lourenço, B. (2009). L-systems, scores and evolutionary techniques. In Proceeding
of the 6th Sound and Music Computing Conference, pages 113–118.
Manousakis, S. (2006). Musical L-systems. Master’s thesis, The Royal Conservatory, The Hague.
McCormak, J. (1996). Grammar based music composition. In Complex Systems 96:
From Local Interactions to Global Phenomena, pages 320–336.
Med, B. (1986). Teoria da Música. Musimed.
Middleton, J. (2004). An interactive exploration of the relationship between music and mathematical formulas. In Internet: http://musicalgorithms.ewu.
edu/. Acessado em Dezembro de 2008.
Miletto, E. M., Costalonga, L. L., Flores, L. V., Fritsch, E. F., Pimenta, M. S., and
Vicari, R. M. (2004). Introdução à computação musical. IV Congresso Brasileiro
de Computação.
Miranda, E. R. (2000). Composing Music With Computers. Focal Press, Oxford.
50
Miranda, E. R. and Billies, J. A. (2007). Evolutionary Computer Music. Springer.
Mozer, M. C. (1994). Neural network music composition by prediction: Exploring
the benefits of psychoacoustic constraints and multi-scale processing. Connection
Science, 6(2):247–280.
Muscutt, K. (2007). Composing with algorithms: An interview with David Cope.
Computer Music Journal, 31(3):10–22.
Nauert, P. (2007). Division - and addition - based model of rhythm in computerassisted composition system. Computer Music Journal, 31(4):59–70.
Noguchi, H. (1997). Mozart - musical game in C K. 516f. In Internet: http:
//www.asahi-net.or.jp/~RB5H-NGC/e/k516f.htm. Acessado em Novembro de 2008.
Prusinkiewicz, P. (1986). Score generation with l-systems. In Proceedings of International Computer Music Conference, pages 455–457.
Prusinkiewicz, P. and Lindenmayer, A. (1990). The Algorithmic Beauty of Plants.
Springer, New York.
Roads, C. (1996). The Computer Music Tutorial. MIT Press.
Schillinger, J. (1948). The Mathematical Basis of the Arts. Philosophical Library,
New York.
Schoenberg, A. (1967). Fundamentals of Musical Composition. Faber & Faber,
London-Boston.
Spiegel, L. (1989). Distinguishing random, algorithmic and intelligent music. In Internet: http://retiary.org/ls/writings/alg_comp_ltr_to_cem.html.
Acessado em Novembro de 2009.
Stroustrup, B. (1994). The Design and Evolution of C++. Addison-Wesley.
Supper, M. (2001). A few remarks on algorithmic composition. Computer Music
Journal, 25(1):48–53.
Taube, H. K. (2004). Notes from the Metalevel: Introduction to Algorithmic Music
Composition. Swets & Zeitlinger, The Netherlands.
Verostko, R. (1999). Algorithmic art. In Internet: http://verostko.com/
algorithm.html. Acessado em Novembro de 2009.
Xenakis, I. (1971). Formalized music. Indiana University Press, Bloomington.
51

Documentos relacionados