Lezione 24
Trasmettitori e ricevitori
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
EsempioMidiPlayer.java
Programmazione MIDI (Prof. Luca A. Ludovico)
24. Trasmettitori e ricevitori
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
Esempi
Porta MIDI In
Trasmettitore
Synth
Messaggio MIDI
Mittente
Destinatari
Midi Out 1
Sequencer
Trasmettitore 1
Messaggio MIDI
Trasmettitore 2
Messaggio MIDI
Programmazione MIDI (Prof. Luca A. Ludovico)
24. Trasmettitori e ricevitori
Ricevitore
Ricevitore
Midi Out 2
Ricevitore
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 Receiver
void send(MidiMessage message, long timeStamp)
Ricevitore.java
Programmazione MIDI (Prof. Luca A. Ludovico)
24. Trasmettitori e ricevitori
Timestamp
• Il metodo della classe Receiver
void 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
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)
TrasmettitoreRicevitore.java
TrasmettitoreRicevitori.java
• 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
Trasmettitori / ricevitori supportati
• Per conoscere il numero di trasmettitori / ricevitori
supportati da un dato dispositivo, si possono usare i
metodi di MidiDevice
int 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
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
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
AscoltoPortaMidi.java
Programmazione MIDI (Prof. Luca A. Ludovico)
24. Trasmettitori e ricevitori
Scarica

Trasmettitori e ricevitori