MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)
-
Upload
flavio-grimaldi -
Category
Documents
-
view
233 -
download
1
Transcript of MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)
MIDI e XML
Lezione 18
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:1. Midnam
Meccanismo per memorizzare e importare patch per dispositivi MIDI esterni
2. MIDI XML di RecordareDescrizione di un file di partitura MIDI in XML
3. Livello Performance di IEEE 1599Informazioni 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
• 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 vuotoEsempio: <ControlChange />
<nometag>contenuto</nometag>
Elementi
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDICommands>
<ControlChange Control="0" Value="80" />
<ControlChange Control="32" Value="0" />
…
</MIDICommands>
Esempio
Markup
End tag
Content
Start 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
<ControlChange Control="0" Value="81" />
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
• 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
Modello ad albero
• 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.
Attributi
<nometag attr1="val1" attr2="val2" ...>...</nometag>
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<ControlChange Control="0" Value="80" />
• 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">
<to>Luca</to>
<from>Carlo</from>
<message>ABC123</message>
</note>
<note title="Appuntamento"
from="Carlo" to="Luca">
ABC123
</note>
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
Attributi o elementi?
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.
• 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>
JV-2080
</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 B" >
<MIDICommands>
<ControlChange Control="0" Value="81" />
<ControlChange Control="32" Value="1" />
</MIDICommands>
</PatchBank>
<PatchBank Name="Preset C" >
<MIDICommands>
<ControlChange Control="0" Value="81" />
<ControlChange Control="32" Value="1" />
</MIDICommands>
</PatchBank>
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>
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
Regole sintattiche
<!-- Questo è un commento XML -->
ESERCITAZIONESezione 16.1
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
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
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDIMessages> <MIDIMessage>NoteOn <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage></MIDIMessages>
<MIDIMessages> <MIDIMessage>NoteOn <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control
Change</MIDIMessage></MIDIMessage></MIDIMessages>
Esempi di errori XML
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage></MIDIMessages><MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>Control Change</MIDIMessage></MIDIMessages>
Esempi di errori XML
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e 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>
Esempi di errori XML
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDIMessages> <MIDIMessage>NoteOn</MIDIMessage> <MIDIMessage>NoteOff</MIDIMessage> <MIDIMessage>ControlChange</MIDIMessage></midimessages>
<MIDIMessages> <MIDIMessage channel='1'>NoteOn</MIDIMessage> <MIDIMessage channel="1">NoteOff</MIDIMessage> <MIDIMessage channel=1>ControlChange</MIDIMessage> <MIDIMessage>ControlChange</MIDIMessage channel="1"></MIDIMessages >
Esempio
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
• 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– ...
Rappresentazione alternativa 1
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<messaggi_MIDI> <channel1> <note_on> <pitch>60</pitch> <velocity>100</velocity> </note_on> <note_off> <pitch>60</pitch> <velocity>100</velocity> </note_off> </channel1> <channel2> ... </channel2> ...</messaggi_MIDI>
Rappresentazione alternativa 2
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<messaggi_MIDI> <channel num="1"> <noteOn pitch="60" velocity="100" /> <noteOff pitch="60" velocity="100" /> ... </channel> <channel num="2"> ... </channel> ...</messaggi_MIDI>
Rappresentazione alternativa 3
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDIMessages> <MIDIMessage> <StatusByte>NoteOn ch. 1</StatusByte> <FirstDataByte>Pitch C5</FirstDataByte> <SecondDataByte>Velocity 100</SecondDataByte> </MIDIMessage> <MIDIMessage> <StatusByte>NoteOff ch. 1</StatusByte> <FirstDataByte>Pitch C5</FirstDataByte> <SecondDataByte>Velocity 100</SecondDataByte> </MIDIMessage></MIDIMessages>
Rappresentazioni alternative 5 e 6
Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML
<MIDIMessages> <MIDIMessage StatusByte="NoteOn" Channel="1" Pitch="C5" Velocity="100" /> <MIDIMessage StatusByte="NoteOff" Channel="1" Pitch="C5" Velocity="100" /></MIDIMessages>
<MIDIMessages> <MIDIMessage> <StatusByte>10010000</StatusByte> <FirstDataByte>00000010</FirstDataByte> <SecondDataByte>00110101</SecondDataByte> </MIDIMessage> <MIDIMessage> <StatusByte>10000000</StatusByte> <FirstDataByte>00000010</FirstDataByte> <SecondDataByte>00110101</SecondDataByte> </MIDIMessage></MIDIMessages>