10
Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Embed Size (px)

Citation preview

Page 1: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Trasmettitori e ricevitori

Lezione 24

Programmazione MIDI (Prof. Luca A. Ludovico)

Page 2: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

MIDI player parametrico

• Il codice EsempioMidiPlayer.java implementa un semplice MIDI player che emette un messaggio NoteOn seguito da un NoteOff opportunamente distanziato sul synth di default

• In ingresso è necessario specificare il numero dello strumento GM e il pitch della nota– E’ presente quindi anche un primo messaggio di

Program Change

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

EsempioMidiPlayer.java

Page 3: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Trasmettitori e ricevitori (ripasso)

• Ripasso: un MidiDevice può essere un trasmettitore di eventi MIDI, un ricevitore o entrambe le cose. Dunque MidiDevice deve mettere a disposizione istanze delle interfacce Transmitter o Receiver o entrambe.

• Tipicamente:– le porte MIDI IN (che sono viste dal package come sorgenti

di messaggi) presentano trasmettitori– le porte MIDI OUT e i sintetizzatori presentano ricevitori – i sequencer mettono a disposizione trasmettitori per il

playback e ricevitori per le operazioni di registrazione

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Page 4: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

SynthPorta MIDI In

Esempi

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Trasmettitore Messaggio MIDI Ricevitore

Midi Out 1Sequencer

Trasmettitore 1 Messaggio MIDI Ricevitore Midi Out 2

Trasmettitore 2 Messaggio MIDI Ricevitore

Mittente Destinatari

Page 5: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Invio di un messaggio a un ricevitore

• Abbiamo visto come creare direttamente un messaggio MIDI: ad esempio con il metodo di ShortMessage void setMessage(int command, int channel,

int data1, int data2)

• Una volta creato il messaggio, è possibile inviarlo a un oggetto Receiver (anche senza istanziare un trasmettitore) usando il metodo della classe Receivervoid send(MidiMessage message, long timeStamp)

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Ricevitore.java

Page 6: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Timestamp

• Il metodo della classe Receivervoid send(MidiMessage message, long timeStamp)richiede di specificare un timestamp

• Se il dispositivo destinatario deve gestire il messaggio in tempo reale (ossia non appena possibile), va specificato il valore -1. In caso contrario, è possibile esprimere un timestamp in microsecondi

• Non è detto che il dispositivo ricevente sia in grado di gestire i timestamp, o che gestisca intervalli temporali negativi o futuri ma troppo lontani nel tempo

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Page 7: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Connessione di ricevitori e trasmettitori

• Il caso più comune però non è creare messaggi ex novo, senza usare un trasmettitore, ma connettere dispositivi MIDI che scambiano messaggi tra loro.

• E’ possibile connettere un dispositivo mittente a uno o più destinatari– Attenzione alla differenza tra dispositivi

(per noi “mittente” e “destinatario”) e ricevitori/trasmettitori (multipli per dispositivo)

• Analogamente, si può fare in modo che un dispositivo destinatario ascolti da più mittenti– E’ possibile per un singolo ricevitore ascoltare più trasmettitori

(ma non il viceversa!)

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

TrasmettitoreRicevitore.java

TrasmettitoreRicevitori.java

Page 8: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Trasmettitori / ricevitori supportati

• Per conoscere il numero di trasmettitori / ricevitori supportati da un dato dispositivo, si possono usare i metodi di MidiDeviceint getMaxTransmitters() int getMaxReceivers()

• Attenzione: si tratta del numero totale, non il numero di quelli attualmente disponibili

• Per sapere se un dato trasmettitore ha un ricevitore

associato, si può invocare Transmitter.getReceiver()

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Page 9: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Chiusura delle connessioni

• Completato lo scambio di messaggi, è possibile liberare risorse invocando il metodo close() sui singoli ricevitori e trasmettitori

• Poiché un ricevitore può ascoltare da più trasmettitori, invocando il metodo Transmitter.setReceiver non si chiude la connessione precedentemente stabilita tra lo stesso ricevitore e un altro trasmettitore

• Si può anche invocare MidiDevice.close(), che disabilita un dispositivo chiudendo tutti i suoi ricevitori e trasmettitori

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

Page 10: Trasmettitori e ricevitori Lezione 24 Programmazione MIDI (Prof. Luca A. Ludovico)

Esempio conclusivo

• Obiettivo: associare tutti i trasmettitori dei device mittente installati sulla macchina e associarli al ricevitore del synth di default

• Collegando un dispositivo MIDI (ad esempio una tastiera virtuale tramite una porta MIDI In virtuale), gli eventi nota verranno renderizzati da parte del synth

Programmazione MIDI (Prof. Luca A. Ludovico)24. Trasmettitori e ricevitori

AscoltoPortaMidi.java