Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

20
Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Transcript of Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Page 1: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Dati MIDI in Java

Lezione 22

Programmazione MIDI (Prof. Luca A. Ludovico)

Page 2: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Introduzione

• Obiettivi conseguiti:– Ripasso/acquisizione delle basi sintattiche di Java– Rudimenti della programmazione a oggetti– Esempi orientati al MIDI (senza usare e usando il package

javax.sound.midi)

• Nuovo obiettivo: comprendere la logica di descrizione di dati e dispositivi MIDI da parte del package

• Un tutorial completo si trova nella documentazione ufficiale in lingua inglese:http://docs.oracle.com/javase/tutorial/sound/overview-MIDI.html

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 3: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

VECTORStrutture dati dinamiche

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 4: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Strutture dati dinamiche

• I tipi primitivi (int, char, …) e i tipi strutturati (array) visti finora hanno dimensioni predefinite

• Nel caso degli array, nella dichiarazione è necessario:– stabilire il tipo base per gli elementi del vettore– stabilire il numero di elementi complessivi

Una volta fissati questi aspetti, non possono più essere modificati

Esistono invece strutture dati dinamiche, le cui dimensioni possono variare «dinamicamente» a seconda delle esigenze

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 5: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

La classe public class Vector<E>

• La classe Vector<E> implementa un array di dimensioni variabili. Ai suoi elementi si accede tramite indice, come negli array non ridimensionabili

• Richiede: import java.util.Vector;

• Costruttori:– Vector()– Vector(Collection<? extends E> c)

costruisce un vettore che contiene gli elementi della collezione specificata, nel loro ordine originario

– Vector(int initialCapacity)– Vector(int initialCapacity, int capacityIncrement)

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 6: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Aggiunta, inserimento e ricerca di elementi

• public boolean add(E e)aggiunge l’elemento e in coda al vettore

• public E set(int index, E element)rimpiazza l’elemento all’indice specificato con element

• public E get(int index) public E elementAt(int index)restituiscono l’elemento alla posizione specificata

• public int indexOf(Object o)public int indexOf(Object o, int index)public int lastIndexOf(Object o)restituiscono l’indice corrispondente rispettivamente alla prima occorrenza, alla prima occorrenza a partire da un dato indice e all’ultima occorrenza dell’oggetto o, oppure -1 se l’oggetto non viene trovato

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 7: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Rimozione di elementi

• public void clear()public void removeAllElements()rimuovono tutti gli elementi del vettore e ne impostano la dimensione a 0

• public E remove(int index)public void removeElementAt(int index)rimuovono l’elemento all’indice dato

• public boolean remove(Object o)public boolean removeElement(Object o)rimuove la prima occorrenza dell’oggetto o

• protected void removeRange(int fromIndex, int toIndex)rimuove tutti gli elementi il cui indice sta tra fromIndex (incluso) e toIndex (escluso)

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 8: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Metodi per il dimensionamento di un Vector

• public void trimToSize() riduce la capacità del vettore a quella corrente, minimizzando l’occupazione di spazio in memoria

• public void ensureCapacity(int minCapacity)incrementa se necessario la capacità per supportare il numero minimo di elementi specificato

• public void setSize(int newSize)imposta le dimensioni del vettore: se superiori a quelle attuali il vettore viene riempito alla fine di elementi null, se inferiori si scartano gli elementi in eccesso

• public int capacity()restituisce la capacità corrente del vettore (cioè la lunghezza dell’array di dati, indipendentemente dal suo effettivo riempimento)

• public int size() restituisce il numero di elementi del vettore

• public boolean isEmpty() verifica se il vettore non abbia elementi

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 9: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

• Istanza di un nuovo Vectorsize = 0, capacity = 10

• Dopo due operazioni di addsize = 2, capacity = 10

• Dopo un’operazione di trimToSizesize = 2, capacity = 2

Size e capacity

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Ab Ki

Ab Ki

MIDIPitchArray2.java

EsempioVector.java

Page 10: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

DATI MIDIRappresentazione dei

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 11: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Messaggi MIDI

