Uni e sidade do Minho
Escola de Engenha ia
Ped o Miguel Oli ei a da Sil a
Musikla
Music and Keyboa d Language
Agos o, 2020
Uni e sidade do Minho
Escola de Engenha ia
Ped o Miguel Oli ei a da Sil a
Musikla
Music and Keyboa d Language
Disse ação de Mes ado
Mes ado em Engenha ia In o má ica
T abalho e e uado sob a o ien ação do(a)
José João Dias de Almeida
Agos o, 2020
DIREITOS DE AUTOR E CONDIÇÕES DE UTILIZAÇÃO DO TRABALHO POR TERCEIROS
Es e é um abalho académico que pode se u ilizado po e cei os desde que espei adas as eg as e
boas p á icas in e nacionalmen e acei es, no que conce ne aos di ei os de au o e di ei os conexos.
Assim, o p esen e abalho pode se u ilizado nos e mos p e is os na licença abaixo indicada.
Caso o u ilizado necessi e de pe missão pa a pode aze um uso do abalho em condições não
p e is as no licenciamen o indicado, de e á con ac a o au o , a a és do Reposi o iUM da Uni e sidade
do Minho.
Licença concedida aos u ilizado es des e abalho
C ea i e Commons A ibu ion-NonComme cial-Sha eAlike 4.0 In e na ional
CC BY-NC-SA 4.0
h ps://c ea i ecommons.o g/licenses/by-nc-sa/4.0/deed.en
DECLARAÇÃO DE INTEGRIDADE
Decla o e a uado com in eg idade na elabo ação do p esen e abalho académico e con i mo que não
eco i à p á ica de plágio nem a qualque o ma de u ilização inde ida ou alsi icação de in o mações ou
esul ados em nenhuma das e apas conducen e à sua elabo ação.
Mais decla o que conheço e que espei ei o Código de Condu a É ica da Uni e sidade do Minho.
Ag adecimen os
Quando es amos pe an e um momen o impo an e da nossa ida, é ácil pensa mos nele como um mo-
men o ci cunspec o e isolado. Uma ase que acaba e ou a que começa. Um an es e um depois. Mas a
minha expe iência a é ago a mos ou-me que na e dade, a minha ida em sido mais um con ínuo. E
nesse con ínuo es ão um conjun o de pessoas sem o qual se ia impossí el pensa sonha em aze o que
iz.
Po isso mesmo, em p imei o luga , gos a a de ag adece p o undamen e ao meu o ien ado de disse -
ação, o P o esso José João Almeida, pela ajuda du an e odo es e p ocesso. Semp e p on o a ansmi i
expe iência e conhecimen o, no as ideias, c í icas cons u i as e posi i as, incen i ando-me a aga a o-
das as opo unidades, mas mais impo an e que udo, enco ajando-me semp e a segui ao meu p óp io
i mo e oma o meu p óp io caminho.
Gos a a ambém de ag adece aos meus colegas de cu so, em especial à So ia Sil a, semp e p on a
a ajuda pa a qualque dú ida que eu i esse e pa a me da mo i ação pa a segui em en e.
Também não me posso esquece de ag adece a odos os p o esso es que i e, em pa icula aos
p o esso es Ca los Ca alho, Luís Ce ejei a, Daniel Rego e Ped o Ribei o, que me ensina am, inspi a am,
e se es o ça am pa a me p o idência am opo unidades e expe iências que nunca i ei esquece , e que
me ab i am po as na ida que de ou a o ma me es a iam echadas.
E mais impo an e que udo, gos a a de ag adece à minha amília. À minha mãe, que semp e me
apoiou du an e odo o cu so e ez o que osse p eciso pa a o na a minha expe iência o melho possí el.
À minha ia, uma das pessoas mais abalhado as que conheço, que não pensa duas ezes an es de
me ajuda em udo o que eu p ecisa , e que es á semp e p esen e pa a me apoia . E inalmen e ao meu
i mão, a quem eu semp e quis segui os passos, e que me ez que e começa a p og ama desde os
doze anos de idade. Se não osse po ele, não es a ia a aze es a disse ação, nem a acaba es e cu so,
nem e ia ido as opo unidades que i e.
A odos, es ou e e namen e g a o. Mui o ob igado.
ÍNDICE
3.2 Solução P opos a .................................. 20
3.2.1 G amá ica da Linguagem .......................... 21
3.2.2 A qui e u a do Sis ema ........................... 25
3.2.3 Álgeb a Musical .............................. 27
4 Casos de Es udo 29
4.1 Toca Música .................................... 29
4.2 Fuga de Duas Vozes ................................. 30
4.3 De ini um eclado ................................. 31
4.4 Teclado de A peggios ............................... 32
4.5 Teclado Ge al com MIDI ............................... 33
4.6 QWERTY Keyboa d ................................. 34
4.7 Conclusão ..................................... 36
5 Desen ol imen o do In e p e ado Musikla 37
5.1 Análise Sin á ica .................................. 37
5.1.1 Desc ição Sin á ica ............................. 38
5.1.2 G amá ica ................................. 41
5.1.3 Reconhecedo Sin á ico ........................... 46
5.1.4 Con e são de PEG pa a LALR ....................... 46
5.1.5 Tooling ................................... 47
5.2 Semân ica Dinâmica ................................ 52
5.2.1 Con ex o .................................. 53
5.2.2 Scope de Símbolos ............................. 54
5.2.3 Módulos .................................. 55
5.2.4 Ope ado es Musicais ............................ 56
5.3 Biblio eca S anda d ................................. 61
5.3.1 Inpu s & Ou pu s .............................. 62
5.3.2 Fichei os de Som .............................. 66
5.3.3 G elhas .................................. 68
5.3.4 Teclados Musicais ............................. 70
5.3.5 Edi o Embu ido .............................. 78
5.3.6 T ans o mado es .............................. 80
5.4 Resumo do Desen ol imen o ............................ 82
6 Guia Rápido de U ilização 85
6.1 Módulos ...................................... 85
6.2 Con igu ação .................................... 86
6.3 Linha de Comandos ................................. 87
xii
ÍNDICE
7 Conclusão 89
7.1 T abalho Fu u o ................................... 90
Bibliog a ia 93
Apêndices 95
A G amá ica PEG 95
B G amá ica LALR 103
xiii
Lis a de Figu as
3.1 A qui e u a Ge al do P oje o ............................... 25
3.2 A qui e u a do In e p e ado ............................... 26
4.1 Pau a musical ge ada pela linguagem, e são áudio disponí el aqui5............ 31
5.1 Syn ax highligh ing da linguagem MusiKLa no edi o Visual S udio Code ....... 49
5.2 Cap u a de ec ã da página de documen ação da linguagem ............... 50
5.3 Rela ó io de e o de pa se ............................... 50
5.4 Pau a musical ge ada pela linguagem6, e são áudio disponí el aqui7........... 57
5.5 Pau a musical ge ada pela linguagem, e são áudio disponí el aqui8............ 57
5.6 Pau a musical ge ada pela linguagem, e são áudio disponí el aqui9............ 58
5.7 Pau a musical ge ada pela linguagem, e são áudio dísponí el aqui10........... 59
5.8 Pau a musical ge ada pela linguagem, e são aúdio dísponí el aqui11........... 59
5.9 Pau a músical ge ada pela linguagem, e são aúdio dísponí el aqui12........... 60
5.10 O ganização dos módulos s anda d do p oje o ..................... 61
5.11 Rep esen ação de duas células de uma g elha ...................... 68
5.12 As á ias á eas con igu á eis de uma g elha ....................... 69
5.13 Á eas em que a g elha i á mo e os e en os, e qual o sepa ado a que pe encem. . . . . 70
5.14 Posição dos e en os após o alinhamen o com a g elha e sido aplicado. ......... 70
5.15 Janela de ca egamen o dos bu e s .......................... 77
5.16 In e ace do edi o embu ido. .............................. 79
5.17 Implemen ação básica de uma solução de au o-comple e................ 79
x
Lis a de Tabelas
2.1 Lis a de modi icado es e exemplos da sua u ilização ................... 3
5.1 Lis a de ab e ia u as possí eis de se em ac escen adas a segui a uma no a pa a especi ica
um aco de. ....................................... 39
5.2 Lis a de modi icado es e exemplos da sua u ilização ................... 40
5.3 Fo ma o na i o supo ado pelo FluidSyn h ........................ 67
5.4 Linhas de código (sem linhas azias ou de comen á io) do p oje o Musikla ........ 83
x ii
Lis agens
2.1 Exemplo da linguagem alda ............................. 4
2.2 Exemplo da no ação ABC .............................. 5
2.3 Exemplo da no ação ABC .............................. 6
2.4 Ge ação de uído alea ó io com olume a me ade .................. 6
2.5 Ge ação de uído alea ó io com um il o low-pass ................. 7
2.6 Ge ação de uído alea ó io com um il o low-pass con olada po uma in e ace . . . 7
2.7 Decla ação de dois canais de aúdio com base em dois oscilado es .......... 8
2.8 Di idi um ge ado po dois canais de o ma desigual ................ 8
2.9 Di idi um ge ado po dois canais de o ma desigual ................ 8
2.10 Rep oduzi um oscilado du an e dois segundos ................... 10
2.11 Rep oduzi um oscilado in ini amen e ........................ 10
2.12 Rep oduzi um oscilado , a iando a equência a cada 2 segundos .......... 10
2.13 Exemplos de ins uções de a anço no empo .................... 10
2.14 Exemplos de ins uções de a anço no empo .................... 11
2.15 Rep oduzi um sample com alo es alea ó ios ................... 12
2.16 Rep oduzi um no as de uma escala alea ó ias, com e ei o e e b .......... 12
2.17 G amá ica ..................................... 13
2.18 Sis ema de Tipos de um ichei o SoundFon ..................... 15
3.1 Exemplo da sin axe p opos a da linguagem ..................... 21
3.2 Exemplos de no as ................................. 23
3.3 Exemplo da sin axe de eclados i uais ....................... 24
3.4 Exemplo da sin axe p opos a da linguagem ..................... 24
4.1 Exemplo da sin axe pa a c iação de música ..................... 29
4.2 Exemplo da decla ação da es u u a e con eúdo de uma simples uga de duas ozes . 30
4.3 Exemplo da sin axe pa a c iação de eclados ..................... 31
4.4 De inição de um eclado de aco des ......................... 32
4.5 Exemplo da sin axe p opos a da linguagem ..................... 34
4.6 Exemplo da sin axe p opos a da linguagem ..................... 34
5.1 Exp essão Regula que iden i ica uma no a (queb as de linha adicionadas apenas pa a
cla idade de lei u a) ................................. 38
xix
Lis agens
5.2 Exemplos de ês de inições de aco des possí eis .................. 39
5.3 P oduções base da g amá ica ............................ 41
5.4 P oduções base da g amá ica ............................ 41
5.5 P oduções de ins uções na g amá ica ........................ 42
5.6 P oduções de exp essões na g amá ica ....................... 43
5.7 P oduções de elemen os musicais na g amá ica ................... 44
5.8 P oduções associadas a eclados na g amá ica ................... 45
5.9 Exce o da g amá ica desen ol ida ......................... 46
5.10 Mé odos esponsá eis po c ia em a AST ...................... 46
5.11 Pequeno exce o da de inição da linguagem esc i o em I o .............. 48
5.12 Exce o da música We Hands de C418 ....................... 56
5.13 Exce o do começo do ema p incipal de Wes wo ld, po Ramin Djawadi ....... 57
5.14 Exce o da música So o Be S ong de Ma ina .................. 58
5.15 Exemplo de ansposição de um acompanhamen o com ês no as .......... 58
5.16 T ês aco des di e en es a pegiados com o mesmo pad ão .............. 59
5.17 Redimensionamen o da du ação de uma exp essão músical ............. 60
5.18 Exemplo de ep oduzi um ichei o a segui a duas no as ............... 67
5.19 Ve i ica se um ichei o de audio es á op imizado, e con e ê-lo caso con á io . . . . 67
5.20 Código de de inição da g elha ep esen ada na igu a 5.12 .............. 68
5.21 Código al e na i o de de inição da g elha ep esen ada na igu a 5.12, com as p op ie-
dades le e igh ................................. 69
5.22 Exemplo de decla ação de duas eclas ........................ 70
5.23 Decla ação de ês e en os, o p imei o é uma combinação de eclas, o segundo e e ên-
cia o i ual key code, e o e cei o uma no a MIDI ................. 71
5.24 Teclado que imp ime as coo denadas do a o semp e que ele se mo e ........ 72
5.25 Aplica o modi icado hold ex end a um eclado in ei o .............. 73
5.26 Código ge ado au oma icamen e pa a c iação do eclado desc i o no capi ulo an e io . 73
5.27 Decla ação de eclado dinâmica eco endo ao uso de ciclos, condicionais e blocos de
código. ....................................... 74
5.28 G a ação de uma pe o mance .......................... 75
5.29 Rep odução de uma pe o mance ......................... 75
5.30 Con e são de uma pe o mance numa sequência de e en os músicais ....... 75
5.31 Ins anciação de um bu e ............................. 76
5.32 Funções disponibilizadas pa a c iação de bu e s con olados po eclados. ..... 77
5.33 Fo ma o do ichei o de g a ação dos bu e s..................... 78
5.34 Ab e o edi o quando a ecla é p emida ...................... 78
5.35 Ab i manualmen e o edi o ............................. 79
5.36 Exemplo de uma unção map com e sões sinc onas e asínc onas .......... 80
xx
Lis agens
5.37 Implemen ação da unção map usando a nossa abo dagem de ans o mado es . . . 81
5.38 Exemplo de um ans o mado map e da sua u ilização ................ 82
6.1 P ocesso de ins alação do package musikla .................... 85
6.2 Exemplo de um ichei o de con igu ação da linguagem ................ 86
6.3 Exemplo de um ichei o de con igu ação da linguagem ................ 87
A.1 G amá ica PEG da linguagem Musikla ........................ 95
B.1 G amá ica LALR da linguagem Musikla ....................... 103
xxi
Capí ulo
1
In odução
No âmbi o das linguagens de p og amação e engenha ia de so wa e, é comum obse a como a lin-
guagem, ou o pa adigma, de p og amação escolhido pode a e a de modo p o undo as decisões que o
p og amado oma, e po consequência, o p odu o inal. De modo análogo, nós ac edi amos que a o ma
como pensamos e alamos sob e música a e a ambém a música que c iamos, ou a o ma como pensa-
mos sob e ela. A linguagem musical mais comum u ilizada en e p o issionais e en usias as é ce amen e
a linguagem das pau as musicais.
Mas es a linguagem é es á ica. É como se pudéssemos ala de ma emá ica usando apenas núme os,
mas sem nenhuma linguagem comum pa a exp essa mos concei os de mais al o ní el como equações
ou inequações. E a ce amen e possí el ep esen a mos os esul ados inais, mas pe dia-se a es u u a
que possibili a a comp eende a um mais al o ní el o p oblema, e a é mesmo gene aliza a sua solução
e encon a pad ões pa a ou os p oblemas simila es.
Sendo o p ocessamen o de linguagens, em pa icula de linguagens de p og amação, uma á ea de
eno me in e esse pessoal, su giu a ideia de como in eg a á ios desses concei os na linguagem musical,
e des a o na o ná-la mais ica e pode osa.
O obje i o des a disse ação i á en ão passa po desenha e desen ol e uma linguagem que pode
se pensada como uma calculado a musical. Que emos analisa qual a melho o ma de desc e e música
em o ma o ex ual, e de in eg a cons uções comuns na p og amação, como a iá eis, unções, ciclos
e es u u as de decisão, en e ou os.
Es a linguagem de e en ão se i an o como uma e amen a de supo e eó ico, pa a os u ilizado es
es uda em a es u u a e a eo ia de peças musicais, mas ambém como uma e amen a p á ica pa a
p a ica a c iação de música.
Es a úl ima pa e p á ica mo i ou ambém a inco po ação na nossa linguagem de uma componen e
de in e a i idade. Pa a além de pe mi i usa pianos, ou o p óp io eclado de um compu ado , pa a e-
p oduzi as no as habi uais, que emos da ao u ilizado a possibilidade de cus omiza as ações ou os
1
CAPÍTULO 1. INTRODUÇÃO
acompanhamen os musicais que ocam em cada ecla.
Um sen imen o que i emos epe i bas an e ao longo des a disse ação é a necessidade des e p oje o
se ex ensí el. Is o é, pe mi i a cada u ilizado adiciona no as uncionalidades à linguagem quando
p ecisa , e o na es e p ocesso o mais simples possí el, sem ases de ecompilação ou necessidade de
al e a o código on e do p oje o. Is o po que a p odução de música é uma á ea eno me, e mais impo an e,
é uma o ma de exp essão c ia i a. Não emos ilusões de consegui cob i seque a maio pa e dos casos
de uso de odos os u ilizado es. E po isso, p o idencia uma base sólida sob e a qual cada pessoa pode
acilmen e cons ui , e e en ualmen e i jun ando essas cons uções à implemen ação o icial, pa ece-nos
c í ico pa a o sucesso e pa a a usabilidade da linguagem.
Pa a ealiza isso, i emos analisa no p óximo capí ulo as linguagens exis en es na in e seção da p o-
g amação com a c iação de música. Vamos analisa pa a cada uma, quais os aspe os que não coincidem
com aquilo que que íamos encon a numa linguagem, mas ambém aquilo que já exis e e que es á
bem ei o. E como as boas ideias são pa a se ap o ei adas, i emos inco po a o que o sensa o na nossa
linguagem (como po exemplo, usa a sin axe de desc ição de no as e aco des do p oje o abc no a ion1).
1h p://abcno a ion.com/
2
Capí ulo
2
Es ado da A e
A ualmen e a p odução de música é ealizada u ilizando p og amas com in e aces g á icas, ge almen e
denominados como Digi al Audio Wo ks a ion (DAW). A minha abo dagem i á consis i em es uda o mas
de c ia e oca músicas ao i o (e não só) a a és de uma Domain Speci ic Language (DSL), usando
écnicas inspi adas nas linguagens de p og amação e no desen ol imen o de so wa e.
2.1 T abalho Relacionado
Exis em di e sos ipos de linguagens usadas a ualmen e pa a p oduzi ou simplesmen e desc e e música.
Algumas azem uso do concei o de no as musicais, com ecu so a algum sin e izado ex e no, pa a ge a
os sons, enquan o ou as uncionam com base na manipulação di e a de ondas de som digi ais pa a c ia
música. Algumas supo am apenas a desc ição es á ica da música, enquan o ou as pe mi em o mas
dinâmicas ais como unções, a iá eis, es u u as de con olo e epe ição, ou a é mesmo algo i mos
alea ó ios que pe mi em ge a músicas di e en es a cada execução.
Language Tipo de Dados Dinâmica In e a i idade
alda No ação Musical Não N/A
abc no a ion No ação Musical Não N/A
Faus Sinais Áudio Sim Bo ões/Slide s/e c...
Supe Collide Sinais Áudio Sim Não
ChucK Sinais Áudio Sim Teclados Impe a i os
SonicPi No as Sim Não
Solução Ideal No ação Musical Sim Teclados Decla a i os
Tabela 2.1: Lis a de modi icado es e exemplos da sua u ilização
3
CAPÍTULO 2. ESTADO DA ARTE
Que emos analisa as opções segundo os seguin es concei os:
Tipo de Dados Re e e-se a quais os ipos de dados usados p incipalmen e pela linguagem na com-
ponen e musical. Sinais de áudio são os de mais baixo ní el, enquan o que No as e e e-se à
linguagem pe mi i oca uma no as manualmen e. No ação Musical é a de mais al o ní el e
pe mi e desc e e não só no as, mas acompanhamen os musicais.
Dinâmica Co esponde a sabe se a linguagem em cons uções dinâmicas (como a iá eis, ciclos,
unções) ou se é apenas es á ica.
In e a i idade Algumas linguagens podem pe mi i in e a i idade a a és de in e aces g á icas no com-
pu ado , como bo ões e slide s. Ou as podem supo a eclados, que podemos di idi em dois
ipos: Impe a i os, e Decla a i os. Impe a i os e e em-se à possibilidade de se no i icado
quando qualque ecla é p emida, uma de cada ez, e decidi manualmen e o que aze . Decla-
a i os e e em-se a desc e e uma lis a de eclas e ações a execu a pa a cada uma delas, sem
e mos de nos p eocupa em ecebe manualmen e os e en os e decidi se o e en o se aplica à
nossa ecla ou não.
I emos de seguida analisa mais a undo es as linguagens, bem como compa a as uncionalidades
que cada uma o e ece ela i amen e aos concei os enume ados em cima.
2.1.1 Alda
O p oje o alda (“alda”, s.d.) é uma linguagem de música ex ual desen ol ida em JAVA ocada na sim-
plicidade: o seu maio pon o de a ação é apela an o a p og amado es com pouca expe iência musical,
bem como a músicos com pouca expe iência com p og amação. Apesa de se anunciada como di eci-
onada an o a músicos como a p og amado es, a linguagem não supo a nenhum ipo de cons uções
dinâmicas, como ciclos ou unções. Es e ipo de uncionalidades, se necessá io, eque o uso de uma lin-
guagem de p og amação po cima, que pode ia po exemplo, ge a o código alda em un ime a a és da
manipulação de s ings an es de o execu a . Is o signi ica que não é possí el implemen a composições
in e a i as.
2.1.1.1 Exemplos
O exemplo seguin e demons a um simples p og ama esc i o em alda, demons ando: a seleção de um
ins umen o (piano:), a de inição da oi a a base (o3), um aco de com qua o no as (c1/e/g/>c4) em
que a úl ima se encon a uma oi a a acima das ou as.
1piano: o3 c1/e/g/>c4 < b a g | < g+1/b/>e
Lis agem 2.1: Exemplo da linguagem alda
4
2.1. TRABALHO RELACIONADO
É ambém possí el e i ica o uso de aciden es (iden i icados pelos símbolos +ou -a segui a uma no a)
bem como a di e enciação da du ação de algumas no as (iden i icadas pelos núme os em en e às no as).
2.1.2 ABC No a ion
A no ação ABC (“ABC No a ion”, s.d.; Gonza o, 2019) é uma no ação ex ual que pe mi e desc e e
no ação musical. É bas an e comple a, endo o mas de desc e e no as, aco des, aciden es, ligadu as
de no as, ly ics, múl iplas ozes, en e ou os.
Pa a além das exaus i idade de sin axe que pe mi e desc e e quase odo o ipo de música, a popu-
la idade da linguagem ambém signi ica que exis em já inúme os con e so es de ichei os ABC pa a os
mais di e sos o ma os, desde ichei os MIDI, pau as musicais, ou mesmo ichei os WAV (ge ados a a és
do o necimen o de um ichei o SoundFon , po exemplo).
A complexidade da no ação az an o an agens como des an agens, no en an o: A sua ubiquidade
signi ica que uma maio pe cen agem de u ilizado es já se pode sen i à on ade com a sin axe, o que
não acon ece com ou as linguagens menos conhecidas. Mas po ou o lado, conhece ou implemen a
oda a especi icação (“ABC No a ion S anda d 2.1”, 2011) é um ei o bas an e di ícil.
No en an o, al como a linguagem ALDA, as músicas de inidas são es á icas, pelo que não se e
como uma linguagem de p og amação de músicas dinâmicas. Ainda assim, apesa de implemen a oda
a no ação se algo pouco p á ico, implemen a um subse da no ação, con endo as cons uções mais
usadas se ia uma an agem eno me que me pe mi i ia ap o ei a a amilia idade de mui os u ilizado es
com as pa es mais comuns da sin axe.
2.1.2.1 Exemplos
A sin axe de um ichei o ABC é compos a po duas pa es: um cabeçalho onde são de inidas as con i-
gu ações da música a ual, seguido pelo co po da música. O cabeçalho é o mado po uma á ias linhas.
Cada linha, em ABC chamada de campo, em uma cha e e um alo sepa ados po dois pon os (:). A
especi icação da no ação desc e e bas an es campos possí eis, mas os mais usados são: X(núme o de
e e ência), T( í ulo), M(compasso), L(unidade de du ação de no a) e K(a mação de cla e).
1C, D, E, F,|G, A, B, C|D E F G|A B c d|e g a|b c' d' e'| ' g' a' b'|]
Lis agem 2.2: Exemplo da no ação ABC
No exemplo acima podemos e uma escala comple a das no as (sem aciden es). O chamado C
médio é ep esen ado po um cminúsculo (a capi alização das le as muda o signi icado). Pa a subi
uma oi a a, podemos ano a as no as com um após o o (c’). As oi a as subsequen es são ano adas po
mais após o os. De modo análogo, pa a baixa uma oi a a, de emos usa p imei o a no a em maiúscula
(C). As oi a as an e io es são iden i icadas po uma (ou mais) í gula a segui à no a com le a maiúscula
(C,).
5
CAPÍTULO 2. ESTADO DA ARTE
1A/2 A/ A A2 __A _A =A ^A ^^A [CEGc] [C2G2] [CE][DF]
Lis agem 2.3: Exemplo da no ação ABC
A du ação das no as pode se ajus ada ela i amen e à unidade global de inida no cabeçalho ac escen-
ando um núme o (po exemplo 2) ou ação 1/4 à no a. Os aciden es bemol, bequad o e sus enido
podem se adicionados ac escen ando um _,=e^an es da no a, espe i amen e. Aco des (no as oca-
das ao mesmo empo) podem se de inidas en e pa ên eses e os ([e]).
A no ação disponibiliza mui os mais exemplos de odas as uncionalidades acei es no seu web-
si e (“ABC No a ion Examples”, 2011).
2.1.3 Faus
A linguagem Faus (O la ey, Fobe & Le z, 2009; O la ey, G ae & Ke s en, 2006) é uma linguagem de
p og amação uncional com oco na sin e ização de som e p ocessamen o de áudio. Ao con á io das
linguagens analisadas a é ago a, não abalha com abs ações de no as e elemen os musicais. Em ez
disso, a linguagem abalha di e amen e com ondas sono as ( ep esen adas como s eams de núme os)
e a a és de exp essões ma emá icas, que de uma o ma uncional pe mi em assim manipula o som
p oduzido.
Um dos pon os o es da linguagem é o ac o da sua a qui e u a se cons uída de aiz pa a compila
o mesmo código on e em á ias linguagens. De ac o, o p oje o con a com á ias dezenas de a ge s,
desde os mais ób ios (C, C++, Ja a, Ja aSc ip ) a é alguns mais especializados (WebAssembly, LLVM
By ecode, ins umen os VST/VSTi). Também pe mi e ge a aplicações s andalone pa a as biblio ecas de
audio mais comuns já embu idas (“FAUST Ta ge s”, s.d.).
A linguagem em embu ida com uma biblio eca ex emamen e comple a (“FAUST Lib a ies”, s.d.) que
implemen a, en e mui as ou as, unções de ma emá ica comuns, il os áudio e uncionalidades ex e-
mamen e básicas de in e aces g á icas que pe mi em con ola em empo eal os alo es do p og ama
(como bo ões e slide s, en e ou os).
2.1.3.1 Exemplos
A documen ação do p oje o con a com uma quan idade abundan e de exemplos (“FAUST Examples”, s.d.)
e com um u o ial pa a inician es (“FAUST Quick S a ”, s.d.), do qual i ei coloca aqui alguns pequenos
pedaços de código que demons am as capacidades undamen ais da linguagem.
1impo (”s d aus .lib”);
2p ocess = no.noise*0.5;
Lis agem 2.4: Ge ação de uído alea ó io com olume a me ade
No p imei o exemplo, podemos e a es u u a mais básica de um p og ama esc i o em Faus . Na p i-
mei a linha é impo ada a biblio eca s anda d da linguagem. Na segunda linha podemos e a keywo d
6
2.1. TRABALHO RELACIONADO
p ocess, que ep esen a o inpu eou pu audio do nosso p og ama. Finalmen e, em en e a essa
keywo d podemos e a exp essão no.noise*0.5 (sendo no onamespace con endo as unções de
ge ação de uído, e noise co espondendo ao whi e noise). Is o demons a a u ilização de cons uções
da biblio eca s anda d, como o ge ado de uído alea ó io, bem como a u ilização de ope ado es ma e-
má icos usuais (nes e caso a mul iplicação) pa a manipula o áudio, e diminui o olume pa a me ade.
1impo (”s d aus .lib”);
2c F eq = 500;
3q = 5;
4gain = 1;
5p ocess = no.noise : i. esonlp(c F eq,q,gain);
Lis agem 2.5: Ge ação de uído alea ó io com um il o low-pass
Nes e exemplo, es amos a usa o ope ado :pa a canaliza o ou pu do ge ado de uído pa a um il o
low-pass, que il a odas as equências acima de um alo de co e (a a iá el c F eq). Aumen a es a
a iá el esul a num som mais agudo, enquan o que ao diminui-la ob emos um som mais g a e (pois o
alo de co e é mais baixo, apenas os sons abaixo desse alo são passados).
1impo (”s d aus .lib”);
2c F eq = hslide (”[0]cu o F equency”,500,50,10000,0.01);
3q = hslide (”[1]q”,5,1,30,0.1);
4gain = hslide (”[2]gain”,1,0,1,0.01);
5 = bu on(”[3]ga e”);
6p ocess = no.noise : i. esonlp(c F eq,q,gain)* ;
Lis agem 2.6: Ge ação de uído alea ó io com um il o low-pass con olada po uma in e ace
Po im podemos e um exemplo igual ao an e io , mas em ez de e os alo es das a iá eis es á icos
(gua dados nas a iá eis c F eq,qegain), es es são con olados em empo eal pela in e ace de inida
pelas chamadas à unção hslide . Foi ambém adicionada uma a iá el com um bo ão ”ga e”. Es e
p oduz o alo 0 (ze o) quando es á sol o, e o alo 1 (um) quando es á p essionado, alo que quando
mul iplicado pelo es o da exp essão se e e e i amen e como um on/o swi ch pa a odo o sis ema.
2.1.4 Supe Collide
O p oje o Supe Collide (McCa ney, 2002; O la ey e al., 2006) é uma pla a o ma pa a ge ação e
sin e ização de som e música. É compos a em pa e pela linguagem in e p e ada sclang, ocada na
componen e de áudio, mas com uncionalidades de p og amação gene alizada. Também em um se ido
de áudio eal ime scsyn h, que pode se con olado pela linguagem sclang, e que implemen a di e sas
écnicas de ge ação de áudio o imizadas (pe mi indo ao u ilizado p og ama ambém as suas p óp ias
écnicas cus omizadas a a és de C++). Também in eg a um IDE scide que disponibiliza um ambien e
de edição in eg ado pa a odo o ecossis ema, bem como e amen as de ajuda e in odução à pla a o ma.
7
CAPÍTULO 2. ESTADO DA ARTE
É uma linguagem de baixo ní el em e mos musicais, mas com um g ande ecossis ema pa a in eg a
os mais di e sos componen es, desde con olado es MIDI a in e aces g á icas. Mas a ní el musical, como
já e e ido, oca-se na sin e ização e manipulação de ondas de som, sem e noção de concei os mais
abs a os como no as ou aco des. Tais noções êm de se manualmen e implemen adas pelo u ilizado ,
e de uma o ma bas an e mais e bosa do que o desejá el.
2.1.4.1 Exemplos
A linguagem do p oje o sclang é uma linguagem o ien ada a obje os mas com aspe os uncionais (como
cu ying ou lis as em comp eensão).
1{ [SinOsc.a (440, 0, 0.2), SinOsc.a (442, 0, 0.2)] }.play;
Lis agem 2.7: Decla ação de dois canais de aúdio com base em dois oscilado es
No exemplo p esen e na lis agem 2.7, é decla ada uma unção (dema cada pelo pa de cha e as) que
e o na uma lis a com dois oscilado es de ondas sinusoidais. O som dos oscilado es é depois ep oduzido
a a és da chamada da unção play. De no a que como os oscilado es es ão den o de um a ay, isso
signi ica que es amos a ge a múl iplos canais de áudio (dois nes e caso), com um oscilado pa a cada
canal.
O oscilado SinOsc é apenas um dos ge ado es de som disponibilizados pelo se ido scsyn h,
ambém chamados UGens. Exis em ou os, e mais impo an e, é possí el compo esses ge ado es pa a
c ia sons mais complexos.
Um exemplo ainda ela i amen e simples desse ipo de composição, p esen e na lis agem 2.8 se ia
usa o ge ado Pan2 que edi eciona o som o iundo de ou o ge ado pa a dois canais di e en es. A
p e alência do som em cada canal (o pan) pode se cos umizada po um segundo a gumen o, com
um alo en e -1 e 1, onde -1 emi i ia apenas som no canal da esque da, 1 emi i a apenas som no
canal da di ei a, e qualque alo pelo meio i ia p oduzi uma g adação en e os dois canais, linea men e
p opo cional a esse alo .
1{ Pan2.a (PinkNoise.a (0.2), -0.3) }.play;
Lis agem 2.8: Di idi um ge ado po dois canais de o ma desigual
É possí el c ia uma e são mais in e essan e des e exemplo quando sabemos que os ge ado es po-
dem se u ilizados não só pa a ge a som, mas ambém pa a se i em de pa âme os a ou os ge ado es.
Po exemplo, na lis agem 2.9, em ez de passa mos um núme o li e al −0.3como segundo a gumen o,
podemos passa um oscilado . Des a o ma, o som ge ado pelo PinkNoise i á a ia em p opo ção ao
longo do empo pelos dois canais ge ados, em ez de oca de o ma ixa no mesmo.
1{ Pan2.a (PinkNoise.a (0.2), SinOsc.k (0.5)) }.play;
Lis agem 2.9: Di idi um ge ado po dois canais de o ma desigual
8
2.1. TRABALHO RELACIONADO
A linguagem é bas an e mais complexa, podendo decla a a iá eis, obje os, execu a unções, es-
u u as de con olo como condicionais e ciclos, e mui o mais. Rela i amen e à pa e musical, con ém
e amen as bas an e pode osas, mas apenas de baixo ní el, com manipulação da música ocada em
ondas sono as.
2.1.5 ChucK
A linguagem ChucK (Wang, Cook & Salaza , 2015) (Wang, Cook e al., 2003) é ou a linguagem de sin e-
ização de áudio digi al, simila aos p oje os Supe Collide eFaus . O seu maio a o de di e enciação
ad ém da sua abo dagem única e in e essan e de sinc onização de p ocessos conco en es baseado em
unidades de empo (que os au o es do p oje o denomina am s ongly- imed).
Es e concei o signi ica que o u ilizado pode de ini empos i uais associados a quando ce as ins u-
ções de em oco e . Tal ga an ia o na-se ú il quando combinada com o concei o de sh eds (p ocessos
i uais que podem es a a co e conco en emen e) e que dão a apa ência pa a o u ilizado que es ão
na e dade a co e em pa alelo. A máquina i ual po ás da linguagem, esponsá el po aduzi as
ins uções em áudio, assegu a-se que os sh eds são sample-synch onous, ou seja, cada sample (ou
amos a) ge adas pelos sh eds e com o mesmo imes amp i ual i ão se semp e ep oduzidas ao
mesmo empo (mesmo que o p ocessado enha demo ado mais empo a co e um dos sh eds do que
os ou os). Is o é, apesa de as samples pode em-se a asa , a máquina ga an e que al acon ece de
o ma sinc onizada, sem a possibilidade de c ia des asamen o en e os á ios sh eds.
Mais uma ez es a linguagem lida com o concei o de ge ação de áudio a um baixo ní el, e não é po -
an o mui o adequada pa a a desc ição de no ação musical. Apesa disso, es e p oje o ap esen a ambém
um a o di e enciado que pe mi e u iliza a sua componen e de agendamen o empo al de e en os, pa a
pe mi i in e a i idade (a a és de e en os MIDI ou do eclado do compu ado ). Mais uma ez, mesmo
es as uncionalidades são de baixo ní el (como i emos abo da mais em de alhe nos exemplos) mas é
ag adá el sabe que já êm pelo menos incluídas com a linguagem.
2.1.5.1 Exemplos
A ope ação cen al da linguagem ChucK passa pelo ope ado => ( ambém chamado de ope ado chuc-
king). A sua semân ica pode se pensada um pouco como a a ibuição a a iá eis, ou piping de dados.
Po exemplo, na lis agem 2.10 podemos e a decla ação de um oscilado sinusoidal SinOsc s que é
chucked pa a a a iá el dac. Es a é uma a iá el especial da linguagem e que ep esen a o disposi i o
de ep odução de áudio (as colunas ou auscul ado es).
Na linha seguin e podemos e ambém que é a ibuída à a iá el now o alo de dois segundos: es a
é ou a a iá el especial da linguagem, nes e caso esponsá el po con ola o agendamen o da execução
de código. Ao execu a essa ins ução, es amos e e i amen e a pa a a execução da sh ed a ual du an e
dois segundos ( icando o som do oscilado de inido na linha a ás a en ia som du an e os dois segundos
pa a o disposi i o de áudio ep oduzi ).
9
CAPÍTULO 2. ESTADO DA ARTE
2.4.1 Inicialização
Pa a u iliza a biblio eca FluidSyn h, exis em ês obje os p incipais que de em se c iados: Se ings
( luid_se ings_ *), Syn h ( luid_syn h_ *) e AudioD i e ( luid_audio_d i e _ *).
O obje o Se ings (“FluidSyn h Se ings”, s.d.) é implemen ado com ecu so a um dicioná io. Pa a
cada cha e (po exemplo, “audio.d i e ”) é possí el associa um alo do ipo in ei o (in ), s ing
(s ) ou double (num). Alguns alo es podem se ambém booleanos (bool), no en an o eles são a ma-
zenados como in ei os com os alo es acei es sendo apenas 0 e 1.
O obje o Syn h é u ilizado pa a con ola o sin e izado e p oduzi os sons. Pa a isso é possí el en ia
as mensagens MIDI ais como No eOn,No eO ,P og amChange, en e ou os.
O e cei o obje o AudioD i e encaminha au oma icamen e os sons pa a algum audio ou pu , seja
ele colunas no compu ado ou um ichei o em disco. Os seguin es ou pu s são supo ados pela biblio eca:
Linux: jack, alsa, oss, PulseAudio, po audio, sdl2, ile
Windows: jack, PulseAudio, dsound, po audio, sdl2, ile
Max OS: jack, PulseAudio, co eaudio, po audio, sndman, sdl2, ile
And oid: opensles, oboe, ile
2.4.2 U ilização
Com os obje os necessá ios inicializados, é necessá io ainda especi ica qual (ou quais) a(s) Sound-
Fon (s) a u iliza . Pa a isso podemos chama o mé odo Syn h.LoadSoundFon que ecebe dois a gu-
men os: uma s ing com o caminho em disco do ichei o SoundFon a ca ega , seguido dum booleano
que indica se os p ese s de em se a ualizados pa a os da no a SoundFon (is o é, a ibui os ins u-
men os da SoundFon aos canais au oma icamen e).
A unção Syn h.No eOn ecebe ês a gumen os: um in ei o a ep esen a o canal, ou o in ei o en e
0 e 127 a ep esen a a no a, e inalmen e ou o in ei o ambém en e 0 e 127 a ep esen a a elocidade
da no a.
O canal (channel) ep esen a qual o ins umen o que ai ep oduzi a no a em ques ão. Cada canal
es á a ibuído a um p og ama da SoundFon , e é possí el a qualque momen o muda o p og ama a ibuído
a qualque canal a a és do mé odo Syn h.P og amChange. Caso se enha ca egado mais do que
uma SoundFon , é possí el usa o mé odo Syn h.P og amSelec , que pe mi e especi ica o id da
SoundFon e do banco do ins umen o a a ibui .
A cha e (key) ep esen a a no a a oca . Sendo es e alo um in ei o en e 0 e 127, é necessá io sabe
como mapea as adicionais no as musicais nes e alo . Pa a isso, bas a coloca mos as pich classes e
os seus espe i os aciden es sha p numa lis a o denada (C, C#, D, D#, E, F, F#, G, G#, A, A#, B)
e associa a eles os in ei os en e 0 e 11 (inclusi e). Depois apenas emos de soma a esse núme o a
mul iplicação da oi a a da no a (a começa em 0) po 12. Podemos des e modo calcula , po exemplo,
que a key do C cen al (C4) é igual a 48 (0+4∗12). Assim, podemos gene aliza que pa a uma oi a a
16
2.4. SINTETIZADORES
Oe pa a um om de no a N, ob emos a cha e aplicando a ó mula:
N+O∗12
A elocidade ( eloci y) é ambém um alo en e 0 e 127. Relacionando a elocidade com um piano
ísico, es a ep esen a a o ça (ou elocidade) com que a ecla oi p emida. Velocidades maio es ge am
sons mais al os, enquan o que elocidades mais baixas ge am sons mais baixos, pe mi indo assim ao
músico da ou i a ên ase a uma no a ela i amen e às es an es. De no a que um alo igual a ze o é o
equi alen e a in oca o mé odo Syn h.No eO .
A mé odo Syn h.No eO , po sua ez, ecebe apenas dois a gumen os (canal e cha e), e de e se
chamada passado algum empo pa a e mina a no a. Podemos des e modo cons ui a analogia ób ia
que o mé odo No eOn co esponde a uma ecla de piano se p emida, e No eO co esponde a essa
ecla se libe ada.
17
Capí ulo
3
O P oblema e os seus Desa ios
Daqui pa a a en e i emos chama Musikla an o à linguagem que desenhamos, mas ambém ao in e -
p e ado de e e ência desen ol ido. Desenha a nossa linguagem ás consigo os p oblemas comuns ao
desenho de linguagens de p og amação, bem como desa ios no os e únicos ela i os ao domínio musical.
Alguns desses desa ios o am já bas an e es udado pela mi íade de linguagens de p og amação, an o
indus iais como académicas, que já o am desen ol idas, pelo que não se ão o oco p incipal des e p o-
je o. Pelo con á io, nes e p oje o se ão ocados com mais de alhe os desa ios esul an es da in eg ação
da componen e musical na linguagem.
O p imei o desses desa ios é a in odução de um no o ipo de dados p imi i o não exis en e na maio ia
das ou as linguagens: Música. Es e ipo de dados ás consigo a necessidade implíci a de ge i o concei o
de empo na linguagem, an o na ge ação de música eal ime como o line (em que o empo a que
a música es á a se ge ada pode se mais ápido ou mais len o do que o empo eal). Es e concei o de
empo ambém acaba po escapa pa a o campo da g amá ica e da sin axe da linguagem, necessi ando
de uma o ma de desc ição do mesmo que seja lexí el, mas não demasiado e bosa ou di ícil de le .
Ainda elacionado com o ipo de dados Música, ambém é impo an e pensa em como o ep esen a ,
e os casos que de e cob i . Pa a es e im, acho que é impo an e a linguagem pe mi i ge a sons po en-
cialmen e in ini os. Es a uncionalidade não é ão ú il no campo da ge ação de música o line, mas é
ex emamen e ú il quando a música es á a se ge ada em empo eal, e possi elmen e a se con olada po
um u ilizado a a és do eclado, pe mi indo começa a oca música ge ada p ocedu almen e, e deixá-la
oca du an e o empo que o necessá io. Como al é necessá io pensa em como a implemen ação de
odo o código depende des e pon o.
3.1 Obje i os
Nós podemos assim suma iza os obje i os p incipais pa a a nossa linguagem da seguin e o ma:
19
CAPÍTULO 3. O PROBLEMA E OS SEUS DESAFIOS
•Decla a i a As sequências musicais de em se desc i as de uma o ma decla a i a (em ez de
impe a i a).
•Dinâmica In oduzi concei os ma emá icos ou de p og amação, ais como unções e a iá eis,
pa a a á ea musical.
•In e a i idade To na possí el c ia eclados in e a i os di e amen e a pa i da linguagem, e que
in eg em acilmen e com o es o das uncionalidades disponibilizadas.
•Lazyness To na lazyness a p ede inição pa a as sequências músicais, ge ando apenas os
e en os es i amen e necessá ios quando são necessá ios.
•E en os Va iados As sequências musicais de em pode desc e e ex a os musicais complexos,
con en o no as singula es, pausas, aco des, a peggios, ozes, e mais.
•Múl iplos Inpu s Pa a além de pe mi i que os ex a os musicais sejam desc i os na nossa
linguagem, ambém de e se possí el que eles sejam impo ados ou con e idos de di e en es
on es, como disposi i os ou ichei os MIDI.
•Múl iplos Ou pu s Gua da ou esc e e pa a di e en es ou pu s, os e en os que o em ge ados
pela nossa aplicação.
•Ex ensibilidade To na simples o p ocesso de es ende e cus omiza o p oje o, sem se neces-
sá io passos como clona o p oje o, ecompila ou modi ica o seu código in e no.
3.2 Solução P opos a
I á se desen ol ido um in e p e ado pa a a linguagem em Py hon. A linguagem i á se ex ensí el,
pe mi indo ao u ilizado de ini obje os ou unções em Py hon e expô-los pa a den o da linguagem,
dando assim acesso à g ande quan idade de módulos já exis en es pa a os mais a iados ins.
Como exemplo da ex ensibilidade da linguagem, i á ambém se desen ol ido po cima dela uma bibli-
o eca de cons ução de eclados i uais que pe mi em associa a e en os de eclas no as ou sequências
musicais, ou mesmo ins uções a se em execu adas na p óp ia linguagem.
Pa a esol e o p oblema da ep esen ação do empo, oda a linguagem i á e noção implíci a desse
concei o, mesmo que apenas algumas cons uções o u ilizem. Is o signi ica que du an e oda a execução,
ha e á uma a iá el de con ex o que se á implici amen e passada pa a odas ins uções e odas as
chamadas de unções que, en e ou as coisas, i á man e egis o da passagem do empo. Des a o ma
os cons u o es que p ecisa em do con ex o, como po exemplo a emissão de no as musicais, podem
acede ao empo a ual bem como modi icá-lo.
A exis ência des e con ex o implíci o signi ica que as unções Py hon não podem se expos as
di e amen e pa a a linguagem, mas g aças à exp essi idade do Py hon é possí el cons ui uma Fo eign
20
3.2. SOLUÇÃO PROPOSTA
Func ion In e ace que seja simples de usa e que e i e que o u ilizado enha de mapea as unções
manualmen e. Em ez disso, pode simplesmen e ma cá-las como sendo con ex - ee ( unções que não
êm noção da exis ência do con ex o implíci o), e elas se ão en ão a adas de o ma ap op iada.
O ipo de dados Música i á se implemen ado sob e o concei o de i e ado es (e mais especi icamen e
ge ado es) o necido pelo Py hon pa a o na a c iação de música lazy. No en an o, es e pa adigma de e
se comple amen e opaco pa a o u ilizado da linguagem: a decisão de usa o modelo de execução no -
mal, ou unções ge ado es de e se omado em segundo plano pelo mo o de execução da linguagem,
semp e que es e o necessá io. Is o é, ao con á io da maio ia das linguagens que exigem pa a a u ili-
zação de ge ado es que o u ilizado decla e explici amen e que que ”emi i ”um alo a a és de alguma
keywo d, ge almen e yield, na nossa linguagem semp e que alguma unção p oduzi um alo do ipo
de música que não seja consumido de alguma o ma (a ibuído a uma a iá el ou passado a uma unção,
po exemplo), esse alo musical é implici amen e emi ido pa a o ge ado , uma ez que esse caso
se á o mais comum. Pa a e i a que o alo seja emi ido, é necessá io desca á-lo manualmen e onde
o caso disso. Se po ou o lado a unção lida apenas com alo es não-musicais, a sua execução i á
segui o modelo adicional (onde a unção e mina a sua execução an es de e o na o con olo ao local
onde oi chamada).
3.2.1 G amá ica da Linguagem
A g amá ica comple a da linguagem pode se is a no Anexo A. Mas an es de abo da mos em mais
de alhe como i á de desenhada a g amá ica da linguagem, podemos abo da dois pequenos exemplos
que demons am a ge ação de no as musicais.
1V70 L1 T120;
2
3 un melody () {
4V120;
5
6 /4 ^g/4 ^g/4 ^g/4;
7^ /2 e/8 ^d3/8;
8^c2;
9}
10
11 un accomp () {
12 V50; sus aino ();
13
14 ^Cm;
15 BM;
16 AM;
17 }
18
19 # C ea e he no es om a melody wi h a piano and accompany i wi h a iolin in pa allel
21
CAPÍTULO 3. O PROBLEMA E OS SEUS DESAFIOS
20 $no es = :piano melody() | : iolin accomp();
21
22 # Play he no es wice
23 play( $no es * 2 );
Lis agem 3.1: Exemplo da sin axe p opos a da linguagem
O desenho da g amá ica da linguagem é compos o po ês pa es, odas elas in e ligadas en e si.
Ins uções e Decla ações Simila a quase odas as linguagens de p og amação, es a pa e cob e a
decla ação de unções, a iá eis, ope ado es e exp essões em ge al.
Ex a os Musicais Um ipo de exp essões especial, que em ez de p oduzi núme os ou s ings li e-
ais, econhece exp essões musicais (no as, aco des, e c).
Teclados Vi uais Açúca sin á ico pa a acili a a decla ação de eclados i uais. Pa a além de alguns
cons u o es p óp ios, az uso das exp essões ge ais e de ex a os musicais desc i as acima.
3.2.1.1 Ins uções e Exp essões
As ins uções e exp essões da g amá ica são baseadas nas linguagens como C e Ja aSc ip . Cha e as
são usadas pa a delinea blocos de código. As a iá eis são p e ixadas com um dóla ($) pa a p e eni
ambiguidades com no as musicais. Cada ins ução é sepa ada com um pon o e í gula (;) a menos que
sejam blocos de código que e minem com o echa de cha e as. Os pa âme os de unções são sepa ados
po í gulas, mas como as í gulas ambém são usadas pa a indica a descida de oi a a nas no as, o pon o
e í gula (;) pode se usado nesses casos pa a p e eni ambiguidades.
Em e mos de ins uções supo adas, a linguagem i á e as usuais:
Decla ação de Funções un unc ion_name ( $a g1, $a g2, <...> ) { }
Ciclos While while (<condi ion>) { }
Ciclos Fo o ($ a in <exp >) { }
Condicionais I i (<condi ion>) { } else { }
A ibuições a Va iá eis $ a = <exp >;
Chamada de Funções unc ion_name( <a g1>, <a g2>, <...>, named_a g = <a g_n> );
3.2.1.2 Ex a os Musicais
A g amá ica de exp essões ou ex a os musicais em como base undamen al os seguin es blocos: no-
as, pausas e modi icado es. As no as são iden i icadas pelas le as A a é G, seguindo a no ação de
Helmhol z(“Helmhol z Pi ch No a ion”, s.d.) pa a deno a as espe i as oi a as. Podem ambém se
seguidas de um núme o ou de uma ação, indicando a du ação da no a.
22
3.2. SOLUÇÃO PROPOSTA
1C,, C, C c c' c'' c''' c'/4 A1/4 B2
Lis agem 3.2: Exemplos de no as
As no as podem depois se compos as sequencialmen e (como demons ado em cima, em que
cada no a a ança o empo pelo alo da sua du ação) ou em pa alelo (sepa ados po uma ba a e ical
|, c iando uma bi u cação do con ex o em dois, que i ão co e em pa alelo). De emos no a que o
ope ado pa alelo em a meno p ecedência de odos, pelo que não é necessá io ag upa as no as com
pa ên eses quando se usa. Is o é, as duas exp essões seguin es são equi alen es.
1ABC|DEF
2(ABC)|(DEF)
É ambém possí el ag upa es es blocos com ecu so a pa ên eses. Os g upos he dam o con ex o da
exp essão supe io , mas as modi icações ao seu con ex o pe manecem locais. Is o pe mi e, po exemplo,
modi ica con igu ações pa a apenas um conjun o es i o de no as. No exemplo seguin e, a elocidade
da no a Cé 70, mas pa a o g upo de no as A B a elocidade é 127.
1 70 ( 127 A B) C
Os modi icado es disponí eis são:
Veloci y A elocidade das no as, endo o o ma o [ V][0-9]+.
Du ação A du ação das no as, endo o o ma o [lL][0-9]+ ou
[lL][0-9]+/[0-9]+.
Tempo O núme o de ba idas po minu o (BPM) que de inem a elocidade a que as no as são ocadas,
endo o o ma o [ T][0-9]+.
Compasso De ine o compasso, que desc e e o ipo de ba ida da música e o comp imen o de uma ba a
na pau a musical. Tem o o ma o [sS][0-9]+/[0-9]+.
Oi a a Pe mi e muda qual a oi a a base (po p ede inição 4). Tem o o ma o [oO][0-9].
Ins umen o Qual o iden i icado numé ico do ins umen o (a começa em um) a u iliza ( eg a ge al,
seguindo o s anda d Gene al MIDI). Segue o o ma o [iI][0-9]+.
É ambém possí el de ini qual o ins umen o a se u ilizado pa a as no as. Todas as no as pe encen-
es ao mesmo con ex o depois do modi icado u iliza ão esse ins umen o.
1(:cello A F | : iolin A D)
Pa a além des as uncionalidades, ambém exis e algum açúca sin á ico pa a algumas das a e as
mais comuns na cons ução de acompanhamen os, como oca aco des ou epe i pad ões.
1( [BG]*2 [B2G2] )*3
23
CAPÍTULO 3. O PROBLEMA E OS SEUS DESAFIOS
3.2.1.3 Teclados Vi uais
Pa a além de pe mi i decla a ex a os musicais pa a se em ocados au oma icamen e, a linguagem
pe mi e decla a eclados i uais. Associados às eclas do eclado podem es a no as, aco des, melodias,
ou qualque ou o ipo de exp essão supo ado pela linguagem.
1# Now an example o he keyboa d. We can decla e a iables o hold s a e
2$oc a e = 0;
3
4$keyboa d = @keyboa d hold ex end ( 120) {
5# Keys can be decla ed o play no es
6a: C; s: D; d: E; : F; g: G; h: A; j: B;
7# O cho ds
81: [^Cm]; 2: [BM]; 3: [AM];
9
10 # O any o he exp ession, including code blocks ha change he s a e
11 z: { $oc a e -= 1; };
12 x: { $oc a e += 1; };
13 }
14
15 # The se _ ans o m unc ion allows changing all e en s be o e hey a e emi ed by his
,→keyboa d
16 $keyboa d::map( un ( $k, $e en s ) => $e en s + in e al( oc a e = $oc a e ) );
Lis agem 3.3: Exemplo da sin axe de eclados i uais
Cada eclado acei a opcionalmen e uma lis a de modi icado es, ais como:
hold Começa a oca quando a ecla é p emida e acaba de oca quando é sol a
oggle Começa a oca quando a ecla é p emida, e acaba de oca quando ela é p emida no amen e
epea Quando a no a/aco de/música o necida acaba de oca , epe e-a inde inidamen e
ex end Em ez de oca as no as de aco do com a sua du ação, es ende-as odas a é a ecla se le an-
ada/p emida no amen e (quando usado em conjun o com hold ou oggle, espe i amen e)
Também é possí el passa uma exp essão opcional en e pa ên eses que i á se aplicada a odas as
no as do eclado (no exemplo acima especi icando um ins umen o e o olume das no as com (: iolin
120)), e i ando assim e de a epe i em á ios sí ios.
Pa a além disso, se á possí el con ola mui os mais aspe os do eclado a ibuindo-o a uma a iá el e
chamando unções a pa i daí, como po exemplo e e ua ans o mações nos e en os e no as emi idos,
ou simula o ca ega e sol a das eclas.
1# The se _ ans o m unc ion allows changing all e en s be o e hey a e emi ed by his
,→keyboa d
24
3.2. SOLUÇÃO PROPOSTA
2$keyboa d::map( $e en s => anspose( $e en s, oc a e = $oc a e ) );
3# I is possible o synch onize he keyboa d wi h a g id o align he imings o key p esses
4# and eleases o said g id
5$keyboa d::wi h_g id( G id::new( 1, 4 ) );
6# We can also simula e key p esses and eleases p og amma ically
7$keyboa d::s a ( ”c l+z” );
8$keyboa d::s op_all();
Lis agem 3.4: Exemplo da sin axe p opos a da linguagem
3.2.2 A qui e u a do Sis ema
O sis ema i á se compos o po um in e p e ado de linguagem desen ol ido em Py hon, acompanhado
po uma in e ace de linha de comandos que aça uso do in e p e ado .
Figu a 3.1: A qui e u a Ge al do P oje o
O in e p e ado ecebe á um sc ip ob iga ó io como inpu . Esse inpu pode á depois de e mina
quais os inpu s (opcionais) que i á usa , como o eclado do compu ado , ichei os ou eclados MIDI,
ichei os de pe o mance (g a ações de ep oduções an e io es consis indo nos e en os em que as eclas
o am p emidas).
Os e en os ge ados pelo sc ip e os es an es inpu s se ão depois edi ecionados pa a os di e sos
ou pu s, que podem se as colunas do disposi i o, ichei os WAV ou MIDI, ichei os em o ma o PDF com
a pau a musical, en e ou os.
Toda a linguagem i á se desen ol ida com ex ensibilidade em men e nos seguin es pon os:
25
CAPÍTULO 4. CASOS DE ESTUDO
A sequência de eclas a se p emida nes e exemplo é: A5554S321DSA567D7
76S698967. Os empos de cada ecla são ela i amen e uni o mes e podem se acilmen e
deduzidos ou indo a e são sono a des e ex a o musical, disponí el aqui2.
No início des e exemplo podemos e a decla ação de uma unção oggle_sus ain, que ecebe como
pa âme o uma a iá el po e e ência. O que is o signi ica é que qualque al e ação ao alo da a iá el
den o des a unção, e le e-se ambém na a iá el que o passada à unção quando es a é chamada.
Lá den o azemos uso da unção cc que pe mi e con ola di e sos con olos MIDI. Nes e caso, o
con olo 64 e e e-se ao pedal de sus ain de um piano (que deixa as no as a oca du an e mais algum
empo mesmo depois da sua ecla se le an ada). O alo 0 (ze o) que lhe é passado signi ica desliga
esse pedal, e o alo 127 signi ica liga esse pedal. No u u o, apesa de se semp e possí el eco e a
es e ipo de unções de baixo ní el, i ão se adicionadas à biblio eca s anda d as unções mais comuns
(como po exemplo, sus aino () esus ainon()).
Depois podemos e a decla ação de dois eclados i uais (a linguagem pe mi e mais do que um
eclado a i o ao mesmo empo). O p imei o mapeia a algumas eclas (a,s,d, eg) o conjun o de
aco des usados nes a música. Pa a além disso ambém de ine alguns modi ica es a se em usados po
es e eclado (cujo signi icado é discu ido na sub-secção 3.2.1.3).
O segundo eclado unciona de o ma simila , a ibuindo às eclas de 1 a 9 no as indi iduais a se em
ocadas. Nes e eclado podemos ambém e que no as musicais não são os únicos elemen os que podem
se associados a eclas. Também é possí el desc e e exp essões a bi á ias (como nes e caso, a chamada
da unção oggle_sus ain( $sus ained ) associada à ecla c).
Ou o pon o a no a sob e o segundo eclado é a decla ação en e pa ên eses (V120) que pe mi e
modi ica o olume das no as ocadas po es e eclado (que se sob epõe ao olume global V70 indicado
no início do código). Is o é uma o ma simples de p e ixa con igu ações a odas as no as do eclado,
e i ando e de copia essas con igu ações pa a odas as no as.
4.4 Teclado de A peggios
Nes e caso amos cons ui um eclado mais dinâmico. Vamos associa a algumas eclas di e en es aco -
des. Mas em ez de oca simplesmen e esses aco des, amos ocá-los como a peggios aplicados a um
pad ão.
É impo an e no a que o pad ão não es á esc i o es a icamen e, mas sim gua dado na a iá el $pa .
Is o signi ica que podemos depois usa um segundo keyboa d pa a con ola qual o pad ão a i o. E
pa a o na o exemplo ainda mais di e ido, usamos as se as up edown pa a aumen a ou diminui a
ansposição das no as esul an es, dando assim mais a iedade aos qua o aco des de inidos.
É ácil de e ambém como es e eclado é ex emamen e e sá il, e pode se acilmen e adap ado
pa a um qualque núme o de aco des e a peggios que se quei a u iliza .
2So o Be S ong h ps://d i e.google.com/ ile/d/1ncy4 lCbbiGQ14lu sU4LCCUBK0 e13/ iew?usp=sha ing
32
4.5. TECLADO GERAL COM MIDI
1S4/4 L/4 T132 V120;
2
3$pa e ns = @[
4CDED2EC2;
5C d' e2 c2;
6];
7
8$ = 0; $pa = $pa e ns::[ 0 ];
9
10 @keyboa d {
11 a: [CM];
12 s: [Am];
13 d: [FM];
14 : [Dm];
15 }::map( un($k, $m) => $m * $pa + $ );
16
17 @keyboa d {
18 1: { $pa = $pa e ns::[ 0 ] };
19 2: { $pa = $pa e ns::[ 1 ] };
20
21 up: { $ += 1 };
22 down: { $ -= 1 };
23 };
Lis agem 4.4: De inição de um eclado de aco des
4.5 Teclado Ge al com MIDI
Os dois eclados is os a é ago a são in e essan es quando emos um sub-conjun o especí ico de no as e
aco des com os quais que emos oca . Mas às ezes é in e essan e e uma e amen a mais gene alizada
pa a expe imen a .
Es e exemplo az uso de unções disponibilizadas na biblio eca s anda d da linguagem pa a aze
isso mesmo.
•keyboa d piano() C ia um eclado a simula um piano com as eclas do compu ado . A p imei a
linha de eclas co esponde às eclas b ancas, a segunda às eclas p e as e a e cei a no amen e
às b ancas mas uma oi a a acima.
•keyboa d midi() C ia um eclado que es á à escu a dos e en os MIDI (possi elmen e de um
piano ex e no ligado ao compu ado ).
• De seguida ambém emos que é possí el aze mos o e ide a algumas eclas se quise mos algo
mais especí ico. Is o é opcional e pode se igno ado se quise mos.
33
CAPÍTULO 4. CASOS DE ESTUDO
•keyboa d bu pad() Aqui c iamos um eclado que es á à escu a das eclas numé icas (de 1 a é
9) e c ia um bu e em cada uma delas. Podemos usa esses bu e s pa a gua da em memó ia
melodias que oquemos com os eclados, pa a depois as ep oduzi quando quise mos.
•keyboa d epl() Finalmen e c iamos um úl imo eclado que az a ecla ” ”a i a o edi o em-
bu ido. Assim conseguimos al e a o nosso p og ama enquan o ele es á a co e , al e a eclas,
mexe nos bu e s, decla a a iá eis ou g a a os esul ados das nossas expe iências pa a disco.
1# Use a ”s anda d” keyboa d piano
2$piano = keyboa d piano();
3# Maybe e en add a MIDI piano?
4$piano += keyboa d midi();
5# O decla e a cus om piano
6$piano += @keyboa d hold ex end {
7a: [^Cm]; s: [BM]; d: [AM];
8 : [EM]; g: [^Fm];
9};
10
11 # C ea es a keyboa d ha decla es a se o bu e s. By de aul ,
12 # he numpad keys a e used (c ea ing 10 a ailable bu e slo s)
13 # Sa e key is F8, Load key is F7
14 $piano += keyboa d bu pad();
15 # C ea es a keyboa d ha associa es he in e p e e accessible by he ” ” key
16 $piano += keyboa d epl();
Lis agem 4.5: Exemplo da sin axe p opos a da linguagem
4.6 QWERTY Keyboa d
No exemplo an e io u ilizamos as unções o necidas pela biblio eca s anda d. Aqui amos e um
exemplo de como pode íamos p og ama as nossas p óp ias unções, u ilizando uncionalidades mais
dinâmicas (como ciclos o ) do que simplesmen e decla a cada ecla manualmen e.
Nes e caso es amos a c ia um eclado em que cada linha de eclas começa uma oi a a acima de
onde a linha de baixo começou, e as eclas na mesma linha sobem um semi om cada uma.
1 un qwe yboa d () {
2# Small sho cu unc ion
3 un i l ($o, $s) => in e al( oc a es = $o, semi ones = $i );
4
5# Maps he lines on a keyboa d o semi one o se s o Lis [ Lis [ s ] ]
6$lines = @[
7”qwe yuiop”::spli (),
8”asd ghjkl”::spli (),
34
4.6. QWERTY KEYBOARD
9”zxc bnm,.”::spli ()
10 ];
11
12 $oc a e = 0;
13 $semi one = 0;
14
15 $keyboa d = @keyboa d hold ex end {
16 o ( $oc , $cha s in enume a e( $lines ) ) {
17 o ( $sem, $c in enume a e( $cha s ) ) {
18 [ $c ]: c + i l( -$oc , $sem );
19 };
20 };
21 }::map( un( $k, $e en s ) => $e en s + i l( $oc a e, $semi one ) );
22
23 $keyboa d += @keyboa d {
24 up: { $oc a e += 1 };
25 down: { $oc a e -= 1 };
26 igh : { $semi one += 1 };
27 le : { $semi one -= 1 };
28 };
29
30 e u n $keyboa d;
31 }
Lis agem 4.6: Exemplo da sin axe p opos a da linguagem
A p imei a pa e da unção decla a um a ay com as ês linhas de ca ac e es p esen es num eclado
QUERTY. Is o pe mi e-nos ao decla a as eclas no keyboa d, e azê-lo de o ma dinâmica (ao in és de
associa a cada ecla uma no a manualmen e).
Essa decla ação, inspi ada nas lis as po comp eensão do Py hon, unciona a a és de uma cons-
ução simila a um ciclo o . A a iá el $c co esponde a cada i em da linha (nes e caso, casa ecla),
a a iá el $sem pe mi e-nos ob e o índice da le a a ual na linha. A cada le a é associada a no a c
anspos a pelo índice da ecla e da linha a que pe ence.
Pa a além disso ambém podemos e a decla ação de mais qua o eclas (co esponden es às qua o
se as do eclado) que pe mi em desloca as no as ocadas po oi a as comple as ou po semi ons. Pa a
isso, es as eclas êm associadas uma exp essão de bloco (iden i icada pelas cha e as {e}). Lá den o
é possí el me e uma ins ução (ou opcionalmen e á ias, sepa adas po pon os e í gulas ;). O alo
da úl ima exp essão é o alo de e o no da exp essão de bloco oda, pelo que se ia possí el que uma
ecla izesse mais que uma coisa (al e a o es ado e no im e o na ainda no as pa a se em ocadas, po
exemplo).
Finalmen e emos ambém um exemplo do mé odo map, um dos á ios mé odos que o obje o Keyboa d
disponibiliza e que pe mi em modi ica ainda mais o compo amen o dos eclados, al e ando o alo emi-
ido po cada ecla de aco do com a unção passada.
35
CAPÍTULO 4. CASOS DE ESTUDO
4.7 Conclusão
Com es es exemplos pudemos e como e uma sin axe decla a i a o na bas an e compac a a desc ição
de acompanhamen os musicais. Mas mais do que pode desc e ê-los es a icamen e, o ac o de pode mos
epe i e ans o ma sequências musicais aumen a ainda mais a p odu i idade do u ilizado .
Pa a além disso ambém conseguimos obse a que a in eg ação dos eclados ab e po as pa a
si uações bas an e in e essan es, p incipalmen e quando usados em conjun o com as e amen as de
p og amação dinâmica disponí eis. Um exemplo disso é o caso do nosso eclado de a peggios, onde
podemos de ini apenas um conjun o de aco des, e depois aplica uma ans o mação comum a odos eles
pa a p oduzi em exp essões mais complexas (que podem se depende de a iá eis que ão mudando ao
longo da execução).
Pa a além disso, ambém concluímos que é impo an e que a biblio eca s anda d inclua e amen as
gené icas e p on as a u iliza , ais como eclados com as eclas já p eenchidas pa a os casos de uso mais
comuns. Is o é ú il pa a acili a a u ilização da linguagem po pessoas que possam sen i -se à on ade
com pequenos sc ip s que mudem algumas a iá eis e chamem algumas unções, mas não enham
expe iência su icien e pa a c ia udo de aiz.
Po im, é ambém algo impo an e pe mi i a execução de código (nem que seja apenas de exp essões
ou ins uções singula es, uma de cada ez) em un ime. Is o pe mi e i e inando o p og ama, p incipal-
men e os eclados que possam es a a i os, sem se necessá io e mina a execução do p og ama. Tal
ação, pa a além de se mais incomoda i o e diminui a capacidade do u ilizado , ambém ap esen a a
des an agem de aze a aplicação pe de a memó ia, e como al o es ado das a iá eis e dos bu e s
que pudessem es a a se usados.
36
Capí ulo
5
Desen ol imen o do In e p e ado Musikla
O desen ol imen o do p oje o pode se di idido de g osso modo em ês camadas. Nelas são cobe os
um g upo ab angen e de aspe os an o da á ea do p ocessamen o de linguagens e do desen ol imen o
de DSL’s, da eo ia musical, e do p ocessamen o digi al de áudio.
Na camada da linguagem es e e mais p oeminen e a á ea de p ocessamen o de linguagens, po
mo i os ób ios. Mas nas decisões omadas du an e o desen ol imen o des a camada, es i e am semp e
p esen es ambém as necessidades especí icas que a eo ia musical (e a sua no ação) impõem numa
linguagem de p og amação.
Do mesmo modo, o in e p e ado az cla amen e uso de ópicos do domínio do p ocessamen o de
linguagens, mas é ainda mais o emen e in luenciado pelas es ições e equisi os impos os pela compo-
nen e musical da linguagem. Es a in luencia a o ma e a semân ica da execução dos á ios ope ado es
disponibilizados.
A úl ima camada, de desen ol imen o de uma biblio eca, a e a compos a pelos obje os e p ocedimen-
os que êm como obje i o acili a a u ilização da linguagem. Pa a isso oi necessá io iden i ica os casos
de u ilização mais comuns e p io i á ios, de modo a guia a cons ução des as in e aces pa a e le i em
uma u ilização eal da linguagem e da aplicação.
5.1 Análise Sin á ica
A camada sin á ica da aplicação pode se concep ualmen e di idida em duas ases:
Sin axe Es a ase ca ac e iza-se po delinea qual a sin axe usada pela linguagem, bem como os cons-
u o es e ope ado es supo ados;
Pa se Nes a ase oi desen ol ido um pa se em Py hon, esponsá el po con e e o código on e
da linguagem numa Abs ac Syn ax T ee (AST);
37
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
No en an o, a ealidade é que a abo dagem seguida (não só nes a camada mas como em odo o
p oje o) oi mais i e a i a, di idindo cada ase em po ções semi-independen es e in e calando as á ias
po ções das di e sas ases. Es a abo dagem em a an agem de pe mi i i es ando e expe imen ando
com o p oje o mais cedo do que se ia possí el com um modelo de desen ol imen o em casca a.
5.1.1 Desc ição Sin á ica
A sin axe da linguagem é o emen e inspi ada nas usualmen e chamadas linguagens da amília C, com
ecu so a pa ên eses cu os e cha e as pa a delínea os á ios blocos da linguagem. No en an o, as
exp essões são complemen adas com um no o conjun o de li e ais e ope ado es dedicados à compo-
nen e músical da linguagem. Consegui jun a es es dois mundos az consigo alguns desa ios que se ão
discu idos mais em de alhe em cada umas das secções seguin es.
5.1.1.1 Cons an es ou Li e ais
Li e ais e e em-se ao concei o de sin axe desenhada com o p opósi o de desc e e dados (li e ais) no
código. São usados em quase odas as linguagens de p og amação (e na nossa ambém) pa a desc e e
núme os, s ings e booleanos.
A maio di e ença nes a á ea en e a nossa linguagem e as es an es, oi a adição de li e ais es-
ponsá eis po modela concei os musicais, como no as, pausas e aco des. Es a sin axe, al como já oi
mencionado an e io men e, oi inspi ada pelo p oje o abc no a ion, com algumas modi icações.
5.1.1.2 No as e Pausas
A sin axe de no as desc ição de no as é compos a po qua o componen es: aciden es,pi ch (ob iga-
ó io), oi a a edu ação.
1[_^]*
2[a-gA-G]
3[',]*
4([0-9]* /)?[0-9]*
Lis agem 5.1: Exp essão Regula que iden i ica uma no a (queb as de linha adicionadas apenas pa a
cla idade de lei u a)
Opi ch e e e-se à no a (ou equência) que de e se ocada. O C médio ( ambém conhecido como
C4) é desc i o simplesmen e como C. É possí el desce uma ou mais oi a as ac escen ando uma ou mais
í gulas ,. Pa a subi uma oi a a, podemos p imei o subs i ui as le as maiúsculas po minúsculas. Pa a
subi ainda mais oi a as, podemos ac escen a uma ou mais pelicas ’. Pa a subi ou desce semi ons,
podemos p e ixa as no as com os aciden es ^e_, espe i amen e.
As pausas são mais simples, sendo compos as simplesmen e pela le a seguida da sua du ação
(usando as mesma sin axe das no as).
38
5.1. ANÁLISE SINTÁTICA
5.1.1.3 Aco des
Pa a de ini aco des na linguagem, colocam-se á ias no as den o de pa ên eses e os. A no ação usada
pa a cada no a inclui os seus ês p imei os componen es (aciden es, pi ch e oi a a), mas exclui a du-
ação. Em ez de de ini a du ação em cada no a, es a é de inida globalmen e no aco de após echa os
pa ên eses e os.
Po con eniência, pa a e i a ao u ilizado e de in oduzi odas as no as de um aco de manualmen e,
emos uma sin axe ab e iada pa a os ipos de aco des mais comuns, onde é apenas necessá io in oduzi
a no a base seguido do ipo de aco de. Es a sin axe i á supo a mais ipos no u u o, sendo a ualmen e
possí el usa os seguin es su ixos:
Ab e ia u as
T íades M, m, aug, dim, +
Quin a 5
Sé imas m7, M7, dom7, 7, m7b5, dim7, mM7
Tabela 5.1: Lis a de ab e ia u as possí eis de se em ac escen adas a segui a uma no a pa a especi ica
um aco de.
A decisão de en ol e cada aco de com pa ên eses e os de eu-se ao ac o de mui as ab e ia u as
se em já popula es no domínio da no ação musical, e como al o ideal e a não as muda . No en an o,
algumas dessas ab e ia u as pode iam en a em con li o com ou os componen es da decla ação da
no a. Po exemplo, C7 pode ia se an o um aco de de sé ima como uma no a com du ação de 7. Com a
sepa ação po pa ên eses e os, a ambiguidade deixa de exis i , sendo ób io que [C7] é um aco de de
sé ima, e C7 é uma no a com du ação 7.
1[CFG]/4 [^Fm] [C5]2
Lis agem 5.2: Exemplos de ês de inições de aco des possí eis
5.1.1.4 Modi icado es de Voz
Pa a além de pe mi i desc e e no as, ambém é possí el e modi icado es de oz que pe mi em al e a
ce as p op iedades das no as e aco des. Duas des as p op iedades (du ação e oi a a) podem se depois
cus omizadas em cada no a ou aco de, como já imos. No en an o, em ez de es es alo es subs i uí em
simplesmen e os alo es p ede inidos, eles “complemen am-se”.
Ou seja, se decla a mos po exemplo que a du ação base das no as é 1
4. Quando de ini mos alguma
no a a segui com a du ação de 1
2, a sua du ação eal i á se calculada da seguin e o ma 1
4×1
2=1
8.
Do mesmo modo, quando de inimos po exemplo a oi a a base como 5(o alo p ede inido é 4), a
no a C, passa a ep esen a a oi a a 5−1=4(po p ede inição se ia 4−1=3) (no a que aqui es amos
a ala de oi a as indexadas a ze o. No mundo da música elas são ge almen e indexadas a um).
39
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
Podemos en ão e a lis a dos modi icado es acei es pela linguagem, bem como exemplos de u ilização
e os seus espe i os alo es p ede inidos (usados quando nenhum modi icado desse ipo é aplicado).
Nome Modi icado Exemplo P ede inição
Ins umen o INI46 I1
Velocidade VNV100 V127
Tempo TNT120 T60
Du ação
LN
L/N
LD/N
L2
L/4
L3/8
L1
Oi a a ONO2 O4
Compasso SD/NS3/4 S4/4
Tabela 5.2: Lis a de modi icado es e exemplos da sua u ilização
5.1.1.5 Va iá eis e Funções
Uma das consequências da in odução da sin axe de no as li e ais oi a impossibilidade de e a iá eis com
ce os nomes. Uma a iá el chamada a, po exemplo, i ia en a em con li o com a no a do mesmo nome.
Do mesmo modo, uma a iá el chamada i1 i ia en a em con li o com o modi icado de ins umen o.
Em ez de c ia casos de exceção pa a as a iá eis que possam e nomes que con li am com ou os
cons u o es sin á icos, seguimos o exemplo de ou as linguagens como PHP,Pe l ou Powe shell, e
decidimos p e ixa as nossas a iá eis com o ca ác e $.
No caso das unções oi possí el e i a a ambiguidade (e do mesmo modo a ob iga o iedade de as
p e ixa com um ca ác e ) de ido ao ac o de as unções e em ob iga o iamen e um pa de pa ên eses
(sem espaço en e os mesmos e o nome da unção) quando são chamadas.
No en an o não que dize que as unções passa am imunes à in odução das li e ais de música.
Uma ez que a í gula é usada pa a muda a oi a a de uma no a (e oi escolhida de o ma a man e
compa ibilidade com a sin axe do p oje o abc no a ion), exis em casos em que es a não pode se u ilizada
pa a sepa a os a gumen os passados a uma unção.
Po exemplo, dada a exp essão unc ion_name(C, A, $a, 2), quan os a gumen os podemos
conclui que a mesma em? Qua o? A espos a co e a se ia dois, pois as duas p imei as í gulas pode iam
pe ence à no a ou ao sepa ado da unção. Mas nes e caso a no a e ia p io idade na nossa g amá ica,
pelo que C, A, $a se ia o p imei o a gumen o, e 2se ia o segundo.
A solução omada inicialmen e oi u iliza pon o-e- í gula pa a subs i ui a í gula como sepa ado
de a gumen os nas unções. E enquan o isso esol eu os p oblemas de ambiguidade, o nou-se ób io à
medida que que a linguagem oi a ançando, que a p e alência da í gula como sepa ado de a gumen os
em quase odas as linguagens de p og amação mais popula es azia com que hou esse um cus o men al
de mudança de con ex o semp e que alguém muda a de alguma linguagem pa a a nossa, e ice- e sa.
40
5.1. ANÁLISE SINTÁTICA
A solução escolhida no inal oi um comp omisso en e as duas opções: an o a í gula como o pon o-
e- í gula podem se usados como sepa ado es de a gumen os, com a exceção de quando o a gumen o é
uma no a musical, onde o pon o-e- í gula em de se ob iga o iamen e usado. Assim sendo, pode íamos
esc e e o exemplo an e io da seguin e o ma unc ion_name(C; A; $a, 2), passando a unção a
ecebe ago a os qua o a gumen os como se ia inicialmen e espe ado.
5.1.2 G amá ica
Aqui amos analisa b e emen e uma e são simpli icada da g amá ica (a e são comple a usada pela
aplicação pode se is a no Apêndice A). Nes a e são simpli icada, incluída pa a acili a a lei u a, não
abo da de alhes como ecu si idade à esque da, ou p ecedência de ope ado es. Ob iamen e, na g a-
má ica eal o am usadas as écnicas usuais pa a cob i esses casos. A no ação da linguagem Musikla
cob e á ias sub-g amá icas, an o da pa e musícal, desc ição de eclados mas ambém ins uções e
exp essões de uma p og amação de linguagem gené ica, que i emos abo da de seguida.
5.1.2.1 Co po
Comecemos pela desc ição ge al do co po de um ichei o Musikla. O co po é compos o po uma lis a de
s a emen s (ou ins uções) que são ob iga o iamen e sepa ados po pon os e í gula (sendo apenas o
úl imo opcional).
No im de odas as ins uções, opcionalmen e, o u ilizado ambém pode inse i um bloco de código
Py hon (que é deno ado pelo p e ixo @py hon e consome odo o ex o a é ao im).
1main <- body py hon? EOF
2
3body <- s a emen ( ”;” s a emen )* ”;”?
4
5py hon <- ”@py hon” py hon_body
6
7py hon_body <- ( ”.*” ” ? n”? )*
Lis agem 5.3: P oduções base da g amá ica
Ao longo da g amá ica são ambém usadas p oduções i iais, como in ei os, s ings, booleanos en e
ou as. Sendo ão comuns e simples, não ale a pena es a a desc e ê-las odas. Deixamos no en an o
aqui duas p oduções que ão se usadas, mas cujas de inições podem se ligei amen e di e en es do
usual.
1sep = ”[,;]”
2
3iden i ie <- ”[a-zA-Z _]” ”[a-zA-Z0-9 _ ]”*
Lis agem 5.4: P oduções base da g amá ica
41
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
5.1.5.1 Syn ax Highligh ing
Pa a o e ece syn ax highligh ing pa a a nossa linguagem, que a nosso e o na a expe iência de
p og ama com a mesma mui o mais ag adá el, u ilizamos uma linguagem chamada I o3. Es a linguagem
é uma DSL que pe mi e desc e e a sin axe a a és de exp essões egula es, e associa es ilos a cada
uma.
1:pa e n {
2 egex = (=>|<=|>=|==|!=|[= * | + - /]|>=)
3s yles [] = .ope a o ;
4}
5
6: pa e n {
7 egex = (#.*)
8s yles [] = .commen ;
9}
Lis agem 5.11: Pequeno exce o da de inição da linguagem esc i o em I o
A sua g ande an agem é pe mi i , a pa i de uma única de inição, ge a e sões em o ma os es-
pecí icos supo ados po á ios edi o es, como po exemplo o Tex Ma e,Visual S udio Code,A om,
Sublime 3, ou a é con enien emen e pa a o o ma o supo ado pelo popula módulo Py hon Pyg-
men s. Usamos es e módulo pa a colo i os exemplos de código na nossa documen ação, como i emos
e na secção seguin e.
3h ps://eeyo.io/i o/
48
5.1. ANÁLISE SINTÁTICA
Figu a 5.1: Syn ax highligh ing da linguagem MusiKLa no edi o Visual S udio Code
5.1.5.2 Documen ação
Também oi esc i a documen ação pa a a linguagem disponí el online4, que inclui in o mação sob e a
sin axe, exemplos de sc ip s uncionais esc i os em musikla, e uma API com a desc ição das á ias
unções disponibilizadas, as suas assina u as e alguns exemplos de u ilização.
A documen ação oi esc i a em Ma kdown, e con e ida pa a HTML usando o p oje o mkdocs5. Os
exemplos de código disponibilizados na documen ação são colo idos pelo módulo Pygmen s, usando a
de inição de linguagem que desc e emos na secção an e io .
5.1.5.3 Rela ó ios de E os
A aplicação de linha de comandos que in e p e a a linguagem ambém dispõe de um componen e es-
ponsá el po , quando oco e algum e o elacionado com a linguagem, imp imi pa a o e minal o sí io
onde o e o oco eu, bem como a mensagem a desc e e o e o.
Exis em dois ipos de e os possí eis: e os de sin axe, que oco em du an e a ase de pa se quando
algum ca ác e es á no sí io e ado; e e os de execução, que oco em quando a linguagem es á a execu a
e podem e causas a iadas.
Pa a ambos os e os, o componen e de ela ó io p ecisa apenas dos seguin es campos:
Fichei o Qual o caminho do ichei o onde oco eu o e o (opcional).
4h ps://ped omsil ap .gi hub.io/miei-disse a ion/
5h ps://www.mkdocs.o g/
49
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
Figu a 5.2: Cap u a de ec ã da página de documen ação da linguagem
Figu a 5.3: Rela ó io de e o de pa se
Código O con eúdo do ichei o que o iginou o e o. Es e campo pode pa ece edundan e, endo nós o
caminho do ichei o. Se ia de espe a que podíamos simplesmen e le o ichei o e ob e o seu
con eúdo. No en an o, desde o momen o que o ichei o oi lido inicialmen e, e o momen o em que
oco eu o e o, o seu con eúdo pode e mudado. Po es a azão, é impo an e man e em memó ia
o código dos ichei os ca egados pa a assegu a que os e os são mos ados co e amen e.
Posição Início e Fim Dois in ei os indicando o inicio e im da secção con ígua no ichei o onde o e o de e
se ma cado a e melho. Podem cob i mais do que uma linha.
Mensagem Finalmen e, qual a mensagem de e o a mos a ao u ilizado .
50
5.1. ANÁLISE SINTÁTICA
E os de Sin axe
Es es e os são áceis de epo a . Semp e que há algum e o de sin axe, o pa se emi e uma exceção já
com a in o mação da mensagem de e o, bem como a posição onde o e o oco eu. Na nossa aplicação,
só emos de a a essa exceção, adicionando-lhe o caminho e o con eúdo do ichei o a que es á amos a
aze pa se, e já emos oda a in o mação disponí el pa a mos a o e o.
E os de A aliação
Es e ipo de e os pode oco e em qualque lado. Po essa azão, an es de aze -mos pa se de qualque
ichei o, associamos o ichei o (e o seu con eúdo) a um in ei o único po execução.
Depois du an e a ase de pa sing, associamos a cada nó da AST um iplo com ês in ei os, ep e-
sen ando o ichei o, posição de início, e posição de im a que esse nó co esponde.
Des a o ma, no mé odo Node.e al() he dado po odos os nós da AST, colocamos um y ...
excep ... à ol a da chamada de Node.__e al__() ( unção que con ém o código especí ico de
execução de cada nó). Des a o ma, conseguimos adiciona a qualque exceção que oco a du an e a
execução, o iplo que o nó em com a in o mação sob e o ichei o e a sua posição no mesmo.
Es a in o mação é depois u ilizada pa a p eenche os campos e mos a o ela ó io de e o.
51
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
5.2 Semân ica Dinâmica
As linguagens compiladas usualmen e eco em à compilação Ahead O Time (AOT), onde o código é
ans o mado em código máquina an es de se execu ado (du an e a ase de compilação). Es a é a solução
que consegue ge almen e o e ece melho pe o mance, meno consumo de memó ia e empos de
s a up mais ápido. Po ou o lado, ob iga a um passo de compilação sepa ado semp e que o código
on e é al e ado, e eg a ge al necessi a de ipos de dados es á icos pa a melho i a pa ido das an agens
de pe o mance.
No que oca a linguagens in e p e adas emos mais opções. Podemos en ão di idi os seus modos de
execução em ês ca ego ias dis in as, cada uma com possí eis an agens e des an agens, bem como
di e enças na di iculdade de implemen ação que são bas an e salien es.
In e p e ado es Também chamados po ezes como in e p e ado es ee walk, são usualmen e os
mais simples de implemen a (mas ambém os mais len os a execu a ). O seu concei o baseia-
se no design pa e n homónimo, em que as ope ações da linguagem são modeladas numa
á o e, ge almen e igual ou simila à es u u a da AST. Pa a execu a uma exp essão é chamado
um mé odo na aiz da á o e, e esse mé odo i á chama ecu si amen e os mé odos das suas
sub-exp essões, passando o es ado como a gumen os da unção, e ecebendo o esul ado pelo
alo e o nado da unção.
By ecode VM São chamadas máquinas i uais (VM) po que o seu compo amen o assemelha-se mais
ao compo amen o dos p ocessado es eais dos compu ado es. As exp essões da á o e de sin axe
abs a a são p e iamen e con e idas numa sequência linea de ins uções mais simples (ge al-
men e compac adas em biná io pa a melho pe o mance), ambém e e idas como by ecode.
Cada ins ução é depois execu ada den o de um ciclo. Es a solução o nece um balanço en e a-
cilidade de implemen ação e elocidade de execução (e i ando a g ande quan idade de chamadas
ecu si as de unções p esen es nos in e p e ado es ee walk).
Jus In Time O mé odo mais complexo (mas ambém o que o e ece melho pe o mance pa a a e as
pesadas). O código é execu ado inicialmen e po um dos dois mé odos an e io es, de modo a
ecolhe es a ís icas sob e qual o ipo de execução mais comum do código. Após es a ecolha, é
ge ado código máquina o imizado pa a os ipos de dados mais comuns de uma a iá el, ou pa a
os caminhos de execução mais p e alen es, pa a que seja possí el da p óxima ez que o mesmo
pedaço de código seja execu ado, isso oco a com ecu so ao código máquina. Es e p ocesso
é ge almen e epe ido ao longo da execução do p og ama, sendo que caso a e são de código
máquina ge ada ique desa ualizado (o ipo de dados usualmen e passados a uma unção mudem),
essa po ção de código seja in alidada e e en ualmen e subs i uída po uma no a e são mais
adequada.
É possí el e que a solução ideal se ia semp e a compilação Jus In Time (JIT), que e i a uma ase
de compilação explíci a e o çada ao u ilizado , mas ao mesmo empo consegue o nece pe o mance
52
5.2. SEMÂNTICA DINÂMICA
compe i i a pa a a e as mais exigen es. No en an o é ine i á el conclui que es a solução impõe cus os
de desen ol imen o as onómicos, e implica equipas de g ande dimensão e empos de desen ol imen o
ex emamen e longos.
Des a o ma a nossa escolha eside logicamen e en e a solução de In e p e ado e uma simples
By ecode VM. Acabamos po escolhe a p imei a opção pelas seguin es azões:
• A ge ação de e en os músicais é ela i amen e ba a a em e mos compu acionais (mesmo admi-
indo algumas dezenas de e en os músicais po segundo).
• A componen e mais pesada ge almen e eside na sin e ização dos e en os músicais (no e on, no e
o ) em s eams de audio, mas es a a e a é encaminhada pa a biblio ecas mais op imizadas e
desen ol idas em linguagens de baixo ní el.
• A possibilidade de co e código Py hon em qualque pa e da nossa linguagem já o nece um
bom meio e mo pa a quando é necessá ia mais alguma pe o mance em caminhos de execu-
ção c í icos (ho pa hs), sem sac i ica demasiado a simplicidade de uma linguagem des inada
p ima iamen e a músicos e não engenhei os in o má icos.
• Também a acilidade de implemen ação de um in e p e ado signi icou uma elocidade o dens de
magni ude supe io do que se ia possí el de ou a o ma, du an e a implemen ação da linguagem
e da p o o ipação de uncionalidades.
• Uma pos e io modi icação do in e p e ado pa a uma by ecode VM mais e icien e se ia possí-
el es ando a linguagem mais es abilizada, e se ia simples man e uma API i ualmen e 100%
compa í el.
Em conclusão, cada ope ação oi implemen ada a a és de um mé odo e al() em cada classe da
AST, ecebendo uma a iá el de con ex o como inpu , e usando depois o alo e o nado pela unção
como esul ado da a aliação da exp essão.
5.2.1 Con ex o
A a iá el de con ex o gua da o es ado da execução, e de e con e oda a in o mação necessá ia pa a
cada ins ução pode execu a . Os seus con eúdos podem se di ididos em ês componen es:
Times amp Es a p op iedade é um simples in ei o que pe mi e às exp essões de ge ação de e en os
musicais sabe em qual o empo i ual a ual. Es e empo i ual é manipulado pelos á ios ope a-
do es. O ope ado sequencial po exemplo, que ecebe uma lis a de exp essões e emi e uma lis a
de e en os musicais uns a segui aos ou os, a ança es e cu so pa a o im do úl imo e en o an es
de passa o con ex o pa a a alia a exp essão seguin e.
Voz Obje o que con ém as á ias p op iedades musicais que de em se aplicadas du an e a ge ação de
e en os, ais como a du ação base das no as, o compasso ou as ba idas po minu o.
53
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
Símbolos Um con en o que pe mi e acede e modi ica os símbolos disponí eis na linguagem ( ais
como a iá eis e unções).
Os con ex os o am desenhados com o in ui o de se em le es, daí apenas con e em e e ências pa a
ês a iá eis. Des a o ma é possí el c ia cópias dos con ex os e pe mi i que ope ações a iadas es ejam
a execu a ao mesmo empo com di e en es con ex os.
Pa a pe cebe mos a azão des a necessidade, bas a pensa mos no ope ado pa alelo. Se coloca mos
duas exp essões musicais que de em oca ao mesmo empo, a ge ação de uma (ou mais) no as na
p imei a exp essão não de e a e a o imes amp da segunda. Pa a is o, cada uma das exp essões de e
ecebe uma cópia do con ex o (com o imes amp inicial igual). Quando as duas exp essões e mina em,
no en an o, é impo an e que o con ex o o iginal (que ge ou as duas cópias) a ualize os seu imes amp
pa a qual o a exp essão mais longa.
Se p es a mos a enção, podemos es a aqui a de e a um pad ão bas an e comum na á ea da p o-
g amação: o modelo o k-join.
Apesa de es a mos a lida com no as e e en os musicais, undamen almen e es amos a c ia amos
pa alelos de execução, e que emos no inal agua da o seu esul ado e uní icá-lo com o amo o iginal. Se
subs i ui mos amo po h ead pa a o caso da p og amação, ou con ex o pa a o nosso caso, emos a
equi alência en e os concei os.
Como al, pa a além do es ado (as ês a iá eis) que o obje o de con ex o engloba, es e p o idencia
ambém algumas ope ações bas an e simples e ú eis:
Fo k C ia uma cópia do con ex o, podendo ecebe opcionalmen e ambém um in ei o como a gumen o
com is a a subs i ui o alo do imes amp do con ex o pai. Como segundo a gumen o pode am-
bém ecebe um no o scope de símbolos, algo que i emos ap o unda mais no capí ulo seguin e.
Join Recebe uma lis a de con ex os como a gumen o, e a ança o imes amp pa a o maio encon ado
nessa lis a.
Seek A ope ação de muda o imes amp do con ex o a ual.
Os con ex os não êm (nem p ecisam) de e e ências pa a ou os con ex os-pai ou con ex os- ilhos,
de modo a que não é p eciso g andes p eocupações ela i amen e a ugas de memó ia com a c iação de
no os con ex os: apenas são man idos em memó ia os con ex os que êm e e ências pa a eles, e que
po an o es ão ainda em uso.
5.2.2 Scope de Símbolos
Cada con ex o em uma e e ência pa a o scope de símbolos a que em acesso. Nes es scopes são gua -
dadas as a iá eis e unções que o u ilizado (e as biblio ecas s anda d da linguagem) decla a em. Mais
uma ez, cada obje o de scope é compos o po ês p op iedades: uma e e ência ao seu an ecesso
54
5.2. SEMÂNTICA DINÂMICA
(ou pai), uma abela de hash com os símbolos, e uma lag booleana pa a designa es e scope como
opaco.
O p óp io concei o de scope implica po si só uma hie a quia, e de ac o cada obje o scope gua da
uma e e ência pa a o seu pa en e (ou pa a o alo nulo, caso seja o scope aiz). Es a p op iedade é
u ilizada pa a as ope ações disponí eis, an o pa a pesquisa , como pa a a ibui alo es a símbolos do
scope a ual, algo que i emos e i ica mais a segui .
Pesquisa A ope ação de pesquisa po um símbolo começa po p ocu a o símbolo no p óp io scope, e
caso não encon e nada, na ega ecu si amen e pa a o scope pai pa a e e ua a pesquisa.
A ibuição A ope ação de a ibuição segue a mesma iloso ia da ope ação de pesquisa, p ocu ando o
scope onde o símbolo a a ibui es á gua dado. No en an o, es a pesquisa deco e a é encon a
o p imei o scope opaco. Um scope opaco não impede a lei u a de alo es de scopes supe io es,
mas impede a esc i a. Po exemplo, uma a ibuição den o de uma unção c ia apenas uma a iá el
den o do scope dessa unção.
Se encon a o símbolo nalgum scope, en ão muda o seu alo nesse scope onde es á decla ado.
Caso con á io, é c iado um no o símbolo no scope o iginal onde a ope ação de a ibuição oi
iniciada.
Enume ação A ope ação de enume ação pe mi e lis a quais os símbolos isí eis a pa i de um scope.
Ela pe mi e lis a não só os símbolos do p óp io scope, mas ambém dos seus pais, endo o
cuidado pa a não e o na símbolos que enham sido obscu ecidos po um scope mais em baixo.
Es a é ú il pa a impo a símbolos do scope de um módulo pa a ou o, ou pa a implemen a
uncionalidades como au ocomple e sob e um sc ip em execução (e pe mi i suge i os símbolos
disponí eis).
Apon ado es Como imos na a ibuição, é impossí el al e a alo es de a iá eis globais den o de
scopes opacos (como den o de unções, po exemplo). Pa a colma a isso, simila ao ope ado
global enonlocal do Py hon, é possí el ins ui um scope a c ia um apon ado pa a um
símbolo decla ado nou o scope, de o ma a que quando oco e alguma a ibuição, a al e ação é
eplicada no seu scope o iginal.
5.2.3 Módulos
O Musikla dispõe ambém da possibilidade de execu a código sepa ado em á ios ichei os, cada um
sendo conside ado um módulo. O u ilizado pode con igu a uma lis a de pas as (num concei o simila
à a iá el de ambien e $PATH) onde se ão p ocu ados módulos quando alguma ins ução impo é
a aliada. Também é possí el passa um caminho absolu o ou ela i o ao módulo que iniciou a impo ação.
Cada ichei o impo ado é execu ado apenas uma ez du an e a p imei a impo ação, e no inal o seu
scope é gua dado em cache pa a se usado em u u as impo ações.
55
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
Cada ins ução de impo ação é di idida em duas ases: p imei o, o caminho passado é esol ido no
caminho eal e absolu o do ichei o. Só depois é e i icada na cache se o ichei o já oi impo ado an es.
Uma ez ob ido o seu scope, os seus símbolos são enume ados e copiados pa a o scope que e e uou a
impo ação (com símbolos que comecem com um unde sco e sendo a ados como símbolos p i ados
e igno ados).
Pa a isso, quando o in e p e ado é inicializado, é c iado um scope aiz chamado p elude, e um
scope ilho. Cada módulo impo ado é execu ado num scope c iado semp e a pa i do p elude. Des a
o ma, os símbolos aí gua dados es ão semp e acessí eis em odos os módulos impo ados.
5.2.4 Ope ado es Musicais
A sin axe supo a os ope ado es a i mé icos e de compa ação usuais nas linguagens de p og amação. De
modo ge al, a sua sin axe e semân ica na nossa linguagem, o que se ia expec á el pa a cada um deles,
pelo que não ale enume á-los a odos nes a secção. No en an o, exis em alguns ope ado es menos
con encionais, ou a é o e loads de ope ado es con encionais (como o ope ado de mul iplicação e
adição) que uncionam de o ma di e en e quando emp egues jun o a alo es do ipo musical. São esses
os casos que i emos abo da nas seguin es sub-secções.
Um aspe o impo an e a e em con a é que es es ope ado es não es ão es i os g ama icalmen e pa a
acei a apenas exp essões musicais, mas acei a sim qualque ipo de exp essão. O seu ipo (e po an o a
sua semân ica) são apenas decididos em un ime (imi ando o modo de uncionamen o do o e loading
de ope ado es em Py hon). Is o é necessá io po que uma a iá el pode con e an o um núme o como
uma exp essão musical, e o seu e dadei o alo apenas é conhecido em execução.
5.2.4.1 Sequencial/Conca enação
Ao longo des e documen o já imos á ias ins âncias de como decla a uma no a ou um aco de. O a o
de conca ena esses e en os (ou seja, ep oduzi-los em sequência) é ão undamen al pa a a linguagem
que ambém é algo que já imos inúme as ezes nos exemplos sem pensa mui o nisso. Uma das azões
pa a isso de e-se à sua sin axe (ou al a dela, na e dade). O a o de conca ena e en os musicais é ão
simples como esc e ê-los uns à en e dos ou os, sem nenhum ipo de sepa ado especial (pa a além
dos opcionais espaços em b anco). O e en o icam com o seu empo inicial semp e igual ao empo inal
do e en o an e io .
1S4/4 T74 L/8 V90;
2A,EAB^cBAED^F^ce^cA3;
Lis agem 5.12: Exce o da música We Hands de C418
Também é impo an e salien a o ac o de que as lis as de ins uções (s a emen s) seguem a mesma
semân ica do ope ado de conca enação. Cada linha só ai oca as suas no as quando as linhas an e io es
6Rende izado com a biblio eca $ABC_UI, com alguns ajus es manuais ei os pa a melho a a cla eza.
7Conca enação h ps://d i e.google.com/open?id=1TP4lcul81s8iMCUFmD3HKnSpe CzKT0
56
5.2. SEMÂNTICA DINÂMICA
Figu a 5.4: Pau a musical ge ada pela linguagem6, e são áudio disponí el aqui7.
i e em acabado. Nes e exemplo po an o, e udo na mesma linha ou sepa ado em duas (ou mais) em
o mesmo esul ado, a iando apenas a legibilidade.
5.2.4.2 Repe ição
O ope ado de epe ição é bas an e simila ao ope ado de conca enação. E az sen ido, uma ez que
epe i uma exp essão musical N ezes pode se pensado como um caso pa icula da conca enação
onde exis em Nope andos, odos iguais, uns em en e aos ou os.
1I1 S6/8 T140 L/8 V90;
2A*11 G F*12
Lis agem 5.13: Exce o do começo do ema p incipal de Wes wo ld, po Ramin Djawadi
Figu a 5.5: Pau a musical ge ada pela linguagem, e são áudio disponí el aqui8.
Es e ope ado , apesa de bas an e simples, é ambém bas an e ú il pa a epe i pequenos acompa-
nhamen os (mesmo no as singula es) mui as ezes, ou a é pa a epe i poucas ezes acompanhamen os
mais complexos. E i ando epe i os acompanhamen os no código, é possí el e e ua al e ações em ape-
nas um sí io e e essas al e ações epe i em-se ao longo de oda a es u u a musical.
5.2.4.3 Pa alelo
O ope ado pa alelo pe mi e ep oduzi múl iplas sequências de e en os musicais em pa alelo. Podemos
dize que concep ualmen e, o ope ado pa alelo é uma unção que ecebe uma lis a de sequências musi-
cais, e e o na uma única sequência com odas as sequencias combinadas. No en an o é impo an e que
lemb a que o ope ado em de espei a os p incípios de lazyness (não pedi mais e en os de cada
ez do que o que os que são es i amen e necessá ios) e o dem (a sequência de e en os esul an es em
de es a es i amen e o denada pelo empo de início de cada e en o).
8Repe ição h ps://d i e.google.com/open?id=1IIm8PQkLsNFMK9MNSVubJSG6SP6KwhPL
57
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
no as com o alo 15, pelo que ado amos esse alo como a nossa base (o que despe diça 15 luga es em
cada ins umen o que pode iam se associados a sons). Como na SoundFon podemos u iliza ambém
á ios ins umen os, isso signi ica a que ainda assim conseguíamos ep oduzi 127 ×113 =14351 sons
dis in os, o que é bas an e mais do que su icien e pa a a maio ia dos casos.
5.3.1.2 MIDI
Uma uncionalidade ex emamen e impo an e e necessá ia pa a inclui de base oi o supo e pa a lei u a
e esc i a de dados MIDI. Is o an o pelo ac o de que o s anda d MIDI é um dos mais u ilizados no
mundo da música, mas ambém po que a nossa implemen ação da linguagem, pa icula men e ela i a
à ep esen ação dos e en os musicais em memó ia, oi o emen e inspi ada po es e o ma o. Dessa
o ma, implemen a unções de ans o mação dos não exigiu demasiado es o ço. Pa a o e ei o, u ilizamos
o módulo Py hon mido, que pe mi e le e esc e e e en os MIDI, an o de po as como de ichei os em
disco.
A ní el de lei u a (inpu ), o módulo disponibiliza uma unção eadmidi() que pe mi e le e en os
musicais de um ichei o ou po a MIDI, e o nando um obje o do ipo Music. A unção acei a os seguin es
pa âme os (sendo os pa âme os de ichei o ou de po a mu uamen e exclusi os):
ile (Opcional) Quando p esen e, lê os e en os musicais de um ichei o MIDI.
po (Opcional) Pe mi e le os e en os de uma po a em ez de um ichei o. Es e pa âme o acei a
á ios alo es.
T ue Se ecebe es e alo , en a lis a as po as MIDI disponí eis e escolhe a mais indicada pa a
le os e en os.
Lis [S ing] Uma lis a de nomes de po as pa a escu a . Os e en os das po as e e idas são
combinados numa única sequência de e en os, como se iessem odos da mesma po a.
S ing O nome de uma única po a pa a es a à escu a de e en os.
oices (Opcional) Uma lis a de ozes pa a mapea a cada canal MIDI a que os e en os pe encem.
Quando nenhuma oz é especi icada, a oz a ual p esen e no con ex o é u ilizada pa a odos os
canais.
cu o _sequence (Opcional) Uma sequência de no as ou e en os músicais que, quando ecebidos
pelas po as MIDI, são u ilizados como sinal pa a e mina imedia amen e a lei u a e e o na a
sequência de e en os já cap u ada. É igno ada quando a on e de lei u a é um ichei o.
igno e_message_ ypes (Opcional) Uma lis a de s ings com os nomes de mensagens MIDI que
de em se igno adas.
64
5.3. BIBLIOTECA STANDARD
É ambém possí el esc e e (ou pu ) pa a po as e ichei os MIDI de o ma bas an e simples. Es e
ou pu é a i ado au oma icamen e quando se g a a um ichei o com a ex ensão MIDI, ou quando se
p e ixa o nome de uma po a com a s ing midi://.
Ao esc e e pa a ichei os ou po as MIDI, é possí el il a apenas os e en os de ce as ozes, e
mapea ambém os canais a ibuídos a cada oz. Is o é ex emamen e ú il pa a pe mi i liga a aplica-
ção a p og amas DAW, e pe mi i ecebe os e en os MIDI em aixas sepa adas (pa a aplica e ei os ou
ans o mações especí icas a cada aixa).
5.3.1.3 ABC
Ou o dos o ma os de saída supo ados é o o ma o abc no a ion. A sin axe das no as e aco des da
nossa linguagem é o emen e inspi ada nes a no ação, pelo que não se ia es anho pensa que esc e e
pa a es e o ma o não se ia nada de especial. E em pa e é e dade, na medida que ge a o ex o com o
o ma o ce o não é complicado.
A maio di e ença é, no en an o, o ac o de que o o ma o abc é es á ico, e a sua es u u a oi dese-
nhada pa a imi a de ce a o ma a no ação das pa i u as musicais. Tudo is o en ol e concei os como
ag upa as no as po ozes, pau as, compassos, cla es, en e ou os. De ce a manei a, o modelo de da-
dos que a linguagem usa pa a ep esen a as no as em memó ia mapeia-se de o ma mui o mais simples
pa a o o ma o MIDI do que pa a o abc.
Pa a colma a es e ac o, os e en os, an es de se em con e idos pa a o o ma o abc, são in oduzidos
numa pipeline que execu a uma sé ie de passos de modo a o na a con e são mais simples. De g osso
modo, os passos pela o dem que são execu ados, são os seguin es:
1. Em p imei o luga o sis ema en a con e e quaisque no as que possam es a a se emi idas
como e en os on/o sepa ados. Is o acon ece quando, po exemplo, o eclado é usado, o que
pode implica começa a oca as no as sem sabe quando o u ilizado as ai pa a . Os pa es de
e en os são en ão con e idos num só e en o com a in o mação do início e da du ação da no a.
2. Em segundo luga , o sis ema en a iden i ica as no as pa alelas que possam es a a se emi idas e
que possam pe ence a um aco de. Is o acon ece mais uma ez quando, ao in és de usa a sin axe
de aco des p esen e na linguagem, o usa o eclado pa a ge a o aco de a a és de no as/ eclas
di e en es a i adas ao mesmo empo.
3. Em e cei o luga , as no as que pe ençam à mesma oz mas que enham o e lap na sua du ação,
são colocadas em linhas di e en es. Mais uma ez, is o acon ece mais equen emen e quando o
eclado é usado, onde o u ilizado pode es a a oca no as conco en emen e da o ma que quise .
4. Em qua o luga , são in e idos e en os pausa quando duas no as consecu i as pe encen es à
mesma oz êm um in e alo. Mais uma ez, is o acon ece mais equen emen e quando o u ilizado
oca com o eclado. Mas nes e caso pode ambém acon ece quando as no as são decla adas pela
65
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
sin axe da linguagem, como po exemplo na seguin e si uação A(B|C), onde as no as AeB
icam na mesma pau a. A no a C, no en an o, como se sob epõe com a no a B, pelo passo an e io ,
se ia mo ida pa a a sua pau a. No en an o, es a pau a não e ia nada ao início, e po isso p ecisa
de uma pausa. Se ia concep ualmen e equi alen e ao esul ado de (A B) | ( C).
5. Finalmen e em quin o luga , são in oduzidos e en os especiais na sequência musical pa a iden-
i ica , pa a cada oz em sepa ado, quando de em se in oduzidos no os compassos, ou no as
pau as na pa i u a. Do mesmo modo, is o implica que no as e aco des cuja du ação não caiba num
compasso, sejam di ididos quan as ezes o em necessá ios, e conec ados a a és de ligadu as.
Es as ans o mações são eu ilizá eis (não es ão o emen e acopladas ao o ma o abc) e são imple-
men adas u ilizando o concei o de ans o mado es, que i emos abo da mais à en e nes e documen o.
Mui as des as ans o mações são, no en an o, impe ei as po na u eza: a de eção de aco des a pa i
de no as pa alelas indi iduais, po exemplo, nunca pode e 100% de ce eza se as no as que ag upou são
ealmen e um aco de. É possí el que o músico i esse a in enção de que as á ias no as pe encessem a
ozes di e en es, po exemplo.
Pa a além dis o, a no ação musical é ão complexa que apenas uma pequena pa e é supo ada
pela nossa linguagem. Des e modo, é p eciso e em men e que apesa de a linguagem se capaz de
ge a ichei os abc álidos, e com a sua es u u a maio i a iamen e co e a de aco do com o que o
u ilizado i esse em men e, se ão mui as ezes necessá ios pequenos ajus es manuais pa a pe sonaliza
os esul ados aos gos os de cada um. Ainda assim, o ac o de não se necessá io esc e e o ichei o odo
manualmen e é po si só uma an agem eno me.
Is o po que o ichei o abc não se e só como um o ma o de ex o. Exis em á ias e amen as pa a
o con e e pa a ou os o ma os, como PDF. Po exemplo, o p oje o $ABC_UI14 é u ilizado pela nossa
linguagem pa a, em conjun o com o expo ado abc, ge a páginas HTML com uma ende ização da
pau a usando Scalable Vec o G aphics (SVG).
Des a o ma, podemos conclui que o o ma o abc se e como uma espécie de pon e s anda d,
e nos pe mi e apanha boleia pa a depois supo a inúme os ou os o ma os que exis am mui o mais
acilmen e.
5.3.2 Fichei os de Som
Como já oi mencionado no sub-capí ulo sob e o ou pu FluidSyn h, uma das uncionalidades que
que íamos implemen a na linguagem e a a possibilidade de ep oduzi ichei os de som a bi á ios, e
in eg a-los com o es o da ge ação de e en os musicais.
Is o ab e a possibilidade de inclui nos p oje os que usem a linguagem sons ge ados po ou os p og a-
mas, e mais uma ez ai de encon o ao nosso obje i o cen al de ex ensibilidade da linguagem. Podemos
pensa assim que mesmo que a aplicação não supo e odo o ipo de ge ação de sons que alguma pessoa
14h p://de .music. ee. /web-demo/ p o ec TU ex dolla ABC_UI.h ml
66
5.3. BIBLIOTECA STANDARD
possa p ecisa , é semp e possí el usa a aplicação pa a a maio ia dos casos mais comuns que são supo -
ados, e ge a ichei os com ecu so a alguma aplicação ex e na que colma em as nossas necessidades
mais especí icas. Pa a u iliza -mos es a uncionalidade, emos à nossa disposição o mé odo sample().
1A B sample( ”ciha .wa ” );
Lis agem 5.18: Exemplo de ep oduzi um ichei o a segui a duas no as
Pa a acili a odo o p ocesso, os ichei os de som de em segui odos as mesmas especi icações. Po
con eniência, ado amos as con igu ações supo adas pela biblio eca FluidSyn h pa a blocos de som
nas suas SoundFon s.
Con igu ação Valo
Fo ma o WAVE
Sample Ra e 41.100hz
Canais 2
Bi dep h 16bi
Comp essão N/A
Tabela 5.3: Fo ma o na i o supo ado pelo FluidSyn h
Pa a acili a a u ilização, é possí el ao u ilizado ca ega ichei os de som em o ma os di e en es
desde que enha a e amen a FFmpeg ins alada no sis ema. Quando isso oco e, a linguagem con e e
o ichei o musical backg ound, aplicando as con igu ações necessá ias, e gua da-o depois em memó ia.
Is o é especialmen e ú il pa a expe iências ápidas e com ichei os pequenos (a é alguns megaby es).
Es a uncionalidade az bas an e simplicidade à u ilização da linguagem, mas impõe um cus o du an e
a inicialização de odos os p og amas. Pa a pe mi i aos u ilizado es de e mina em se os seus ichei os
ão necessi a de con e são, sem e em de eco e a e amen as ex e nas pa a e e ua a e i icação,
disponibilizamos a unção is_sample_op imized(), em conjun o com a unção op imize_sample()
pa a con e e o ichei o e g a a o esul ado em disco.
1i ( no is_sample_op imized( ”ciha .wa ” ) ) {
2# Con e s he ile and sa es i o disc
3op imize_sample( ”ciha .wa ”, ”ciha _op .wa ” );
4};
Lis agem 5.19: Ve i ica se um ichei o de audio es á op imizado, e con e ê-lo caso con á io
Des a o ma a con e são oco e apenas uma ez, e de seguida o u ilizado pode u iliza o ichei o
con e ido e não se p eocupa com a pe da de pe o mance semp e que usa o som num sc ip .
67
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
5.3.3 G elhas
A linguagem em dois modos de p odução de música p incipais: exp essões musicais desc i as no có-
digo, e a u ilização de eclados em empo eal. Em e mos de p op iedades empo ais, de modo ge al, as
exp essões musicais são ge adas com empos p ecisos. Po ou o lado, como é na u al, músicas c iadas
a a és dos eclados musicais ão e empos impe ei os. Quando u ilizadas de modo sepa ado, as di e-
enças mui as ezes são ão sub is que não se no am. Mas quando que emos oca uma exp essão de
música p é-de inida em código ao mesmo empo que se u iliza um eclado, as di e enças e impe eições
podem-se o na mais ób ias (F ühau , Kopiez & Pla z, 2013).
A ope ação conhecida como Quan iza ion 15 é possí el na nossa linguagem a a és da u ilização
de G elhas. Uma ez que o obje i o das g elhas é pode em se u ilizadas em empo eal à medida que
as no as ão sendo ocadas, a o ma de uncionamen o escolhido pa a as g elhas é bas an e simples e
de e minís ica, dependendo apenas do empo ( imes amp) e ipo do e en o que que emos alinha .
Uma g elha é compos a po um núme o in ini o de células, odas do mesmo amanho, que se es-
endem ao longo do eixo empo al. Quando um e en o musical é ocado, esse e en o ai calha algu es
den o de uma dessas células. A esponsabilidade da g elha passa po de e mina se o e en o de e se
mo ido no empo, bem como pa a onde de e se mo ido. Pa a isso, de emos comp eende como cada
célula da g elha é di idida.
Figu a 5.11: Rep esen ação de duas células de uma g elha
Na igu a 5.11 podemos e ep esen adas duas células de uma g elha, cada uma com amanho de
1 segundo. Também podemos e que cada célula es á di idida em duas pa es, di ei a e esque da, e a
o dem dessas pa es pode pa ece engano, ou que es ão ocadas. Mas es ão co e as, pois na e dade
cada uma dessas pa es é ela i a não à célula, mas ao sepa ado das células.
Olhemos po exemplo pa a o di iso cen al, si uado em cima da ma ca do 1 segundo. A pa e à sua
esque da e e e-se à esque da do sepa ado , e a pa e à di ei a e e em-se à di ei a do sepa ado . Des a
o ma, az mais sen ido a o dem das pa es.
Po p ede inição, ambas as pa es êm o amanho igual a me ade do amanho da célula (ou seja, nes e
caso, an o a pa e da esque da e da di ei a êm o amanho de 0.5 segundos). No en an o, é possí el
cus omiza o amanho das duas de o ma igual, ou cada uma em pa icula , a a és das p op iedades
o gi eness e ange.
1$g id = G id( 1,
15h ps://en.wikipedia.o g/wiki/Quan iza ion_(music)
68
5.3. BIBLIOTECA STANDARD
Figu a 5.12: As á ias á eas con igu á eis de uma g elha
2 o gi eness = 125, # 1/8 o a second
3 ange = 375 # 3/8 o a second
4);
Lis agem 5.20: Código de de inição da g elha ep esen ada na igu a 5.12
Não nos esqueçamos que o obje i o da g elha é alinha e en os, mo endo os e en os ao longo do
eixo do empo pa a jun o dos sepa ado es das células. A p op iedade ange em como alo p ede inido
me ade do amanho da célula. Isso signi ica que an o o ange_le como o ange_ igh cob em de
modos igual oda a célula, e dessa os e en os são mo idos pa a o sepa ado da g elha que es i e mais
p óximo. O alo p ede inido da p op iedade o gi eness, po ou o lado, é ze o, o que signi ica que
mesmo os e en os que se encon em já mui o pe o dos sepa ado es são mo idos.
Na lis agem 5.20 podemos e a de inição de uma g elha simé ica (as p op iedades le e igh
são iguais). O alo de o gi eness implica que e en os que es ejam a mais de 372 milissegundos de
dis ância de qualque um dos sepa ado es são igno ados pela g elha, is o é, o seu empo não se mexe.
O alo de o gi eness, o que signi ica que e en os que es ejam a menos de 125 milissegundos de um
dos sepa ado es são ambém igno ados pela g elha. Nes e exemplo, são apenas mo idos os e en os que
es ejam en e 125 e 375 milissegundos de dis ância de um dos sepa ado es.
No e-se que cada p op iedade pode ia se cos umizada pa a a esque da e pa a a di ei a. Is o é, o
exemplo acima podia se eesc i o da seguin e o ma:
1$g id = G id( 1,
2 o gi eness_le = 125, # 1/8 o a second
3 o gi eness_ igh = 125, # 1/8 o a second
4 ange_le = 375, # 3/8 o a second
5 ange_ igh = 375 # 3/8 o a second
6);
Lis agem 5.21: Código al e na i o de de inição da g elha ep esen ada na igu a 5.12, com as p op iedades
le e igh
Se passa mos das p op iedades de con igu ação pa a a g elha esul an e, na e dade cada célula
passa a e dois e ec i e anges, duas á eas (uma pa a a esque da e ou a pa a a di ei a) onde os
69
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
e en os que aí calha em são mo idos. Os e en os o a dessas á eas são igno ados.
Figu a 5.13: Á eas em que a g elha i á mo e os e en os, e qual o sepa ado a que pe encem.
Tomemos como exemplo a seguin e si uação com ês e en os e a g elha de inida an e io men e: o
e en o A, como calha den o da á ea azul (de ido à p op iedade ange_ igh ), ai se elocado pa a o
empo ze o. O e en o B no en an o, como não calha em nenhuma á ea (de ido de ido a p op iedade o -
gi eness_le . Finalmen e, o e en o C como calha na á ea e melha (de ido à p op iedade ange_le
é elocado pa a o empo 2.
Figu a 5.14: Posição dos e en os após o alinhamen o com a g elha e sido aplicado.
O modo de uncionamen o das g elhas pode pa ece à p imei a is a um desnecessa iamen e com-
plexo, ou os exemplos um pouco a i iciais, mas o obje i o oi semp e pe mi i ao u ilizado aplica o ipo
de g elha que mais se adequa ao seu caso. Isso pode se uma simples g elha onde só de ine o ama-
nho de cada célula, e os anges são cada me ade de cada célula, empu ando odos os e en os pa a
o sepa ado que lhe es eja mais p óximo, ou exemplos de g elhas assimé icas, onde possi elmen e os
e en os são semp e mo idos só numa di eção (esque da ou di ei a) ou onde e en os que es ejam pe o
dos sepa ado es não sejam mo idos.
5.3.4 Teclados Musicais
Pa a além de pe mi i cons ui exp essões que ge am sequências de e en os musicais dinâmicas, algo
que es e e desde início no opo da nossa lis a de p io idades oi sem dú ida adiciona supo e pa a a
c iação de eclados in e a i os. Sendo es a linguagem desen ol ida em compu ado es, não se ia e ado
pensa que po eclado nos e e imos aos eclados ísicos dos compu ado es. E esses azem ce amen e
pa e, mas quando nos e e imos a eclados musicais, e e i-mo-nos à possibilidade de desc e e na nossa
linguagem mapeamen os en e e en os e exp essões musicais ou ações a execu a quando esses e en os
acon ecem.
70
5.3. BIBLIOTECA STANDARD
1@keyboa d {
2a: p in ( ”Tecla a ca egada” );
3b: d;
4};
Lis agem 5.22: Exemplo de decla ação de duas eclas
Esses e en os podem en ão se eclas de um eclado, mas ambém de um piano conec ado ao com-
pu ado , ou e en os do a o, ou de qualque ou o disposi i o de I/O que as pessoas quei am adap a ,
bas ando pa a isso he da a classe Keyboa dE en .
5.3.4.1 Tipos de E en os
Os ipos de e en o mais comum são eclas de eclado e de piano. Po essa mesma azão implemen a-
mos açúca sin á ico na de inição desses e en os (que são implemen ados pelas classes KeyS oke e
PianoKey, espe i amen e).
1@keyboa d {
2c l+c: ^c;
3[16]: d;
4[c']: e;
5};
Lis agem 5.23: Decla ação de ês e en os, o p imei o é uma combinação de eclas, o segundo e e ência
o i ual key code, e o e cei o uma no a MIDI
A lis a de ipos de e en os supo ados de base pela linguagem são os seguin es:
KeyS oke Es e ipo de e en os e e em-se às eclas do eclado. Pa a além de pe mi i em desc e e
eclas singula es, ambém supo am os modi icado es c l,al eshi . O e en o não ca ega
consigo nenhum pa âme o ex a.
Pa âme os: N/A
PianoKey Sinalizam quando uma no a é ocada e ecebida pela po a MIDI que a aplicação es eja à
escu a. T azem consigo um pa âme o que iden i ica a elocidade com que a no a oi p emida.
Pa âme os: $ el
MouseClick E en o oco e quando algum dos bo ões do a o é p emido. As in o mações sob e a posição
em que o a o se encon a, bem como qual o bo ão p emido e se oi p emido ou le an ado, são
incluídas como pa âme os des e e en o.
Pa âme os: $x,$y,$bu on $p essed
MouseMo e E en o oco e semp e que o a o é mo ido. Pode se ú il pa a con ola alguma a iá el
como se osse um slide . T ás como pa âme os as coo denadas do a o.
71
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
Pa âme os: $x,$y
MouseSc oll E en o despole ado quando a oda do a o é acionada. Pa a além de aze in o mações
sob e a posição do a o, indica ambém qual o alo que a oda se mo eu, an o na e ical (mais
comum) como ambém na ho izon al.
Pa âme os: $x,$y,$dx,$dy
Os pa âme os são algo que, como pudemos e , é disponibilizado po quase odos os ipos de e en-
os. Eles dão-nos a possibilidade de sabe que os e en os o am despole ados, mas sabe p op iedades
sob e o que os despole ou. Es es pa âme os podem se acedidos passando as a iá eis desejadas com
o nome do pa âme o (a o dem é i ele an e) à en e da decla ação do e en o. Essas a iá eis podem
depois se acedidas den o da ação do e en o.
1@keyboa d {
2[keyboa d MouseMo e] ($x, $y): p in ( $x, $y );
3};
Lis agem 5.24: Teclado que imp ime as coo denadas do a o semp e que ele se mo e
Pa a c ia no os ipos de e en os, bas a c ia uma no a classe em Py hon que de i e da classe
Keyboa dE en . Es a classe de e implemen a apenas dois mé odos ob iga ó ios (__hash__ e__eq__)
que são usados pa a gua da os e en os num dicioná io, icando cada e en o associado à sua ação.
Opcionalmen e pode se de inido um e cei o mé odo, ge _pa ame e s, que de e e o na um dicioná io
com as a iá eis e os seus espe i os alo es que o e en o disponibiliza. Cada ipo de e en o pode ambém
de ini uma p op iedade chamada bina y como e dadei a ou alsa.
Os biná ios e e em-se ao concei o de e en os que são concep ualmen e compos os po duas ases:
p emi e sol a . Exemplos des e ipo de e en os são, ob iamen e p emi e sol a eclas do compu ado
ou de um piano. A azão po que es e concei o é a ado como um caso pa icula na nossa linguagem,
ao in és de se em a ados como dois e en os sepa ados (PianoKeyP ess ePianoKeyRelease po
exemplo), de e-se ao ac o de os e en os biná ios mapea em de o ma bas an e elegan e com o concei o
de no e on eno e o na ge ação de música. E da mesma manei a que a nossa linguagem não ob iga o
u ilizado a decla a po cada no a o seu pon o de início e de im sepa ados, não a ia sen ido aze isso
pa a os eclados.
Po essa azão, os eclados podem (a a és dos modi icado es hold ex end que amos cob i a
segui ) mapea au oma icamen e o início e o im das no as decla adas em cada uma das suas eclas,
com os modos p ess e elease dos seus e en os.
5.3.4.2 Modi icado es de E en os
Cada e en o de um eclado em associada uma ação: essa ação pode e size e ec s, e opcionalmen e
e o na um e en o musical (ou uma sequência de e en os). Semp e que o e en o é despole ado, a ação
é a aliada e caso e o ne um obje o musical, esse é ep oduzido.
72
5.3. BIBLIOTECA STANDARD
Po p ede inição, o empo que a ecla es á p emida não a e a a du ação das no as emi idas. Pelo
con á io, a du ação das no as (e aco des e odo o es o de e en os musicais) é calculada com o que o
u ilizado i e de e minado no código. Is o acon ece po que o eclado pe mi e que o u ilizado de ina não
só um e en o musical pa a cada ecla, mas sim que possa de ini uma música comple a, se quise . Nes e
caso quando a ecla é p emida, a música começa a oca a é e mina .
Os modi icado es pe mi em cus omiza o compo amen o do eclado quando encon a alguma
sequência musical. Cada modi icado pode se aplicado a odo o eclado (quando apa ece à en e da
keywo d @keyboa d), ou se aplicada indi idualmen e a cada ecla.
epea Quando p esen e, o eclado ep oduz a música da ecla, e quando es a acaba , começa a oca
no amen e, sem pa a .
oggle Rep oduz a música da ecla a é es a se p emida no amen e (ou a música acaba ).
hold Rep oduz a música da ecla enquan o a ecla es i e p emida (ou a música acaba ).
ex end Tan o o oggle como o hold pe mi em e mina uma música mais cedo. Com es e modi icado ,
odas as no as ocadas pela ecla icam a i as enquan o a pessoa não ca ega no amen e na ecla
(em conjun o com o oggle), ou a la ga (em conjun o com o hold).
Assim, se quise mos eplica o compo amen o de um piano, po exemplo, em que p emi a ecla
começa a oca uma no a, e libe a-la pa a a no a, podemos usa os modi icado es hold ex end em
conjun o.
1@keyboa d hold ex end {
2a: c;
3s: d:
4d: e;
5};
Lis agem 5.25: Aplica o modi icado hold ex end a um eclado in ei o
5.3.4.3 Es u u as de Con olo
A é ago a emos is o como é possí el decla a manualmen e ações num eclado. Algo que ainda não
oi di o é o ac o de o bloco de decla ação de um eclado @keyboa d {} se uma mac o que, an es da
execução, é aduzida pa a ins uções que c iam o eclado e egis am as eclas.
1{
2$__keyboa d = keyboa d c ea e();
3keyboa d push_ lags($__keyboa d; 'hold'; 'ex end');
4keyboa d egis e ($__keyboa d; 'a'; c);
5keyboa d egis e ($__keyboa d; 's'; d);
6keyboa d egis e ($__keyboa d; 'd'; e);
73
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
No u u o, e a in e essan e melho a o au o-comple e pa a comple a sub-p op iedades de obje os e
lis as, bem como mos a in o mações adicionais sob e as suges ões, al como os seus ipos e no caso
de se em mé odos, quais os pa âme os que acei a.
5.3.6 T ans o mado es
Os ans o mado es são uma solução pa a um p oblema p á ico que su giu du an e o desen ol imen o
do p oje o, ao in és de se em uma uncionalidade pública da linguagem. No en an o a azão pela qual
o am necessá ios, bem como a solução desen ol ida, podem se in e essan es de se em discu idas. Pa a
comp eende mos melho a azão da sua necessidade, imaginemos o seguin e caso.
5.3.6.1 O P oblema
Um dos ipos de dados mais impo an es na nossa linguagem é o ipo música, que como já e e imos
á ias ezes pode se ep esen ado como uma sequência de e en os musicais. Quando pensamos em
sequências, é ácil imagina uma a iedade de ope ações gené icas possí eis de se em aplicadas nelas,
como map e il e .
Mas ambém exis em ope ações mais especí icas ao nosso caso que podemos que e aplica , como
dada uma sequência de e en os, sepa a os No eE en em dois No eOnE en eNo eO E en . Is o
à p imei a is a pode pa ece um simples la Map, em que alguns e en os são ans o mados em dois a
se em inse idos na sequência. No en an o, uma ez que os e en os nas nossas sequências de em iaja
semp e o denados, não podemos simplesmen e inse i o e en o o jun o do on, po que podem exis i
ou os e en os que comecem ao mesmo empo ou depois da nossa no a começa , mas an es dela acaba .
Nesse caso bas a cons ui mos uma algo i mo simples que gua de num bu e o denado os e en os
o , e os á inse ido imedia amen e a ás do p imei o e en o com um imes amp maio que os seus.
E como es e, exis em á ios algo i mos que podem se usados e eu ilizados em di e sas pa es da
aplicação com os mais di e sos p opósi os de ans o ma sequências de e en os.
O p oblema su ge quando a on e da música pode se sinc ona (no caso de uma exp essão da nossa
linguagem) ou assínc ona (no caso de um eclado ou piano, em que os e en os ão sendo ge ados em
empo eal). Py hon supo a assinc onia a a és do módulo asyncio que pode se usado em conjun o
com a sin axe async/awai .
Pa a simpli ica os exemplos seguin es, omemos o caso da ope ação gené ica map. As suas imple-
men ações, nas a ian es sínc ona e assínc ona, pode iam se desc i as como is o na lis agem 5.37.
1de map ( n):
2 o e en in music:
3yield n(e en )
4
5async de map_async ( n):
6async o e en in music:
7yield n(e en )
80
5.3. BIBLIOTECA STANDARD
Lis agem 5.36: Exemplo de uma unção map com e sões sinc onas e asínc onas
Como podemos e , quando a única di e ença no algo i mo é se a on e é sínc ona ou assínc ona,
a a iação é mínima. Mas a di e ença é sin á ica, po isso e íamos duas escolhas:
• Pa a cada algo i mo c ia duas e sões, uma sínc ona e ou a assínc ona. Mas is o le a a a dupli-
cação de código pa icula men e má, po que o que i ia muda e am apenas duas pala as em
odas as unções.
• Usa semp e a e são assínc ona, mesmo quando a on e dos dados é sínc ona. Is o po que é sem-
p e possí el con e e uma sequência de dados sínc ona em assínc ona, mas o in e so já não é. O
p oblema des a solução é o ac o de as unções assínc onas e em co 16, e só pode em se cha-
madas po unções da mesma co . Qualque unção que po encialmen e lidasse com exp essões
musicais e ia de passa a se assínc ona. E como a nossa linguagem em ipos dinâmicos, po en-
cialmen e qualque exp essão pode e o na uma sequência musical, logo odas as exp essões
na nossa linguagem e iam de se execu adas em modo assínc ono, o que a ia uma penalização
a ní el de pe o mance di ícil de jus i ica .
5.3.6.2 A Solução Escolhida
A solução passou po c ia uma abs ação a que chamamos T ans o mado , que con ém um bo-
cado das duas opções an e io es: Os algo i mos são decla ados apenas uma ez, e são depois en ol os
num ans o mado que disponibiliza duas in e aces públicas, uma sínc ona e ou a assínc ona. Cada
ans o mado em uma in e ace pública compos a po 4 unções que pe mi em simula um i e ado :
add_inpu ( e ),end_inpu (),add_ou pu ( e ) eend_ou pu ().
Pa a e i a chama manualmen e as unções e a a do con olo do luxo de execução manualmen e,
são incluídos dois mé odos de classe em odos os ans o mado es que pe mi em co e um i e ado
(sínc ono ou assínc ono). As unções, chamadas i e eai e ecebem (e e o nam) espe i amen e
um i e ado sínc ono e assínc ono.
Vejamos ago a um exemplo do ans o mado map na lis agem 5.37. Pode pa ece bas an e mais
e bosa do que as unções map iniciais, mas é impo an e no a que es e cus o é ixo: só es a pa e do
algo i mo muda, e odo o es o se ia igual. Como os ans o mado es u ilizados no p oje o são bem mais
complexos do que es e pequeno exemplo (podendo e mais de uma cen ena de linhas de código), es e
cus o ixo de esc e e ce ca de seis linhas de código boile pla e po ans o mado não é um p oblema
ão g ande.
1class MapT ans o me (T ans o me ):
2de __ini __ (sel , n):
3sel . n = n
16h ps://jou nal.s u wi hs u .com/2015/02/01/wha -colo -is-you - unc ion/
81
CAPÍTULO 5. DESENVOLVIMENTO DO INTERPRETADOR MUSIKLA
4
5de ans o m ( sel ):
6while T ue:
7done, alue = yield
8
9i done: b eak
10
11 sel .add_ou pu ( sel . n( alue ) )
Lis agem 5.37: Implemen ação da unção map usando a nossa abo dagem de ans o mado es
Todos os ans o mado es implemen am uma unção ge ado ans o m, que é a peça cen al de
udo is o. Aí den o, emos um ciclo esponsá el po emula a i e ação sob e a sequência de inpu .
Depois u ilizamos a ins ução yield pa a ob e o p óximo alo . Aqui es amos a ap o ei a o ac o de es a
ins ução não pe mi i apenas en ia alo es pa a o a do ge ado (que é o seu uso mais comum), mas
ambém ecebe alo es. Des a o ma o ge ado ica em pausa a é ecebe o p óximo e en o. A an agem
des a pausa é que pode se e omada logo de seguida se es i e mos a abalha com i e ado es sínc onos,
ou pode ica assim a é o p óximo alo ica disponí el, no caso de um i e ado assínc ono.
1# I á imp imi 0, 2, 4, 6, 8
2 o e in MapT ans o me .i e ( ange( 5 ), lambda e:e*2):
3p in ( e )
Lis agem 5.38: Exemplo de um ans o mado map e da sua u ilização
Na lis agem 5.38 podemos e a u ilização do ans o mado aplicada a uma lis a (já que ambém
implemen am a in e ace de um i e ado ). O mé odo ai e pode ia se usado de o ma análoga com um
async o e com um i e ado assínc ono.
5.4 Resumo do Desen ol imen o
O p ocesso de desen ol imen o oi bas an e ágil, sendo es u u ado de uma o ma i e a i a, em que a cada
semana e am implemen adas no as uncionalidades. Es as podiam depois se pos as à p o a, aplicadas
a casos de es udo, e possi elmen e melho adas numa i e ação u u a.
O empo dedicado a cada um dos componen es da linguagem Musikla oi in e calado en e a análise
sin á ica, semân ica dinâmica e a biblio eca s anda d. Nem odas as uncionalidades exigi am es o ço ou
empo equi alen es, e apesa de linhas de código não mapea em pe ei amen e pa a empo despendido,
pe mi em e alguma noção ap oximada do mesmo.
Ob iamen e sendo es es núme os apenas uma con agem das linhas a uais, não são uma ep esen-
ação o al de udo o que oi p og amado, pois não êm em con a pa es do código que o am eesc i as
ao longo do desen ol imen o, como oi o caso da g amá ica e do econhecedo sin á ico, po exemplo.
82
5.4. RESUMO DO DESENVOLVIMENTO
Componen e Linhas de Código Pe cen agem
Análise Sin á ica 1090 11%
Semân ica Dinâmica 5268 53%
Biblio eca S anda d 3527 36%
To al 9885 100%
Tabela 5.4: Linhas de código (sem linhas azias ou de comen á io) do p oje o Musikla
Pa a além des es componen es, oi desen ol ido pa a se usado na documen ação um u ili á io em
Ja aSc ip 17 com ce ca de 500 linhas de código, que pe mi e desc e e e ge a os diag amas sob e
g elhas ( ambém usados nes a disse ação). A documen ação es á esc i a no o ma o Ma kdown e con a
ambém com um pouco mais de 700 linhas de ex o. Es e núme o não pode no en an o se compa ado
di e amen e com as linhas de código, já que ex o em p osa e código são concei os di e en es. Ainda assim
ajudam a e ideia do que oi ei o, pa a além da esc i a da des a disse ação, do a igo publicado e do
desen ol imen o do in e p e ado Musikla.
17Código disponí el em h ps://gi hub.com/ped omsil ap /miei-disse a ion/blob/mas e /code/musikla/docs/asse s/
gene a o .js
83
Capí ulo
6
Guia Rápido de U ilização
O esul ado inal do p ocesso de desenho e desen ol imen o desc i o acima oi um módulo Py hon
publicado no eposi ó io PyPi chamado musikla. Es e módulo pode se usado a a és da linha de
comandos, ou os seus sub-módulos podem se usados di e amen e num p oje o Py hon.
Nes a secção amos aze uma pequena o e iew dos di e sos modos de como o módulo pode se
u ilizado ( e são da documen ação mais comple a disponí el em na web).
A ins alação é bas an e simples, sendo su icien e co e o comando seguin e comando:
1pip ins all musikla
Lis agem 6.1: P ocesso de ins alação do package musikla
É impo an e no a que uma dependência cen al da linguagem é a biblio eca na i a FluidSyn h.
Apesa de exis i uma e são 2.x, essa não é supo ada a ualmen e, pelo que é necessá io o u ilizado
ce i ica -se que o seu sis ema em a e são 1.x ins alada.
6.1 Módulos
O p oje o musikla es á di idido em bas an es sub-módulos, os mais impo an es dos quais são lis ados
aqui:
musikla.co e. heo y Con ém classes e unções auxilia es ela i as à eo ia músical, u ilizadas po di-
e sos ou os sub-módulos.
musikla.co e.e en s. ans o me s Albe ga os ans o mado es esponsá eis po sepa a no as mu-
sicais em e en os On/O , po exemplo, ou po en a ag upa no as conco en es em aco des, se
o o caso disso, en e mui os mais.
85
CAPÍTULO 6. GUIA RÁPIDO DE UTILIZAÇÃO
musikla.co e.e en s Con ém as classes que ep esen am os e en os musicais em memó ia, desde
os mais ób ios, como o No eE en ,Cho dE en ou Res E en , mas ambém ou os menos
ób ios como o Con olChangeE en , po exemplo.
musikla.co e Disponibiliza mui as das classes mais undamen ais pa a o uncionamen o da linguagem,
ais como Con ex ,Music,Ins umen ,Voice,SymbolsScope, en e ou os.
musikla.pa se .abs ac _syn ax_ ee Con ém as classes que ep esen am os di e sos nós da AST.
musikla.pa se Disponibiliza as classes Pa se , esponsá eis po c ia uma AST com base numa
s ing ou num ichei o con endo código Musikla, bem como a classe CodeP in e esponsá-
el pelo p ocesso opos o, ans o mando de ol a uma AST numa s ing usando a sin axe da
linguagem.
musikla.audio.sequence s Albe ga os di e sos sequenciado es ( o ma os de saída) supo ados na i-
amen e pela linguagem.
musikla.audio Con ém as classes Playe eIn e ac i ePlaye que pe mi em ep oduzi sequên-
cias musicais pa a os sequenciado es.
musikla.lib a ies Disponibilizam as á ias classes que de inem as unções e símbolos expos os pa a
a linguagem Musikla pela biblio eca s anda d.
musikla O módulo p incipal, con ém as duas classes esponsá eis po inicializa odos os sis emas
necessá ios pa a a linguagem unciona , CliApplica ion eSc ip .
6.2 Con igu ação
Quando a aplicação é inicializada, é opcionalmen e ca egado um ichei o musikla.ini se es e se encon-
a na pas a Home do compu ado do u ilizado . Es e ichei o pe mi e con igu a di e sos dos alo es po
p ede inição u ilizados pela linguagem. A maio ia des as p op iedades pode se subs i uída e cos umizada
em cada execução quando a linguagem é execu ada pelo e minal.
1[Musikla]
2sound on = /pa h/ o/sound on .s 2
3ou pu = -o alsa
4midi_inpu = midi inpu po name
5pa h = colon : sepa a ed lis o pa hs o sea ch o when impo ing iles
6p elude = colon : sepa a ed lis o pa hs o include in he p elude (wha is a ailable o all
,→modules)
7au oload = colon : sepa a ed lis o pa hs o execu e be o e he main ile does
8
9[FluidSyn h.Se ings]
10 audio.pe iods = 2
86
6.3. LINHA DE COMANDOS
11 audio.pe iod-size = 64
12 syn h.sample- a e = 44100
Lis agem 6.2: Exemplo de um ichei o de con igu ação da linguagem
O alo da p op iedade sound on indica o caminho do ichei o .s 2 a usa pela linguagem pa a
sin e iza os sons.
A p op iedade ou pu pe mi e indica qual ou quais os sequênciado es (e os seus pa âme os) a
se em po p ede inição u ilizados quando o u ilizado não especi ica nenhum em pa icula . A sua sin axe
é explicada em mais de alhe no capí ulo seguin e.
A p op iedade midi_inpu pe mi e indica o nome da po a MIDI a usa quando algum eclado es á
à escu a de e en os MIDI.
A p op iedade pa h pe mi e lis a um conjun o de caminhos que se ão p ocu ados semp e que o
u ilizado impo e algum ichei o global nos seus sc ip s.
A p op iedade p elude indica uma lis a de sc ip s Musikla a se em execu ados e ca egados, e cujos
símbolos expo ados de em ica disponí eis pa a odos os ou os módulos.
A p op iedade au oload é simila à p elude, mas os símbolos apenas são disponibilizados pa a o
ichei o que o u ilizado es i e a co e di e amen e (o ichei o en y poin , podemos dize ).
Na secção FluidSyn h.Se ings podemos al e a manualmen e as p op iedades passadas ao sequên-
ciado FluidSyn h. A lis a de p op iedades e alo es supo ados es á disponí el aqui1.
6.3 Linha de Comandos
A linha de comandos pode se execu ada a a és do comando musikla. Podemos execu a um ichei o
passando o seu caminho como a gumen o. Também podemos co e musikla –help pa a e mos uma
lis agem dos a gumen os supo ados.
1musikla ile.mkl --sound on cus om_sound on .s 2
2-o alsa --gain 1
3-o music.wa
4-o musikla_po - midi --po
Lis agem 6.3: Exemplo de um ichei o de con igu ação da linguagem
O comando pode e uma lis a de seuquênciado es (ou ou pu s) pa a u iliza . Es es de em i semp e
no im do comando, depois de odos os a gumen os e opções globais, e são iden i icados pela opção -o
ou –ou pu . O ipo do sequênciado é ge almen e in e ido pelo alo passado ao ou pu , mas caso haja
ambiguidade, é possí el iden i ica manualmen e o o ma o com a opção - ou – o ma . Também são
passadas a esse ou pu odas as opções que es i e em depois do -o e a é ao im do comando, ou a é
ao p óximo -o encon ado. As opções acei es a iam com o o ma o do ou pu .
1FluidSe ings.xml h p://www. luidsyn h.o g/api/ luidse ings.xml
87
Capí ulo
7
Conclusão
O desen ol imen o do p oje o en ol e á ios aspe os, desde o desenho da sin axe e da g amá ica co -
esponden e, a é à ge ação de sons a se em gua dados em ichei os ou ep oduzidos imedia amen e em
disposi i os áudio. Também engloba aspe os comuns em odas as linguagens de p og amação, em con-
jun o com ques ões mais especí icas sob e como ge i o concei o de empo na linguagem, de laziness
pa a ge a apenas as no as necessá ias, en e mui os ou os.
Pa a além disso ambém ab ange quais as e amen as e as me odologias que são mais adequadas
pa a a u ilização da linguagem. É necessá io pa a isso es uda com exemplos eais, qual a melho o ma
de p oduzi e desen ol e música em o ma o ex ual. Quais as unções e as suas in e aces que são mais
ú eis disponibiliza logo à pa ida a odos os u ilizado es.
No en an o, sendo a c iação musical uma á ea ão ampla, é inú il en a seque consegui desen ol e
uma e amen a que cub a odos os can os e si a odas as necessidades dos seus po enciais u ilizado-
es. É po isso que é impo an e apoia o desen ol imen o do p oje o nas an agens que a linguagem
Py hon o nece, que a ní el da sua acilidade de uso, popula idade, e ácil ex ensão sem necessidade
de complicados p ocessos de compilação.
O p oje o oi po isso desen ol ido com ex ensibilidade em men e, endo como obje i o p incipal se i
como uma undação es á el capaz de liga as di e sas e amen as exis en es, não só na á ea da música,
mas pe mi i liga a música a ou as á eas.
Du an e o desen ol imen o, o nou-se cla o que c ia música a a és de p og amação é uma o ma
ex emamen e pode osa de se abalha em mui as si uações, mas não é uma solução pe ei a pa a odos
os casos. Com is o em men e, sen imos que a nossa escolha de inclui di e amen e na nossa linguagem
a possibilidade de p og ama eclados pe mi e cob i os momen os em que o u ilizado p ecisa de uma
o ma mais in e a i a e imedia a de oca e compo músicas. Pa a além disso, as uncionalidades ex a
de pe mi i g a a e ep oduzi as pe o mances em bu e s enquan o os eclados es ão a i os, bem
como a inclusão de um simples edi o de código que pe mi e esc e e e execu a código em un ime
89
APÊNDICE A. GRAMÁTICA PEG
28 a gumen s <- single_a gumen ( _ a gumen s_sepa a o _ single_a gumen )*;
29
30 single_a gumen <- single_a gumen _p e ix _ ”$” iden i ie _ ”=” _ exp ession
31 / single_a gumen _p e ix _ ”$” iden i ie
32 ;
33
34 single_a gumen _p e ix <- ”exp ” / ” e ” / ”in” / ””;
35
36 a gumen s_sepa a o <- ',' / ';';
37
38 o _ a iables <- a iable ( _ a gumen s_sepa a o _ a iable )*;
39
40 o _loop_head <- ” o ” _ ”(” _ o _ a iables _ ”in” _ alue_exp ession _ ”..” _
,→ alue_exp ession _ ”)”
41 / ” o ” _ ”(” _ o _ a iables _ ”in” _ alue_exp ession _ ”)”
42 ;
43
44 o _loop_s a emen <- o _loop_head _ ”{” _ body? _ ”}”;
45
46 while_loop_s a emen <- ”while” _ ”(” _ exp ession _ ”)” _ ”{” _ body _ ”}”;
47
48 i _s a emen <- ”i ” _ ”(” _ exp ession _ ”)” _ ”{” _ body _ ”}” _ ”else” _ ”{” _ body _ ”}”
49 / ”i ” _ ”(” _ exp ession _ ”)” _ ”{” _ body _ ”}”
50 ;
51
52 e u n_s a emen <- ” e u n” _ exp ession?;
53
54 // BEGIN Keyboa d
55 keyboa d_decla a ion <- ”@keyboa d” (_ alphanume ic)* ( _ g oup )? _ ”{” _ keyboa d_body _ ”}”
,→;
56
57 keyboa d_body <- keyboa d_body_s a emen ( _ ”;” _ keyboa d_body_s a emen )* _ ”;”?
58 / ””
59 ;
60
61 keyboa d_body_s a emen <- keyboa d_ o
62 / keyboa d_while
63 / keyboa d_i
64 / keyboa d_block
65 / keyboa d_sho cu
66 ;
67
68 keyboa d_ o <- o _loop_head _ ”{” _ keyboa d_body _ ”}”;
69
70 keyboa d_while <- ”while” _ ”(” _ exp ession _ ”)” _ ”{” _ keyboa d_body _ ”}”;
96
71
72 keyboa d_i <- ”i ” _ ”(” _ exp ession _ ”)” _ ”{” _ keyboa d_body _ ”}” _ ”else” _ ”{” _
,→keyboa d_body _ ”}”
73 / ”i ” _ ”(” _ exp ession _ ”)” _ ”{” _ keyboa d_body _ ”}”
74 ;
75
76 keyboa d_block <- ”{” _ body _ ”}”;
77
78 keyboa d_sho cu <- keyboa d_sho cu _key _ keyboa d_a gumen s? _ ”:” _ exp ession
79 ;
80
81 lis _comp ehension <- exp ession ” o ” _ ”$” _ namespaced _ ”in” _ alue_exp ession _ ”..” _
,→ alue_exp ession
82 / exp ession ” o ” _ ”$” _ namespaced _ ”in” _ alue_exp ession _ ”..” _
,→ alue_exp ession _ ”i ” alue_exp ession
83 ;
84
85 keyboa d_sho cu _key <- alphanume ic (_”+”_ alphanume ic)* (_ alphanume ic)*
86 / s ing_ alue (_ alphanume ic)*
87 / ”[” _ lis _comp ehension _ ”]” (alphanume ic _)*
88 / ”[” _ alue_exp ession _ ”]” (alphanume ic _)*
89 ;
90
91 keyboa d_a gumen s <- ”(” _ ( keyboa d_single_a gumen ( _ a gumen s_sepa a o _
,→keyboa d_single_a gumen )* )? _ ”)”;
92
93 keyboa d_a gumen s_sepa a o <- ',' / ';';
94
95 keyboa d_single_a gumen <- ”$” iden i ie ;
96 // END Keyboa d
97
98 py hon_exp ession <- ”@py” _ ”{” _ py hon_exp ession_body _ ”}”;
99
100 py hon_exp ession_body <- ”[^ }]*”;
101
102 py hon_s a emen <- ”@py hon” py hon_s a emen _body;
103
104 py hon_s a emen _body <- ( ”.*” ” ? n”? )*;
105
106 exp ession <- e music_exp ession;
107
108 music_exp ession <- sequence ( _ ”|” _ sequence )*;
109
110 sequence <- alue_exp ession ( _ alue_exp ession)*;
111
97
APÊNDICE A. GRAMÁTICA PEG
112 g oup <- ”(” _ exp ession _ ”)”;
113
114 block <- ”{” _ body _ ”}”;
115
116 a iable <- ”$” namespaced;
117
118 unc ion <- namespaced ”(” _ unc ion_pa ame e s _ ”)”;
119
120 unc ion_pa ame e s <- named_pa ame e s
121 / posi ional_pa ame e s ( _ pa ame e s_sepa a o _ named_pa ame e s )?
122 / e
123 ;
124
125 posi ional_pa ame e s <- !named_pa ame e exp ession ( _ pa ame e s_sepa a o _ !
,→named_pa ame e exp ession )*;
126
127 named_pa ame e s <- named_pa ame e ( _ pa ame e s_sepa a o _ named_pa ame e )*;
128
129 named_pa ame e <- iden i ie _ '=' _ exp ession;
130
131 pa ame e s_sepa a o <- ',' / ';';
132
133 no e <- no e_pi ch no e_ alue?;
134
135 cho d <- ”[” _ no e_pi ch cho d_su ix _ ”]” no e_ alue?
136 / ”[” ( _ no e_pi ch )+ _ ”]” no e_ alue?
137 ;
138
139 cho d_su ix <- 'm7' / 'M7' / 'dom7' / '7' / 'm7b5' / 'dim7' / 'mM7'
140 / '5'
141 / 'M' / 'm' / 'aug' / 'dim' / '+'
142 ;
143
144 es <- ” ” no e_ alue?;
145
146 no e_ alue
147 <- ”/” _ in ege
148 / in ege _ ”/” _ in ege
149 / in ege
150 ;
151
152 no e_pi ch <- no e_acciden al _ no e_pi ch_ aw;
153
154 no e_acciden al <- ”^” / ”^^” / ”__” / ”_” / ””;
155
98
156 no e_pi ch_ aw <- ”[cde gab]” ”'”*
157 / ”[CDEFGAB]” ”,”*
158 ;
159
160 modi ie
161 <- ”[ T]” _ in ege
162 / ”[ V]” _ in ege
163 / ”[iI]” _ in ege
164 / ”[lL]” _ no e_ alue
165 / ”[sS]” _ in ege _ ”/” _ in ege
166 / ”[sS]” _ in ege
167 / ”[oO]” _ in ege
168 ;
169
170 ins umen _modi ie <- !”::” ”:” ( namespaced / ”?” ) _ sequence;
171
172 alue_exp ession <- e bina y_logic_ope a o _exp ession;
173
174 bina y_logic_ope a o _exp ession <- bina y_compa ison_ope a o _exp ession _ (”and” / ”o ”) _
,→bina y_logic_ope a o _exp ession
175 / bina y_compa ison_ope a o _exp ession
176 ;
177
178 bina y_compa ison_ope a o _exp ession <- bina y_sum_ope a o _exp ession _ (”>=” / ”>” / ”==” /
,→”!=” / ”<=” / ”<” / ”isno ” / ”is” / ”in” / ”no in”) _
,→bina y_compa ison_ope a o _exp ession
179 / bina y_sum_ope a o _exp ession
180 ;
181
182 bina y_sum_ope a o _exp ession <- bina y_mul _ope a o _exp ession _ ”[+ -]” _
,→bina y_sum_ope a o _exp ession
183 / bina y_mul _ope a o _exp ession
184 ;
185
186 bina y_mul _ope a o _exp ession <- una y_ope a o _exp ession _ ”( * *| *| /)” _
,→bina y_mul _ope a o _exp ession
187 / una y_ope a o _exp ession
188 ;
189
190 una y_ope a o _exp ession <- ( ”no ” / ”” ) _ exp ession_single;
191
192 exp ession_single <- exp ession_single_p e ix ( ( _ p ope y_accesso ) / p ope y_call )*;
193
99
APÊNDICE A. GRAMÁTICA PEG
194 exp ession_single_p e ix <- unc ion_decla a ion / s ing_ alue / numbe _ alue / bool_ alue /
,→none_ alue / a iable / unc ion / keyboa d_decla a ion / py hon_exp ession /
,→a ay_ alue / objec _ alue / g oup / block / cho d / no e / es / modi ie /
,→ins umen _modi ie ;
195
196 p ope y_accesso <- ”::” _ ( iden i ie / ( ”[” _ exp ession _ ”]” ) );
197
198 p ope y_call <- ”(” _ unc ion_pa ame e s _ ”)”;
199
200 a ay_ alue <- ”@[” _ ”]”
201 / ”@[” _ exp ession ( _ a ay_sepa a o _ exp ession )* _ ”]”
202 ;
203
204 a ay_sepa a o <- ',' / ';';
205
206 objec _ alue <- ”@{” _ ”}”
207 / ”@{” _ objec _ alue_i em ( _ objec _sepa a o _ objec _ alue_i em )* _ ”}”
208 ;
209
210 objec _ alue_i em <- objec _ alue_key _ '=' _ exp ession;
211
212 objec _ alue_key <- iden i ie / loa / in ege / double_s ing / single_s ing;
213
214 objec _sepa a o <- ',' / ';';
215
216 s ing_ alue <- double_s ing / single_s ing;
217
218 double_s ing <- ” ”” double_s ing_cha * ” ””;
219
220 double_s ing_cha
221 <- ” ””
222 / ” ”
223 / ”[^ ”]”
224 ;
225
226 single_s ing <- ”'” single_s ing_cha * ”'”;
227
228 single_s ing_cha
229 <- ” '”
230 / ” ”
231 / ”[^']”
232 ;
233
234 numbe _ alue <- loa / in ege ;
235
100
236 bool_ alue <- ” ue” / ” alse”;
237
238 none_ alue <- ”none”;
239
240 loa <- ”[0-9]+ .[0-9]+”;
241
242 in ege <- ”[ - +]?[0-9]+”;
243
244 namespaced <- ( iden i ie ” ” )* iden i ie ;
245
246 iden i ie <- ”[a-zA-Z _][a-zA-Z0-9 _]*”;
247
248 alphanume ic <- ”[a-zA-Z0-9 _]*”;
249
250 _ <- ”[ n]*”;
251
252 __ <- ”[ n]+”;
253
254 e <- ””;
255
256 commen <- _ ”#[^ n]*”;
Lis agem A.1: G amá ica PEG da linguagem Musikla
101
Apêndice
B
G amá ica LALR
1s a : [body] [py hon]
2
3?body: s a emen (”;” s a emen )* ”;”?
4
5py hon: ”@py hon” PYTHON_STATEMENTS
6
7?s a emen : oice_assignmen
8|impo
9| o _loop_s a emen
10 | while_loop_s a emen
11 | e u n_s a emen
12 | assignmen
13 | exp ession
14
15 assignmen : exp ession ASSIGNMENT_OP exp ession -> assignmen
16 | exp ession (”,” exp ession)+ ”,”? ASSIGNMENT_OP exp ession -> mul i_assignmen
17
18 oice_assignmen : VOICE_IDENTIFIER ”=” oice_assignmen _body
19
20 oice_assignmen _body: VOICE_CALL exp ession _RPAR -> oice_assignmen _inhe i
21 | exp ession -> oice_assignmen _base
22
23 impo : ”impo ” IDENTIFIER -> impo _global
24 | ”impo ” STRING -> impo _local
25
26 o _ a iables: VARIABLE_NAME ( _a gumen s_sep VARIABLE_NAME )*
27
28 o _loop_head: _FOR _LPAR o _ a iables ”in” exp ession_a om ”..” exp ession_a om _RPAR ->
,→ o _loop_head_ ange
103
APÊNDICE B. GRAMÁTICA LALR
29 | _FOR o _ a iables ”in” exp ession_a om ”..” exp ession_a om ->
,→ o _loop_head_ ange
30 | _FOR _LPAR o _ a iables ”in” exp ession _RPAR -> o _loop_head
31 | _FOR o _ a iables ”in” logic_op_exp -> o _loop_head
32
33 o _loop_s a emen : o _loop_head i _body
34
35 while_loop_s a emen : _WHILE logic_op_exp i _body
36
37 i _s a emen : _IF logic_op_exp i _body _ELSE logic_op_exp -> i _s a emen _else
38 // | _IF logic_op_exp i _body _ELSE i _s a emen -> i _s a emen _else
39 | _IF logic_op_exp i _body -> i _s a emen
40
41 i _body: ” hen”? logic_op_exp
42 // | block
43
44 e u n_s a emen : _RETURN exp ession?
45
46 ?exp ession: sequence_exp
47 | sequence_exp (”|” sequence_exp )+ -> pa allel
48
49 ?sequence_exp : logic_op_exp
50 | logic_op_exp logic_op_exp + -> sequence
51
52 ?logic_op_exp : compa ison_op_exp
53 | logic_op_exp ”and” compa ison_op_exp -> and_logic_op
54 | logic_op_exp ”o ” compa ison_op_exp -> o _logic_op
55
56 ?compa ison_op_exp : sum_op_exp
57 | compa ison_op_exp ”>=” sum_op_exp -> g e_compa ison_op
58 | compa ison_op_exp ”>” sum_op_exp -> g _compa ison_op
59 | compa ison_op_exp _EQ sum_op_exp -> eq_compa ison_op
60 | compa ison_op_exp ”!=” sum_op_exp -> neq_compa ison_op
61 | compa ison_op_exp ”<=” sum_op_exp -> l e_compa ison_op
62 | compa ison_op_exp ”<” sum_op_exp -> l _compa ison_op
63 | compa ison_op_exp _ISNOT sum_op_exp -> isno _compa ison_op
64 | compa ison_op_exp _IS sum_op_exp -> is_compa ison_op
65 | compa ison_op_exp _IN sum_op_exp -> in_compa ison_op
66 | compa ison_op_exp _NOTIN sum_op_exp -> no in_compa ison_op
67
68 ?sum_op_exp : mul _op_exp
69 | sum_op_exp ”+” mul _op_exp -> sum_op
70 | sum_op_exp ”-” mul _op_exp -> sub_op
71
72 ?mul _op_exp : una y_op_exp
104
73 | mul _op_exp ”**” una y_op_exp -> pow_op
74 | mul _op_exp ”*” una y_op_exp -> mul _op
75 | mul _op_exp ”/” una y_op_exp -> di _op
76
77 ?una y_op_exp : exp ession_a om
78 | ”no ” exp ession_a om -> nega ion
79
80 ?exp ession_a om: exp ession_a om ”::” accesso -> accesso
81 | i _s a emen
82 | unc ion_decla a ion
83 | s ing_li e al
84 | numbe _li e al
85 | bool_li e al
86 | none_li e al
87 | a iable
88 | unc ion
89 | keyboa d_decla a ion
90 | py hon_exp ession
91 | a ay_li e al
92 | objec _li e al
93 | g oup
94 | block
95 | cho d
96 | no e
97 | es
98 | modi ie
99 | oice_modi ie
100
101 accesso : FUNCTION_CALL unc ion_call -> me hod_call
102 | IDENTIFIER -> p ope y_accesso
103 | _LSQR exp ession _RSQR -> index_accesso
104 | _LSQR exp ession _INDEX_CALL unc ion_call -> index_call
105
106 py hon_exp ession: ”@py” _LBRAK PYTHON_EXPR _RBRAK
107
108 // Func ion Calls
109 unc ion: FUNCTION_CALL unc ion_call
110
111 unc ion_call: [ unc ion_pa ame e s] _RPAR -> unc ion_call
112 | [ unc ion_pa ame e s] _GROUP_CALL unc ion_call -> unc ion_call_chain
113
114 unc ion_pa ame e s: pa ame e (_pa ame e s_sep pa ame e )*
115
116 ?pa ame e : named_pa ame e | posi ional_pa ame e
117
105