tablabla università degli studi di bologna – ingegneria informatica specialistica anno accademico...
TRANSCRIPT
Tablabla Tablabla
Università degli Studi di Bologna – Ingegneria Informatica SpecialisticaAnno Accademico 2007/2008
Progetto di Valent CristinaValent Cristina
Corso di
“Linguaggi e Modelli Computazionali LS”
Prof. Enrico Denti
Agenda
• Obiettivo• Tablature: per saperne di più• Grammatica: realizzazione ed analisi• Esempi di frasi• Progetto: implementazione • Sviluppi futuri
Obiettivo
Il progetto si propone di realizzare un linguaggio per la
generazione automatica di tablature per chitarra classica a:• 19 tasti• 6 corde• accordatura standard.
Tablature: Tablature:
per saperne di piùper saperne di più
Tablature: spiegazione
Sono un metodo per scrivere partiture di chitarra e basso
usando una notazione in codice ASCII.
Ciò consente di facilitare:
• la lettura e scrittura di partiture da parte di musicisti meno esperti
• lo scambio di partiture via internet
Tablature: rappresentazione
La tablatura presenta 6 righe.
Ciascuna riga:• realizza graficamente una diversa corda della chitarra
• inizia con un carattere alfabetico che indica l’accordatura della corda a cui la riga è associata.
L’accordatura standard è:• e per I corda (mi cantino)• B per II corda (si)• G per III corda (sol)• D per IV corda (re)• A per V corda (la)• E per VI corda (mi grave)
Solitamente le accordature riportano i nomi delle note in inglese
Tablature: rappresentazione
In ogni istante una corda può:• non essere suonata• essere suonata
La riga associata a ciascuna corda riporterà:• il simbolo “-” nel caso di corda non suonata• il numero del tasto da premere nel caso di corda suonata
(i numeri vanno da 0 a 19 dove 0 significa corda suonata a vuoto)
Più corde suonate contemporaneamente costituiscono un accordo.
Tablature: esempio
e-----------0-------------------------------
B---3---------------------------1-----------
G-------------------------------------------
D-------------------------------2-----------
A-------------------------------3-----------
E-------------------------------------------
Significa suonare II corda terzo tasto
Rappresenta l’accordatura (standard)
Accordo (in questo caso è un DO)
Significa suonare I corda a vuoto
Significa non suonare la corda
Tablature: tecniche (1)
E’ possibile inoltre indicare delle tecniche esecutive:
• hammer on (passaggio da nota grave a nota acuta)Si pizzica la prima nota e con movimento rapidoe deciso si preme la nota successiva
• pull off (passaggio da nota acuta a nota grave)Si pizzica la prima nota, si trascina la corda (tipo bending) la si rilascia facendola vibrare e si suona così la seconda nota
• bending (aumento dell’altezza della nota)Si pizzica la prima nota normalmente, si spinge la corda verso l’alto per alzarla di un numero di toni pari alla differenza con la seconda nota riportata
Tablature: tecniche (2)
• release (diminuzione dell’altezza della nota)Si tiene la corda in tensione (tramite bendind) e successivamentela si rilascia gradualmente riportando la nota nella posizionedi quiete
• slide up (slittamento da nota grave a nota acuta)Si pizzica la prima nota, si slitta lungo la tastiera verso il corpo della chitarra
• slide down (slittamento da nota acuta a nota grave)Si pizzica la prima nota, si slitta lungo la tastiera verso la palettadella chitarra
Tablature: tecniche (3)
• vibrate (diminuzione dell’altezza della nota)Sono piccoli spostamenti della corda rispetto al tasto (si sfrutta il principio del bending)
• palm mute (blocco della vibrazione della corda)Si appoggia il palmo della mano a ridosso del ponte in modo
da sfiorarne le corde
• stopped (smorzamento del suono)Si allenta la presa delle dita che agiscono sulla tastieradurante l'esecuzione del brano
Grammatica:Grammatica:
realizzazione ed analisirealizzazione ed analisi
Grammatica (1)
<Scopo> ::= (<GruppoNote> ; <Durata> . )+<GruppoNote> ::= <NotaCorda> , <NotaCorda> , <NotaCorda>,
<NotaCorda> , <NotaCorda> , <NotaCorda> <NotaCorda> :: = <SPECIAL_SYMBOL> |
(<UNARY_SYMBOL>)? <Tasto> ( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto>
)*<Tasto> ::= 0 | <CIFRA_TASTO> | 1(<Cifra>)?<Cifra> ::= 0 | <CifraNonNulla><CifraNonNulla> ::= 1 | <CIFRA_TASTO><Durata> ::= 0 | <CifraNonNulla>(<Cifra>)*
Grammatica (1)
<Scopo> ::= (<GruppoNote> ; <Durata> . )+<GruppoNote> ::= <NotaCorda> , <NotaCorda> , <NotaCorda>,
<NotaCorda> , <NotaCorda> , <NotaCorda> <NotaCorda> :: = <SPECIAL_SYMBOL> |
(<UNARY_SYMBOL>)? <Tasto> ( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto>
)*<Tasto> ::= 0 | <CIFRA_TASTO> | 1(<Cifra>)?<Cifra> ::= 0 | <CifraNonNulla><CifraNonNulla> ::= 1 | <CIFRA_TASTO><Durata> ::= 0 | <CifraNonNulla>(<Cifra>)*
I corda
VI corda
Notazione posizionaleNum. Corda = Posizione Durata qualitativa della
configurazione di GruppoNote
Grammatica (2)
<SPECIAL_SYMBOL> ::= x | -
<UNARY_SYMBOL> ::= v | m
<BINARY_SYMBOL> ::= h | p | b | r | u | d
<CIFRA_TASTO> ::= [ 2 – 9 ]
stopped corda non suonata
vibrate palm mute
slide down
pull off
bending
release
hammer on slide up
Tipologia grammatica
Le regole di produzione hanno la forma
A → βdove A є VN e β є V+
Secondo la classificazione di Chomsky la grammatica risulta essere di tipo 2 (context - free).
Tipologia linguaggio
La grammatica non presenta self-embedding, ovvero non prevede simboli non terminali autoinclusivi del tipo:
A → β A δdove A є VN e δ,β є V+
il linguaggio generato è di tipo 3 (linguaggio regolare)
*
Significa
ε - rules
La grammatica è priva di ε – rules.Non presenta nemmeno la regola di produzione
S → εdove S rappresenti lo scopo della grammatica.
Il linguaggio quindi non prevede l’uso della stringa vuota, anche perché una tablatura vuota non avrebbe alcun senso.
Analisi grammatica
In sintesi il linguaggio è:• context-free• privo di ε – rulesSi può verificare se è analizzabile in maniera deterministica dalle tecniche LL, auspicando che nel caso possa essere LL(1).
Visto che la grammatica non genera la stringa vuota, condizione necessaria e sufficiente perché una grammatica sia LL(1) è che per ogni metasimbolo, che appare alla sinistra di più produzioni, gli starter symbol corrispondenti alle parti destre delle produzioni alternative siano disgiunti.
Starter Symbols
Sapendo che <CIFRA_TASTO> :: = [2 - 9]
<Tasto> ::= 0 | <CIFRA_TASTO> | 1(<Cifra>)?SS(0) = {0}SS(<CIFRA_TASTO>) = {2..9}SS(1(<Cifra>)?) = {1}
<CifraNonNulla> ::= 1 | <CIFRA_TASTO>SS(1) = {1}SS(<CIFRA_TASTO>) = {2..9}
<Cifra> ::= 0 | <CifraNonNulla>SS(0) = {0}SS(<CifraNonNulla>) = {1..9}
<Durata> ::= 0 | <CifraNonNulla>(<Cifra>)*SS(0) = {0}SS(<CifraNonNulla>(<Cifra>)*) = {1..9}
DISGIUNTI!
DISGIUNTI!
DISGIUNTI!
DISGIUNTI!
Starter Symbols
Sapendo che:
<SPECIAL_SYMBOL> ::= x | -
<UNARY_SYMBOL> ::= v | m
<NotaCorda> :: = <SPECIAL_SYMBOL> |
(<UNARY_SYMBOL>)? <Tasto>
( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto>)*
SS(<SPECIAL_SYMBOL>) = {x, -}
SS((<UNARY_SYMBOL>)? <Tasto> ( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto> )* ) = {v,m,0..9}
DISGIUNTI!
Starter Symbols
Sapendo che:
<SPECIAL_SYMBOL> ::= x | -
<UNARY_SYMBOL> ::= v | m
<NotaCorda> :: = <SPECIAL_SYMBOL> |
(<UNARY_SYMBOL>)? <Tasto>
( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto>)*
SS(<SPECIAL_SYMBOL>) = {x, -}
SS((<UNARY_SYMBOL>)? <Tasto> ( <BINARY_SYMBOL> (<UNARY_SYMBOL>)? <Tasto> )* ) = {v,m,0..9}
DISGIUNTI!
La grammaticaè LL(1)
Esempi Esempi
di frasidi frasi
Esempi di comandi
Esempio:
-,5,-,-,-,-;3.
-,-,-,1h2pv1,-,-;4.
-,3u5,-,-,-,-;2.
-,a4,-,-,-,-;3.
-,-,-,-,3h,-;3.
Esempio di sequenza di tecniche
Errore lessicale!“a” non appartiene al linguaggio
Errore sintattico!Dopo “h” deve esserci un numero o un simbolo unario {v,m} seguito da un numero
Errori semantici
Esempi:
-,2h1,-,-,-,-;3.
-,2b1,-,-,-,-;3.
-,2u1,-,-,-,-;3.
-,1p2,-,-,-,-;3.
-,1r2,-,-,-,-;3.
-,1d2,-,-,-,-;3.
-,v0,-,-,-,-;3.
Tasto 1 {h,b,u} Tasto2Tasto1 < Tasto2
Tasto 1 {p,r,d} Tasto2Tasto1 > Tasto2
v TastoTasto > 0
Progetto:Progetto:
implementazioneimplementazione
Tablabla
Il sistema accetta le frasi del linguaggio e genera lerelative tablature, effettuando un controllo semantico relativo alle note in funzione delle tecniche esecutive.
Si compone dei seguenti package:• gui. Contenente tutte le classi per generare l’interfaccia
grafica• syntaxtree. Contenente le classi per l’APT• parser. Contenente le classi per scanner e parser• visitor. Contenente le classi per il visitor
Pattern Visitor
Per coniugare i vantaggi del metodo funzionale con quelli del modello object-oriented, per l’implementazione del è stato utilizzato il pattern di progetto che va sotto il nome di Visitor.
E’ il visitor che si occupa di realizzare l’analisi semantica, per mantenere una separazione da quella sintattica realizzata dal parser.
Essendo presente solo una interpretazione esiste un solo Visitor chiamato TabVisitor all’interno del progetto.
Inserimentocomandi
Lexer Parser
APTVisitor Visita
Produce
la tablatura
Funzionamento
Lexer e Parser
Il lexer:• è generato dal parser e si trova nella classe TabParserTokenManager
• effettua il controllo lessicale della frase inserita.
Il parser effettua:• il controllo sulla sintassi delle frasi inserite• la creazione dell’albero sintattico.Si trova all’interno della classe TabParser.Viene generato una sola volta e poi reinizializzato(parser.ReInit(new StringReader(areaCommand.getText());
TabVisitor
Il TabVisitor in sostanza esegue i seguenti passi:
1. visita l’albero generato dal parser
2. effettua i controlli semantici relativi alle note in funzione delle tecniche esecutive
3. produce le tablature che verranno poi visualizzate nell’interfaccia utente e che potranno poi essere salvate su file
Strumenti utilizzati
Il progetto è stato realizzato in java (versione 1.6).
Gli strumenti usati sono:• JavaCC per la generazione automatica del parser• JTB per la costruzione automatica dell’albero sintattico e
i relativi Visitor di base
Il tutto è stato implementato usando come tool di sviluppo Eclipse 3.0.
ConclusioniConclusioni
Sviluppi futuri
Il progetto riesce già a realizzare tablature di qualità, ma si
potrebbe arricchirlo con altre funzionalità come:
• la possibilità di indicare graficamente gli armonici (spesso indicati fuori tablatura) siano essi:
– naturali
– artificiali
• la possibilità di indicare accordature differenti da quella standard