• La classe MidiMessage è astratta e fornisce una descrizione grezza dei messaggi MIDI. Ha tre sottoclassi:– ShortMessage (vedi lezione precedente)– SysexMessage per i System Exclusive– MetaMessage per i metaeventi, ossia eventi

generalmente utili per i sequencer ma insignificanti per i sintetizzatori

• Le tre sottoclassi ereditano da (e rendono concreta) la classe MidiMessage

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 12: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

MetaMessage

• Costruttoripublic MetaMessage()public MetaMessage(int type, byte[] data, int length) throws InvalidMidiDataException

• I contenuti del messaggio si possono impostare anche con il metodo setMessage

• Parametri:– type – il tipo di metamessaggio (deve essere < 128)– data – i byte di dati– length – il numero di byte nell’array di dati (deve essere

non negativo e <= data.length)

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 13: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Eventi MIDI

• Gli standard MIDI file contengono eventi temporizzati. La classe MidiEvent rappresenta questo tipo di informazione, cioè un messaggio nella forma in cui sarebbe memorizzato in uno standard MIDI file

• La classe presenta metodi per impostare e leggere il valore della temporizzazione dell’evento

• E’ inoltre possibile ottenere il messaggio MIDI “grezzo”, istanza di una delle sottoclassi di MidiMessage

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 14: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Sequenze e tracce

• Negli standard MIDI file gli eventi sono disposti in tracce

• La strutturazione Java prevede:– Sequence– Track– MidiEvent

ove una traccia Track è una collezione di MidiEvent e una sequenza Sequence è una collezione di Track

Attenzione: non si tratta di una gerarchia tra classi! Difatti le tre classi ereditano direttamente da java.lang.Object.

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 15: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Sequenze e tracce

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Ogni evento MidiEvent è {ShortMessage | SysExMessage | MetaMessage} + temporizzazione

Page 16: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Sequenze e tracce

• Le sequenze, ossia le istanze della classe Sequence, possono essere:– lette dai file MIDI– create da zero– editate aggiungendo o rimuovendo tracce

• Le tracce rappresentano il livello intermedio della gerarchia a 3 livelli, posizionandosi tra le sequenze che un sequencer può gestire e gli eventi MIDI

• Analogamente gli eventi MIDI, ossia le istanze della classe MidiEvent, possono essere aggiunti o rimossi dalle tracce di una data sequenza

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 17: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Istanziare una sequenza

• Come si istanzia una sequenza?

• Costruttori:public Sequence(float divisionType, int resolution)

Public Sequence(float divisionType, int resolution,

int numTracks)

• Possibili valori per divisionType:PPQ,SMPTE_24, SMPTE_25, SMPTE_30, SMPTE_30DROP

• La risoluzione temporale esprime i tick per beat–Per conoscere la temporizzazione assoluta, è necessario il BPM (default = 120)

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 18: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Istanziare una traccia

• Come si istanzia una traccia? Track miaTraccia = new Track(); dà errore!!!

• Non è possibile definirla al di fuori di una sequenza, in quanto questa ne determina la temporizzazione e la risoluzione temporale

• E’ dunque necessario invocare il metodo Sequence.createTrack()

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

Page 19: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Aggiunta e rimozione di eventi MIDI

public class Track extends Object

•boolean add(MidiEvent event)

•MidiEvent get(int index)

•boolean remove(MidiEvent event)

•int size()restituisce il numero di eventi nella traccia

•long ticks()restituisce la lunghezza della traccia in MIDI ticks

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

EsempioSequenze.java

Page 20: Dati MIDI in Java Lezione 22 Programmazione MIDI (Prof. Luca A. Ludovico)

Far suonare le sequenze

• La prossima lezione sarà dedicata alla rappresentazione dei dispositivi MIDI, tra cui sequencer e sintetizzatori

• Al momento:Sequencer mioSeq = MidiSystem.getSequencer();mioSeq.open();mioSeq.setSequence(sequence);mioSeq.start();…mioSeq.stop();

Programmazione MIDI (Prof. Luca A. Ludovico)22. Dati MIDI in Java

CreateSequence.java