Aplicações composicionais
Neste capítulo discutiremos uma das mais interessantes e promissoras ramificações do Projeto MPB: a composição assistida. Em termos bem sucintos, compor dentro sistema se dá através uma lógica em “engenharia reversa”, ou seja, tomando como base dados estatísticos compilados do processo de análise dos corpora. Importante frisar que não se trata de composição algorítmica (pelo menos em seu sentido mais conhecido), ou seja, um processo automatizado (ou semiautomatizado). Na verdade, poderíamos pensar que o sistema atuaria – em estágios específicos do processo composicional – apenas como um fornecedor de um espectro alternativas estatisticamente embasadas em relações a aspectos estruturais previamente mapeados (associados a alturas, ritmo e/ou harmonia) nas análises dos corpora. Assim, o(a) compositor(a) mantém sempre suas prerrogativas para tomar decisões e fazer o que entende como as melhores escolhas dentre as opções disponíveis a cada momento, conectando-las de modo lógico e criativo a uma estrutura imaginada para sua obra (o que não deixa de ser uma possível definição para o ato de compor).
Em outros termos, a composição dentro desse sistema não é, de modo algum, regida pelo determinismo, já que encontra a cada etapa uma considerável margem de flexibilidade. Isso pode ser constatado nos três principais eixos musicais alimentados pelos dados analíticos, a saber, harmonia, melodia e ritmo, como se segue:
Flexibilidade harmônica – as sequências de acordes geradas pelo algoritmo-compositor específico (ver mais à frente) são desvinculadas de quaisquer referências a posições métricas e durações.
Flexibilidade melódica – as sequências de c-letras, ou seja, as c-palavras geradas pelo algoritmo-compositor específico (ver mais à frente) indicam apenas “gestos de contorno” básicos, que podem ser realizados de modos consideravelmente distintos.
Flexibilidade rítmica – as sequências de r-letras, ou seja, as r-palavras geradas pelo algoritmo-compositor específico (ver mais à frente) são “agnósticas” em relação à métrica, o que significa que devem ser consideradas como unidades autônomas que podem ser posicionadas metricamente a critério do(a) compositor(a). Isso inclui também a liberdade de poder distanciar livremente unidades contíguas.
Flexibilidade de conexões – as c/r palavras (isto é, a conjunção de c- e r-palavras) devem ser vistas como unidades autônomas, sem relações mútuas de conexão.1
0.1 ALGORITMOS-COMPOSITORES
Em sua versão atual, o processo composicional dentro do sistema é baseado em três algoritmos-compositores, cada qual associado a um domínio estrutural-musical, a saber, harmonia, ritmo e alturas. Os três algoritmos são alimentados por dados estatísticos referentes a transições entre eventos contíguos, registrados nas matrizes de transição probabilística2 dos 10 corpora analisados. De um modo geral, os algoritmos operam da seguinte maneira: o usuário informa o corpus de referência, o evento-semente (que, dependendo do domínio selecionado, pode ser uma categoria funcional, uma r-letra ou uma c-letra) e o número de iterações desejado. O algoritmo então retorna uma estrutura completa (uma sequência de acordes, uma r-palavra ou uma c-palavra) que guarda – ao menos em termos probabilísticos – estreitos vínculos com o corpus selecionado.
Um simples exemplo ilustrará a lógica básica por trás do funcionamento dos três algoritmos. Considere uma matriz de transição probabilística com apenas quatro estados – w, x, y, z – e suas respectivas probabilidades de transição computadas (Figura 1). Assumamos agora que desejamos gerar uma sequência de três símbolos a partir da “semente” y, através da lógica básica dos algoritmos-compositores. Isso significa que precisaremos aplicar duas iterações (já que a “semente” y será o primeiro símbolo da sequência). Na primeira iteração, o algoritmo faz um sorteio ponderado das probabilidades de transição referentes à linha “y”.3 A transição escolhida (“x” no exemplo) se torna a nova “semente” para uma reaplicação do algoritmo, que retorna desta vez “z”, completando a extensão previamente estabelecida de três símbolos para a sequência (evidentemente, o processo poderia se estender indefinidamente, a depender do número de iterações desejado).

