Lezione 18 MIDI e XML Programmazione MIDI (Prof. Luca A. Ludovico)
Compenetrazioni tra MIDI e XML MIDI nasce nei primi anni ‘80, XML alla fine degli anni ’90. Quali compenetrazioni? Applicazioni affrontate nel corso: Midnam Meccanismo per memorizzare e importare patch per dispositivi MIDI esterni MIDI XML di Recordare Descrizione di un file di partitura MIDI in XML Livello Performance di IEEE 1599 Informazioni di performance collegabili a eventi musicali Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Introduzione XML (acronimo di eXtensible Markup Language) è un metalinguaggio di markup, ovvero un linguaggio di marcatura che definisce un meccanismo sintattico per definire altri linguaggi marcatori. Il nome indica quindi che si tratta di un linguaggio marcatore (markup language) estensibile (eXtensible) in quanto permette di creare tag personalizzati. Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
I tag in XML (1) In un documento XML possiamo “inventare” i tag La scelta dei tag può essere effettuata a seconda delle informazioni che interessa rappresentare. <?xml version="1.0"?> <PatchBank Name="User" > <MIDICommands> <ControlChange Control="0" Value="80" /> <ControlChange Control="32" Value="0" /> </MIDICommands> </PatchBank>
I tag in XML (2) I tag si dividono in: Tag di apertura (start tag): <MIDICommands … > Tag di chiusura (end tag): </MIDICommands> Tag vuoti (empty tag): <ControlChange … /> Nell’esempio alla slide precedente: La prima linea del documento (opzionale) identifica lo stesso come un XML ed indica anche la versione Il primo tag <PatchBank> identifica la radice del documento. In linguaggio naturale: “questo documento descrive un banco di patch”. I restanti tag specificano il contenuto tramite una serie di comandi MIDI L’ultimo tag </PatchBank> conclude la descrizione
<nometag>contenuto</nometag> Elementi Un elemento XML è tutto ciò che è compreso tra un tag di apertura (incluso) ed il corrispettivo tag di chiusura (incluso) Tra i due tag si trova il contenuto dell’elemento, che può essere: Simple content: se il contenuto è un semplice testo. Esempio: l’elemento <Model>Yamaha MU-80</Model> Element content: se il contenuto è costituito da altri elementi. Esempio: l’elemento <MIDICommands> Mixed content: se contiene testo inframezzato da altri elementi. Empty content: se il contenuto dell’elemento è vuoto Esempio: l’elemento <ControlChange></ControlChange> Per un elemento vuoto la coppia apertura/chiusura può essere sostituita da un tag vuoto Esempio: <ControlChange /> <nometag>contenuto</nometag> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempio <MIDICommands> <ControlChange Control="0" Value="80" /> <ControlChange Control="32" Value="0" /> … </MIDICommands> Start tag Markup Content End tag Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempio Un elemento può contenere: Altri elementi (detti sotto-elementi) <MIDICommands> <ControlChange Control="0" Value="81" /> <ControlChange Control="32" Value="0" /> </MIDICommands> Testo semplice <Manufacturer>Roland</Manufacturer> Nessun contenuto Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Modello ad albero Gli elementi in XML sono in relazione tra di loro e queste relazioni determinano il modello del documento Il documento è organizzato come un albero, in cui la relazione di contenimento tra elementi è equivalente alla relazione nodo-sottonodo Es: <Author> e <MasterDeviceNames> sono sotto-elementi di <MIDINameDocument> L’entità che non è sottoentità di nessuno (es: <MIDINameDocument>) è l’elemento radice (root element) <?xml version="1.0"?> <MIDINameDocument> <Author>RayGriffin</Author> <MasterDeviceNames> <Manufacturer>Roland</Manufacturer> <Model>JV-2080</Model> </MasterDeviceNames> </MIDINameDocument> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Attributi Gli attributi sono informazioni aggiuntive che possono essere inserite negli elementi XML per completarne o arricchirne l’informazione. Vengono inseriti solo nei tag di apertura (o nei tag vuoti) Sintassi: coppie nome = “valore” Il valore degli attributi è racchiuso o tra apici singoli o tra apici doppi Nome attributo deve essere univoco nell’elemento. <nometag attr1="val1" attr2="val2" ...>...</nometag> <ControlChange Control="0" Value="80" /> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Attributi o elementi? Spesso le stesse informazioni possono essere rappresentate sia tramite attributi che tramite (sotto)elementi. Sottoelementi Attributi <note> <title>Appuntamento</title> <to>Luca</to> <from>Carlo</from> <message>ABC123</message> </note> <note title="Appuntamento"> <note title="Appuntamento" from="Carlo" to="Luca"> ABC123 Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Attributi o elementi? La scelta tra attributi o elementi (quando si progetta il linguaggio) è soggettiva, tuttavia le due soluzioni non sono in genere equivalenti. Problemi con gli attributi: Non possono contenere valori multipli <parent name=“Luca”><child>Marco</child><child>Mario</child></parent> Sono difficilmente espandibili (aggiunta di sottoelementi) Non possono descrivere strutture <book><author><name>..</name><surname>..</surname></author></book> E’ opportuno usare gli attributi per informazioni essenziali per l’elemento, come ad esempio gli identificativi (ID) Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempi <Patch Number="120" Name="Unearthly" ProgramChange="119" /> OK <Patch Number="120" Name="Unearthly" Number="119" /> NO, perché non posso avere più attributi con identico nome nello stesso elemento. <Patch Number="119,120" Name="Unearthly" /> Sintatticamente OK, però è difficile effettuare il parsing dei singoli valori.
Regole sintattiche Tutti i tag aperti devono essere chiusi. I tag devono essere correttamente annidati (innestati, nested) quindi l’ordine di chiusura deve essere inverso rispetto a quello di apertura. Corretto Non corretto <Manufacturer>Roland</Manufacturer> <Model /> <Manufacturer>Roland <Model>JV-2080 Corretto Non corretto <MasterDeviceNames><Model> JV-2080 </Model></MasterDeviceNames> </MasterDeviceNames></Model> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Regole sintattiche Ogni documento XML deve avere uno ed un solo elemento radice. Se la rappresentazione dei dati implica l’uso di più nodi radice, è necessario sostituire il nodo radice scelto con uno di significato più generale. Ad esempio, se è necessario rappresentare tanti elementi <libro>…</libro>, l’elemento radice sarà più propriamente <biblioteca>…</biblioteca> contenitore di sottoelementi <libro>…</libro> Corretto Non corretto <PatchBank Name="Preset B" > <MIDICommands> <ControlChange Control="0" Value="81" /> <ControlChange Control="32" Value="1" /> </MIDICommands> </PatchBank> <PatchBank Name="Preset C" > Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Regole sintattiche I valori degli attributi devono sempre essere inclusi tra apici XML è “case sensitive”, cioè sensibile a maiuscole/minuscole In XML gli spazi vengono preservati I commenti possono essere inseriti tra i segni <!-- e --> Corretto Non corretto <PatchBank Name="Preset C"> <PatchBank Name='Preset C'> <PatchBank Name=Preset C> Corretto Non corretto <Model>JV-2080</Model> <model>JV-2080</Model> <MODEL>JV-2080</Model> <!-- Questo è un commento XML --> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esercitazione Sezione 16.1 Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Editing di XML con XML Copy Editor Editor XML Editing di XML con XML Copy Editor Software scaricabile da http://xml-copy-editor.sourceforge.net/ Ausili grafici (e non) per la generazione di sintassi XML ben formata Autocompletamento Colorazione dei tag Indentazione e pretty-print Verifica di Well-formedness, o correttezza della forma (e di Validity: vedi prossima lezione) Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempi di errori XML <MIDIMessages> <MIDIMessage>NoteOn <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage> </MIDIMessages> <MIDIMessage>Control Change</MIDIMessage></MIDIMessage> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempi di errori XML <MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage> </MIDIMessages> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempi di errori XML <MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage> </midimessages> <MIDI Messages> <MIDI Message>NoteOn</MIDI Message> <MIDI Message>NoteOff</MIDI Message> <MIDI Message>Control Change</MIDI Message> </MIDI Messages> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempi di errori XML <MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>ControlChange</MIDIMessage> </midimessages> <MIDIMessage channel='1'>NoteOn</MIDIMessage> <MIDIMessage channel="1">NoteOff</MIDIMessage> <MIDIMessage channel=1>ControlChange</MIDIMessage> <MIDIMessage>ControlChange</MIDIMessage channel="1"> </MIDIMessages > Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Esempio Obiettivo: rappresentare sequenze di messaggi MIDI non temporizzati Informazioni da codificare: Solo messaggi NoteOn e NoteOff, con relativo canale, pitch e velocity A titolo di esempio, si presenti un NoteOn e un NoteOff di un pitch 60 (C5) con velocity 100 In questo contesto, non avendo vincoli imposti sul formato da adottare, esistono numerose varianti, tutte ugualmente accettabili Utilizzo di soli elementi Utilizzo di elementi vuoti e attributi ... Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Rappresentazione alternativa 1 <messaggi_MIDI> <channel1> <note_on> <pitch>60</pitch> <velocity>100</velocity> </note_on> <note_off> </note_off> </channel1> <channel2> ... </channel2> ... </messaggi_MIDI> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Rappresentazione alternativa 2 <messaggi_MIDI> <channel num="1"> <noteOn pitch="60" velocity="100" /> <noteOff pitch="60" velocity="100" /> ... </channel> <channel num="2"> ... </channel> </messaggi_MIDI> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Rappresentazione alternativa 3 <MIDIMessages> <MIDIMessage> <StatusByte>NoteOn ch. 1</StatusByte> <FirstDataByte>Pitch C5</FirstDataByte> <SecondDataByte>Velocity 100</SecondDataByte> </MIDIMessage> <StatusByte>NoteOff ch. 1</StatusByte> </MIDIMessages> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML
Rappresentazioni alternative 5 e 6 <MIDIMessages> <MIDIMessage StatusByte="NoteOn" Channel="1" Pitch="C5" Velocity="100" /> <MIDIMessage StatusByte="NoteOff" Channel="1" Pitch="C5" Velocity="100" /> </MIDIMessages> <MIDIMessage> <StatusByte>10010000</StatusByte> <FirstDataByte>00000010</FirstDataByte> <SecondDataByte>00110101</SecondDataByte> </MIDIMessage> <StatusByte>10000000</StatusByte> Programmazione MIDI (Prof. Luca A. Ludovico) Lezione 18. MIDI e XML