290 likes | 418 Vues
Università degli studi di Bologna Facoltà di ingegneria. GrooveSlang. Un linguaggio per la creazione e riproduzione di pattern musicali. Progetto per l’esame di Linguaggi e modelli computazionali L-S. Studente: Altobelli Andrea. Docente: Enrico Denti. Anno Accademico 2012/2013. Scenario.
E N D
Università degli studi di Bologna Facoltà di ingegneria GrooveSlang Un linguaggio per la creazione e riproduzione di pattern musicali Progetto per l’esame di Linguaggi e modelli computazionali L-S Studente: Altobelli Andrea Docente: Enrico Denti Anno Accademico 2012/2013
Scenario • Digital Audio Workstation • Hw o Sw • Editing, riproduzione e recording di audio digitale • Standard MIDI • Eventmessages • Strumenti software • Controllers Linguaggi e modelli computazionali LS - A.A. 2012/2013
Obiettivi • Sviluppare un linguaggio che permetta • La creazione e la manipolazione di pattern musicali in modo facile ed intuitivo • L’associazione dei pattern agli strumenti software MIDI destinati a riprodurli • Il controllo dei parametri MIDI associati al brano e agli strumenti software Linguaggi e modelli computazionali LS - A.A. 2012/2013
Esempio.gsl track myTrack; meter 4/4; tempo 140; instrument GUITAR { volume = 16000; portamento = 127; } myGuitar; instrument ACOUSTIC_BASS bass; pattern patt1 = "E5q F5q G5h"; pattern patt2 = ( "A3o C" + patt1 ) * 2 + patt1 * 5; pattern patt3 =patt2; play patt3 with guitar1; play patt2 with bass; • Intestazione: • Nome traccia • Metrica • Tempo • Definizione strumento sw: • Tipo di strumento • Parametri (opzionali) • Identificativo Definizione pattern tramite espressioni.. Associazione dei pattern agli strumenti definiti Linguaggi e modelli computazionali LS - A.A. 2012/2013
Esempio.gsl • Come stringa di note: • "A3" = "La" 3° ottava • "o" = durata 1/64 Valore di un pattern precedentemente definito track myTrack; meter 4/4; tempo 140; instrument GUITAR { volume = 16000; portamento = 127; } myGuitar; instrument ACOUSTIC_BASS bass; pattern patt1 = "E5q F5q G5h"; pattern patt2 = ( "A3o C" + patt1 ) * 2 + patt1 * 5; pattern patt3 =patt2; play patt3 with guitar1; play patt2 with bass; pattern patt2 = ( "A3o C" + patt1 ) * 2 + patt1 * 5; • Ripetizione pattern "n" volte • Prioritario rispetto alla concatenazione Concatenazione tra pattern Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: skip SKIP : { " " | "\r" | "\t" | "\n" | "\r\n" | <"/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/"> } Ovvero spazi, new line, tabulazioni, e commenti multilinea Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (1) TOKEN : { < TRACK : "track" > | < METER : "meter" > | < TEMPO : "tempo"> | < INSTRUMENT : "instrument" > | < PATTERN : "pattern"> | < PLAY : "play"> | < WITH : "with"> | < PLUS : "+" > | < STAR : "*" > | < ASSIGN : "=" > | < SLASH : "/" > | < SEMICOLON : ";" > | < LBRACE : "{" > | < RBRACE : "}" > | < DQUOTES : "\"" > | < LPAREN : "(" > | < RPAREN : ")" > } Fin qui niente di particolare.. Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (2) La grammatica dei pattern: "A3o G#4 BbqRx" Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (2) La grammatica dei pattern: "A3o G#4 BbqRx" Una nota, eventualmente in diesis o bemolle, oppure una pausa ovvero ( ["A"-"F"] ("#" | "b")? ) | "R" Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (2) La grammatica dei pattern: "A3o G#4BbqRx" L’ottava di riferimento della nota, con valore di default pari a 5 ovvero [ "0" – "9" ]? Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (2) La grammatica dei pattern: "A3o G#4 BbqRx" La durata della nota/pausa (1, ½, ¼, .. 1/64 della battuta), con valore di default pari a q ovvero ("w"| "h"| "q"| "i"| "s"| "t"| "x"| "o")? Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (3) Dal punto di vista semantico sarebbe comodo definire i token separatamente: TOKEN : { < NOTE: ( ["A"-"F"] ("#" | "b")? ) | "R"> | < OCTAVE : [ "0" – "9" ] > | < DURATION: ("w"| "h"| "q"| "i"| "s"| "t"| "x"| "o")> } E predisporre una opportuna produzione a livello di parser: PatternString::= <DQUOTES> ( PatternNote )* <DQUOTES> PatternNote::= <NOTE> <OCTAVE> <DURATION> Con il vantaggio di ottenere le 3 componenti separate in fase di valutazione MA.. Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (4) Nel nostro linguaggio però è necessario definire anche gli identificatori: TOKEN : { < NOTE: (["A"-"F"]("#" | "b")?) | "R" > | < OCTAVE : ["0"–"9"] > | < DURATION: ("w"|"h"|"q"|"i"|"s"|"t"|"x"|"o") > |< IDENTIFIER : <LETTER> ( <LETTER> | ["0"-"9"] )* > | < #LETTER : ["a"-"z", "A"-"Z", "_"] > } CONFLITTO tra i tokenmonolettera e gli identificatori Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (5) Possibili soluzioni: • Definire gli identificatori a livello di parser ->Grammatica complicata • Prevedere un prefisso per gli identificatori (es: “_”) -> Sintassi fastidiosa • Definire unico token per le note come stringa esatta -> Necessaria successiva scomposizione “a mano”, ma possiamo mantenere grammatica semplice e sintassi invariata CONFLITTO tra i tokenmonolettera e gli identificatori String.split(regex) Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: token (6) Dunque: TOKEN : { < NOTE_LITERAL : (["A"-"G"] (["#", "b"])? | "R") (["0"-"9"])?("w" | "h" | "q" | "i" | "s" | "t" | "x" | "o")? > |< IDENTIFIER : <LETTER> ( <LETTER> | ["0"-"9"] )* > | < #LETTER : ["a"-"z", "A"-"Z", "_"] > | < INTEGER : ["1"-"9"] ( ["0"-"9"] )* > } NB: c’è ancora conflittonel caso in cui identificatore segue sintassi <NOTE_LITERAL> (es: A3o, Fx, R…) -> alcuni identificatori vietati Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: produzioni (1) Scope::= HeadBody< EOF > Head::= Track( Meter)?( Tempo )? Track::= <TRACK> <IDENTIFIER> <SEMICOLON> Meter::= <METER> <INTEGER> <SLASH> <INTEGER> <SEMICOLON> } Tempo ::= <TEMPO> <INTEGER> <SEMICOLON> Body ::= InstrumentSectionPatternSectionPatternAssignSection track myTrack; meter 4/4; tempo 140; Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: produzioni (2) InstrumentSection ::= ( InstrumentDecl)+ InstrumentDecl::= <INSTRUMENT> InstrumentType( <LBRACE>( ParameterAssign)+ <RBRACE> )?InstrumentId<SEMICOLON> InstrumentType ::= <IDENTIFIER> ParameterAssign::= ParameterId <ASSIGN> ParameterValue<SEMICOLON> ParameterId ::=<IDENTIFIER> ParameterValue ::= <INTEGER> InstrumentId ::= <IDENTIFIER> instrument GUITAR { volume = 16000; portamento = 127; }myGuitar; Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: pattern expressions Dalla sintassi astratta: PatternDecl::= <PATTERN> PatternId<ASSIGN> ConcatExp <SEMICOLON> PatternId::= <IDENTIFIER> PatternExp::= PatternExp <PLUS>PatternExp PatternExp::= PatternExp <STAR> <INTEGER> PatternExp::= PatternString | PatternIdValue PatternIdValue::= <IDENTIFIER> PatternString::= <DQUOTES> ( PatternNote() )+ <DQUOTES> PatternNote::= <NOTE_LITERAL> • Ricorsioni sinistre • Non specifica priorità Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: pattern expressions A quella concreta: PatternSection::= ( PatternDecl)+ PatternDecl::= <PATTERN> PatternId<ASSIGN> ConcatExp <SEMICOLON> PatternId::= <IDENTIFIER> ConcatExp::= RepeatExp ( <PLUS> RepeatExp )* RepeatExp::= SingleExp() ( <STAR> <INTEGER> )? SingleExp::= PatternString| PatternIdValue| <LPAREN> ConcatExp<RPAREN> PatternIdValue ::= <IDENTIFIER> PatternString ::= <DQUOTES> ( PatternNote() )+ <DQUOTES> PatternNote ::= <NOTE_LITERAL> pattern patt2 = ( "A3o C"+patt1 ) * 2 + patt1* 5; Linguaggi e modelli computazionali LS - A.A. 2012/2013
La grammatica: produzioni (3) PatternAssignSection::= ( PatternAssign)+ PatternAssign: <PLAY> PatternId<WITH> InstrumentId<SEMICOLON> playpatt3withguitar1; Linguaggi e modelli computazionali LS - A.A. 2012/2013
Classificazione grammatica • Grammatica di tipo 2 (produzioni A ::= α) • Tutte le produzioni generano un linguaggio di tipo 3, eccetto: ConcatExp::= RepeatExp ( <PLUS> RepeatExp )* RepeatExp::= SingleExp() ( <STAR> <INTEGER> )? SingleExp::= PatternString | PatternIdValue| <LPAREN> ConcatExp <RPAREN> Self Embedding • Il linguaggio generato quindi è di tipo 2 • Il calcolo dei DirectorSymbols dà luogo a insiemi disgiunti -> grammaticaLL(1) Linguaggi e modelli computazionali LS - A.A. 2012/2013
Strumenti • Linguaggio: Java 1.6.0_31 • Ultima rilasciata per Mac OS X • Ambiente di sviluppo: Eclipse IDE 3.6 • Parser e scanner: JavaCC 5.0 • Albero sintattico e visitor: JTB 1.4.6 • Documentazione: JJDOC • Libreria musicale: JFugue 4.0.3 • Testing: JUnit 4.8.1 Linguaggi e modelli computazionali LS - A.A. 2012/2013
Architettura del sistema (1) Generate da JavaCC/JTB … Check Semantico Albero astratto Riproduzione traccia/pattern Rappresentazione tabellare pattern Linguaggi e modelli computazionali LS - A.A. 2012/2013
Check semantico • Metrica valida (4/4, ¾, 2/4, 3/8, 6/8, …) • Tempo > 0 • Tipo di strumento, nomi parametri e valori validi • standard MIDI • Identificatori strumenti e pattern • definiti un’unica volta • usati solo dopo essere stati definiti • Note all’interno di stringhe devono essere valide • Es: Mi# non esiste Linguaggi e modelli computazionali LS - A.A. 2012/2013
Architettura del sistema (2) Pattern MVC Controller coordina i visitor Costanti musicali Splittingtoken <NOTE_LITERAL> Rappresentazione tabellare pattern Linguaggi e modelli computazionali LS - A.A. 2012/2013
GrooveSlangFrame: screenshot Linguaggi e modelli computazionali LS - A.A. 2012/2013
GrooveSlangFrame: screenshot Editor AST Log Staff Table Linguaggi e modelli computazionali LS - A.A. 2012/2013
Conclusioni • Il linguaggio progettato permette di comporre brani in modo semplice e intuitivo Sviluppi futuri • Estendere il linguaggio dei pattern con strutture musicali più complesse (es. accordi) • Permettere l’editing dei pattern a livello grafico tramite staff table • Nuovi operatori sui pattern (es: shift sulla scala musicale) Linguaggi e modelli computazionali LS - A.A. 2012/2013
Demo Linguaggi e modelli computazionali LS - A.A. 2012/2013