Os algoritomos-compositores empregados no sistema são descritos sucintamente a seguir:
- corporaKov2.py – código implementado em linguagem Python, recebe como input informações sobre o corpus considerado, o “acorde-semente”4 e o número de iterações desejado (ou seja, a extensão da sequência). O algoritmo retorna a sequência em três versões: (a) em categorias funcionais; (b) em cifras alfanuméricas e (c) em notação genealógica (ver glossário), como tipos acordais registrados no modelo GTA (ver capítulo sobre os modelos teóricos adotados no projeto). A Figura 2 apresenta o fluxograma referente ao algoritmo e um exemplo de sua aplicação.

- corporaKov_ritmo.py – código implementado em linguagem Python, recebe como input informações sobre o corpus considerado, a “r-letra-semente” (análoga à ideia do “acorde-semente) e o número de iterações desejado (ou seja, a extensão da sequência em número de r-letras). O algoritmo retorna como output uma r-palavra original (e probabilisticamente vinculada ao corpus em questão), juntamente com sua cardinalidade # (neste caso, o número total de ataques da r-palavra). A Figura 3 apresenta o fluxograma referente ao algoritmo e um exemplo de sua aplicação.

- corporaKov_contorno.py – código implementado em linguagem Python, recebe como input informações sobre o corpus considerado, a “c-letra-semente” e a cardinalidade (que deverá coerente à cardinalidade de uma r-palavra correspondente, previamente construída). A Figura 4 apresenta o fluxograma referente ao algoritmo e um exemplo de sua aplicação.

0.2 ESTRATÉGIAS COMPOSICIONAIS
Até o presente momento, duas estratégias de composição assistida dentro do sistema foram idealizadas, descritas sucintamente como se segue:
Estratégia 1 – é a que mais se utiliza dos dados estatísticos analisados. Sua principal limitação é ausência de controle para construções de estruturas relativamente complexas. Assim, é idealmente empregada em composições aforísticas, ou seja de curta duração.5
Um possível protocolo composicional com essa estratégia é descrito a seguir (imaginamos que outras possibilidades possam ser eventualmente propostas):
Selecionar o corpus de interesse (seja, por exemplo, JOBIM).
Determinar o número de c/r palavras que formará a peça a ser composta (consideremos, como uma breve ilustração, que a peça de nosso exemplo terá cinco c/r palavras).
Usar o algoritmo-compositor corporaKov_ritmo.py para gerar (cinco, no caso do exemplo) r-palavras.6 A Figura 5 esquematiza a produção das cinco r-palavras, a partir da aplicação sequencial do algoritmo, considerando as r-letras {g, n, e, g, o} e os respectivos números de iterações {2, 1, 3, 2, 1}.

- “Montar” as r-palavras na sequência do processo gerativo, distanciando-as livremente, fornecendo assim uma espécie de “esqueleto” rítmico-métrico para a composição.7 Em outros termos, as r-palavras devem ser vistas como blocos autônomos que podem ser posicionados metricamente a critério do usuário (sugere-se apenas evitar sobreposições ou elisões, de modo que a estrutura dos segmentos fique evidente). Obtem-se assim, em termos bem básicos, a estrutura formal da peça, cuja principal implicação é a definição do seu número de compassos. A Figura 6 propõe uma possível montagem das cinco r-palavras geradas no exemplo, resultando numa extensão total de sete compassos para a peça planejada.

- Usar o algoritmo-compositor corporaKov_contorno.py para gerar c-palavras devidamente compatíveis em cardinalidade em relação às r-palavras previamente geradas (Figura 7).8 Como a estrutura métrica da peça foi definida na etapa (4), as c-palavras geradas se integram automaticamente àquelas, formando assim c/r palavras.

Definir o ritmo harmônico desejado para a peça, o que será dependente do número de compassos previamente estabelecido em (4). Consequentemente, o número de acordes da estrutura harmônica é definido. Por simplicidade, consideremos no nosso exemplo um acorde por compasso, totalizando assim sete.
Usar o algoritmo-compositor corporaKov2.py para gerar a sequência de acordes (em seis iterações, no exemplo) que formará a estrutura harmônica da peça. Como nos outros casos, o usuário poderá fazer diversas tentativas até encontrar a sequência que mais lhe agrade. 9 A Figura 8 apresenta uma sequência harmônica gerada e selecionada para a peça do exemplo.

