scieee Open visual document viewer

Musikla: music and keyboard language

Silva, Pedro Miguel Oliveira da

Abstract

Nesta dissertação iremos estudar uma abordagem para a análise, criação e descrição de música através de uma Domain Specific Language (DSL). Trata-se de uma linguagem dinâmica, com todas as funcionalidades a que estamos habituados, tais como variáveis, funções, ciclos, condicionais. Para além disso, os dois fatores de diferenciação passam pela sintaxes especializadas para declaração de acom panhamentos musicais e de teclados virtuais. Esta linguagem deve depois poder ser avaliada e os seus resultados convertidos para diversos formatos, desde ficheiros de som, MIDI, ou reproduzir diretamente as notas para as colunas do computador. Com este intuito vamos analisar as linguagens já existentes neste espaço, bem como quais as funci onalidades que já implementam, e aquelas que consideramos estarem em falta. Como esses aspetos em mente, de seguida propomos uma linguagem que tente aproveitar as boas ideias daquilo que já existe, mais as nossas soluções para os novos desafios que encontramos. Introdu zimos também vários casos de estudo para demonstrarem as vantagens que acreditamos existirem na nossa abordagem. Finalmente descrevemos também o processo de desenvolvimento da linguagem, dividido em três fases principais: 1. O desenho da sintaxe, da sua gramática, e do parser. 2. A implementação do interpretador. 3. O desenvolvimento de uma biblioteca standard para ser incluída com a linguagem. A nível da sintaxe e da gramática, descrevemos sucintamente toda a linguagem. Damos particular atenção às expressões de declarações de acompanhamentos musicais e de teclados. Em termos grama ticais, são apenas expressões, ou seja, as suas sintaxes devem integrar-se homogeneamente no resto da linguagem. E como tal, podemos utilizá-las em qualquer sítio que onde podemos introduzir uma expressão, seja ela um número, uma string ou o que quer que for. Esta integração sem separação significa que todos os aspetos da linguagem têm de ser pensados de forma a coexistir sem problemas. Iremos por isso analisar quais os desafios encontrados pela introdução destas novas classes de expressões na gramática, e quais as soluções que foram tomadas para contornar essas situações. A nível do interpretador, discutimos várias das opções que poderiam ser escolhidas (interpretadores tree walk, máquinas bytecode, compilação JIT) bem como justificamos a nossa escolha de utilizar um interpretador tree-walk. A nível da biblioteca standard, descrevemos os vários formatos suportados, quer de input, quer de output, bem como os mecanismos providenciados para a utilização de teclados, como grelhas e buffers. No final, descrevemos como correr scripts escritos na nossa linguagem: através de uma aplicação de linha de comandos desenvolvida em Python, chamada musikla, publicada no Python Package Index (PyPI) 1, e cujo código é disponibilizado livremente no GitHub2.

Full text

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