MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

27
MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

Transcript of MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

Page 1: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

MIDI e XML

Lezione 18

Programmazione MIDI (Prof. Luca A. Ludovico)

Page 2: 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

Page 3: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 4: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 5: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 6: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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

Page 7: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

<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

Page 8: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 9: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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

Page 10: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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" />

Page 11: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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?

Page 12: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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?

Page 13: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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.

Page 14: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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

Page 15: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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

Page 16: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

• 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 -->

Page 17: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

ESERCITAZIONESezione 16.1

Programmazione MIDI (Prof. Luca A. Ludovico)Lezione 18. MIDI e XML

Page 18: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 19: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 20: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 21: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 22: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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 >

Page 23: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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– ...

Page 24: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 25: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 26: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>

Page 27: MIDI e XML Lezione 18 Programmazione MIDI (Prof. Luca A. Ludovico)

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>