- Tomando as c-letras de cada c/r palavra como guia e mantendo uma coerência com o(s) acorde(s) que a sustenta(m), definir as alturas da linha melódica. Uma das muitas alternativas possíveis é proposta na Figura 9.

- Fazer, se necessário, pequenos ajustes na melodia composta, tais como: substituição de pausas por notas sustentadas (ou vice-versa), incluir ornamentos (ou mesmo breves conexões melódicas), trocas de registros em c-palavras etc.10
A estratégia 1 foi empregada pela primeira vez sistematicamente por Carlos Almada, em 2021, na composição de um ciclo de 14 pequenas peças para piano intitulado Jobiniaturas. Como o título sugere, a obra se referencia ao corpus Jobim (o primeiro a ser analisado no Projeto MPB). As 14 miniaturas evocam, cada qual à sua maneira, aspectos do universo jobiniano, na concepção particular de Almada. As peças alternam centros tonais (ou modais) maiores e menores, descrevendo uma trajetória escalar diatônica: Dó, Ré, Mi, Fá, Sol, Lá e Si.
Um vídeo dessa obra, na interpretação da pianista Tamara Ujakova, encontra-se disponível aqui.
Estratégia 2 – o “problema” da ausência de controle sobre a estrutura musical em alto nível foi recentemente equacionado com a idealização de uma segunda estratégia de composição assistida. Podendo também ser denominada uma “modelagem derivativa-estilística”, envolve, além dos processos markovianos da estratégia 1 (em menor escala, como veremos), uma concepção evolutiva-musical. Isso se dá a partir de uma adptação simplificada do Modelo de Análise Derivativa (MDA, na sigla em inglês), adaptação esta identificada pelo acrônimo MDA*.11 As bases dessa ideia são apresentadas a seguir.
Microtransformações parcimoniosas (MTP)
O conceito de microtransformação parcimoniosa (doravante abreviado como MTP) pode ser definido como uma espécie de “edição” aplicada a um dos componentes de uma dada c- ou r-palavra, deixando os demais componentes inalterados. O prefixo “micro” se refere assim ao fato de que a transformação age no interior da palavra em questão e afeta um elemento isolado. Por outro lado, o adjetivo “parcimonioso” informa que a transformação operada é mínima, o que faz com que a palavra variante seja minimamente distinta da referencial. O sistema registra cerca de 20 MTPs (distribuídas pelos domínios das alturas e do ritmo), cujo detalhamente omitiremos neste capítulo.12 Para os presentes propósitos, basta apresentar sua ideia geral. A Figura 10 traz dois simples exemplos de MTPs.

Um algoritmo específico, intitulado SeleArt.py, aplica diversas MTPs a uma c- ou r-palavra referencial, produzindo variantes próximas (ou parcimoniosas). A ideia desse programa é fazer com que o usuário aja como um agricultor que seleciona a cada geração de sua criação animal/vegetal os espécimes mais vantajosos para seus propósitos (sabores, cores, tamanhos etc.). Em outros termos, o algoritmo busca replicar, no âmbito das c/r palavras, a lógica subjacente da seleção artificial biológica. Assim, a cada geração, o usuário/compositor seleciona a variante mais favorável (para seus propósitos, sejam eles quais forem), retendo-a para uma reaplicação do algoritmo, e assim por diante, criando assim verdadeiras linhagens “direcionadas” a algum objetivo composicional. A Figura 11 esquematiza o processo.

Como o que foi feito com a estratégia 1, protocolos podem ser ser também definidos. No entanto, dadas as características especiais da segunda estratégia, consideraremos duas fases: (a) modelagem da estrutura; (b) composição propriamente dita.
O protocolo de modelagem considera a estrutura formal e as relações derivativas da melodia (englobando alturas e ritmo).13 Envolve as seguintes etapas:
Selecionar o corpus de interesse.
Selecionar uma peça desse corpus que se deseje modelar. Considere o trecho hipotético apresentado na Figura 12 como um exemplo.

- Segmentar o trecho selecionado de modo a estabelecer uma estrutura de c/r palavras (Figura 13).

- Codificar a melodia (alturas e ritmos) de acordo com o modelo de Filtragem Melódica,14 criando assim, respectivamente, uma c-palavra e uma r-palavra para cada segmento (Figura 14).

- Com a definição das c/r palavras, mapear as replicações “fenotípicas” que por ventura existam na peça modelada. Nos termos da estratégia, isso significa identificar c/r palavras idênticas (considerando, claro, o nível das codificações realizadas). Ou seja, as unidades melódico-rítmicas são aqui tratadas como vinculadas em um todo homogêneo. A Figura 15 exemplifica como a análise das replicações é feita, considerando hipoteticamente as identidades entre as unidades 1/2 e 4/6.

- Finalmente, considerar as c-palavras e r-palavras como unidades autônomas que, eventualmente, “evoluem” de maneiras independentes em relação a outras. Tomando como metáfora os fenômenos biológicos (assim como foi feito na etapa anterior), denominamos o mapeamento das transformações nesse nível de derivações “gênicas” (que eventualmente também indicarão replicações). A representação dessas relações se dá por intermédio de um esquema em árvore genealógica (uma para cada domínio, c e r), identificando as relações derivativas e replicativas. A Figura 16 apresenta um breve exemplo das duas árvores. Os números entre parênteses ao lado de cada seta indicam os números de “edições” necessárias para transformar uma dada palavra “pai” em seu “filho”.15 Nesse sentido, a indicação (0) significa que não houve transformação, e sim replicação da c/r palavra referencial.

Concluída a primeira fase (modelagem), passa-se então à segunda, a composição assistida. O protocolo dessa fase consiste nas seguintes etapas:
- Gerar uma r-palavra-semente – a unidade rítmica referencial para o processo composicional-derivativo – por intermédio do algoritmo-compositor corporakov_ritmo.py. O corpus de input deverá ser, evidentemente, o mesmo da obra selecionada para modelagem. O usuário pode escolher livremente o número de r-letras de sua palavra-semente, bem como descartar r-palavras produzidas pelo algoritmo que porventura não lhe convenham, até a obtenção de uma unidade ideal. Seja o exemplo da Figura 17.

- Gerar, por intermédio do algoritmo-compositor corporakov_contorno.py, uma c-palavra correspondente à r-palavra-semente com a qual – importante destacar – deve compartilhar a cardinalidade, de maneira que ambas possam se integrar em uma unidade referencial “fenotípica”, que será numerada com “1”.16 A Figura 18 propõe uma alternativa para o exemplo da Figura 17, incluindo a acoplagem das duas palavras referenciais.

- Contextualizar metricamente a unidade referencial “1” (por exemplo, como mostra a Figura 19).

- Gerar uma “progressão-semente”, ou seja, uma breve progressão (com dois a cinco acordes) de maneira a dar suporte harmônico para o trecho correspondente à unidade “1” e que também possa servir de base para a estrutura harmônica da peça a ser composta. Essa progressão deverá ser criada por intermédio do algoritmo-compositor corporaKov2.py, tomando como input o corpus ao qual pertence à peça modelada. A escolha do acorde-semente pelo usuário é, claro, livre. De modo semelhante ao que se observa nas etapas anteriores, a geração da progressão-semente poderá ocorrer após um número indefinido de tentativas, até que o resultado seja adequado às intenções composicionais. A Figura 20 ilustra essa etapa com um exemplo na qual uma progressão-semente com três acordes (duas iterações) iniciada por I é gerada, incluindo a contextualização métrica da progressão criada.

- Construir uma linha melódica concreta para a unidade “1”, escolhendo notas que sejam coerentes com os respectivos acordes da progressão-semente e que obedeçam à sequência pré-estabelecidade c-letras. Um possível exemplo é apresentado na Figura 21.17

- A partir daí, seguir linearmente com a composição das demais unidades. Esse processo deve ser guiado pelo mapa de derivações previamente estabelecido na primeira fase da estratégia, produzindo as devidas variações das r- e c-palavras do “pai” imediato (ou replicando-as, se for o caso). Após geradas a r-palavra e, em seguida, a c-palavra referente à unidade (seguindo o procedimento-padrão), ela deve ser metricamente contextualizada (como na etapa 2). O suário/compositor deve então, para harmonizar a nova unidade, escolher livremente uma progressão acordal para o segmento.18 Com base nessa harmonia, a unidade variante/replicante pode ser concretizada, com a construção da linha melódica específica, nos moldes do que é apresentado na etapa 5. Repetir o processo construtivo até o último segmento. A Figura 22 resume as instruções desta etapa, considerando informações hipotéticas.

Por ser ainda bastante recente, a estratégia composicional 2 foi aplicada apenas experimentalmente. A modelagem de duas canções (uma composta por Jobim e a outra por Ivan Lins e Vitor Martins) resultaram em duas pequenas peças (também em formato de canções, porém sem texto), compostas e arranjadas para piano por Carlos Almada.19 A título de exemplificação, eis a versão digitalizada (mp3) da peça intitulada O mar de Johanna (que modelou Joana dos barcos, de Lins e Martins):
Referências
Notas de rodapé
Isso significa que são irrelevantes tanto as distâncias temporais entre o último ataque de uma determinada c/r palavra e o primeiro da c/r palavra seguinte, quanto os intervalos melódicos entre esses dois pontos de articulação.↩︎
Ver capítulo sobre processos markovianos.↩︎
Isto é, os valores maiores de probabilidade terão maior “chance” de serem escolhidos do que os menores. Contudo, isso não significa que uma probabilidade maior sempre será selecionada. Eventualmente, “supresas” nesse sentido podem ocorrer, o que é saudável para os propósitos composicionais e evita o determinismo do processo, algo que seria bastante indesejável em termos musicais.↩︎
Ou seja, uma categoria funcional a partir da qual o usuário pretende construir uma sequência harmônica↩︎
Recentente, a composição com essa estratégia foi usada como atividade de avaliação para os alunos de uma disciplina da grade do Pós-Graduação em Música da UFRJ, ministrada por Carlos Almada, Hugo Carvalho e Cecília Saraiva. Os resultados foram extremamente satisfatórios.↩︎
Vale aqui trazer uma observação importante: o usuário pode, claro, descartar as r-palavras que considerar inadequadas para sua peça e rodar o algoritmo quantas vezes forem necessárias, tendo em vista, claro, a qualidade do produto musical que se pretende criar. Ou seja, podemos acrescentar esta possibilidade às quatro flexibilizações acima apresentadas.↩︎
O que inclui determinar a fórmula de compasso para a peça.↩︎
A mesma observação feita em (3) sobre a seleção de resultados aplica-se aqui↩︎
Uma possível alternativa a esta etapa (em caso de grandes sequências, com 10 ou mais acordes) poderia ser subdividir o número total de acordes a se gerar em segmentos de menor extensão – como “frases harmônicas” – de maneira a se ter mais controle sobre as relações de coerência e, assim, favorecer uma melhor adaptação da harmonia criada às intenções composicionais↩︎
Uma etapa adicional – optativa, claro – poderia ser a criação de um arranjo (ou seja, uma concretização) da melodia harmonizada. Assim, a alternância de texturas diversas, a inclusão de linhas secundárias, de dinâmica, sinais de agógica e expressão etc. podem ser acionados em prol de um resultado esteticamente mais próximo de uma composição “convencional”.↩︎
Para descrições e maiores detalhes sobre MDA e MDA*, ver Almada (2023).↩︎
Planeja-se para um futuro próximo a produção de um artigo com a descrição detalhada dessas operações.↩︎
A modelagem da estrutura harmônica está atualmente em estudos e provavelmente será em breve implementada. Assim, provisoriamente, o tratamento da harmonia se processa na estratégia 2 de maneira consideravelmente mais livre do que na primeira estratégia composicional, como veremos.↩︎
Ver capítulo sobre os modelos teóricos do projeto.↩︎
A partir, claro, de hipóteses estabelecidas por quem analisa.↩︎
Tal unidade pode ser aproximadamente associada à ideia de Grundgestalt, de Arnold Schoenberg. Para maiores detalhes sobre o conceito, ver, entre outras fontes, Almada (2023).↩︎
Observe que, como as r-palavras definem apenas os pontos de ataque, a escolha por ligaduras ou pausas entre eles – como já foi enfatizado – é livre, a critério dos usuários/compositores.↩︎
Como já mencionado, um aperfeiçoamento desse processo – denominado modelagem harmônica – encontra-se en fase de desenvolvimento e irá substituir a prática atual.↩︎
Planeja-se formar um ciclo de 10 canções para piano, com peças modeladas provenientes de obras dos corpora analisados.↩︎