Lezione 21
Package javax.sound.midi
Programmazione MIDI (Prof. Luca A. Ludovico)
Classi astratte
• Si definisce classe astratta una classe che definisce
una interfaccia senza implementarla completamente.
Ciò serve come base di partenza per generare una o
più classi specializzate aventi tutte la stessa
interfaccia di base.
• La classe astratta da sola non può essere istanziata,
viene progettata soltanto per svolgere la funzione di
classe base da cui le classi derivate possono ereditare.
Le caratteristiche "incomplete" della classe astratta
vengono condivise da un gruppo di sotto-classi figlie,
che vi aggiungono caratteristiche diverse, in modo da
colmare le "lacune" della classe base astratta.
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Classi astratte
• Le classi astratte possono essere considerate come
super-classi che contengono metodi astratti,
progettate in modo che le sotto-classi che ereditano
da esse ne "estenderanno" le funzionalità
implementandone i metodi.
• Il comportamento definito da queste classi è
"generico" e la maggior parte dei costrutti della classe
sono indefiniti e non implementati. Prima che una
classe derivata da una classe astratta possa essere
istanziata essa ne deve implementare tutti i metodi
astratti.
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Classi astratte
• Una classe qualsiasi, che abbia almeno un metodo
definito abstract e quindi non implementato, diventa
a sua volta astratta
• I costruttori vanno necessariamente implementati
nelle classi figlie
• In Java, una classe astratta si crea così:
abstract class Pippo
{
…
}
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Package
JAVAX.SOUND.MIDI
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Introduzione
• Il package javax.sound.midi mette a disposizione interfacce e classi
per l’I/O, il sequencing e la sintesi di dati MIDI.
Si include tramite la riga import javax.sound.midi.*;
• Link alla documentazione ufficiale:
http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/packagesummary.html
• Attenzione: si fa sempre riferimento a Java SE Development Kit 7.
Nel JDK 6, il package MIDI presenta delle differenze sostanziali.
http://docs.oracle.com/javase/6/docs/api/javax/sound/midi/packagesummary.html
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Descrizione del package
Class
Description
Instrument
An instrument is a sound-synthesis algorithm with certain parameter settings, usually designed to emulate a
specific real-world musical instrument or to achieve a specific sort of sound effect.
A MetaMessage is a MidiMessage that is not meaningful to synthesizers, but that can be stored in a MIDI file
and interpreted by a sequencer program.
A MidiDevice.Info object contains assorted data about a MidiDevice, including its name, the company who
created it, and descriptive text.
MIDI events contain a MIDI message and a corresponding time-stamp expressed in ticks, and can represent the
MIDI event information stored in a MIDI file or a Sequence object.
A MidiFileFormat object encapsulates a MIDI file's type, as well as its length and timing information.
MidiMessage is the base class for MIDI messages.
The MidiSystem class provides access to the installed MIDI system resources, including devices such as
synthesizers, sequencers, and MIDI input and output ports.
A Patch object represents a location, on a MIDI synthesizer, into which a single instrument is stored (loaded).
A Sequence is a data structure containing musical information (often an entire song or composition) that can
be played back by a Sequencer object.
A SyncMode object represents one of the ways in which a MIDI sequencer's notion of time can be synchronized
with a master or slave device.
A ShortMessage contains a MIDI message that has at most two data bytes following its status byte.
A SoundbankResource represents any audio resource stored in a Soundbank.
A SysexMessage object represents a MIDI system exclusive message.
A MIDI track is an independent stream of MIDI events (time-stamped MIDI data) that can be stored along with
other tracks in a standard MIDI file.
A VoiceStatus object contains information about the current status of one of the voices produced by
a Synthesizer.
MetaMessage
MidiDevice.Info
MidiEvent
MidiFileFormat
MidiMessage
MidiSystem
Patch
Sequence
Sequencer.SyncMode
ShortMessage
SoundbankResource
SysexMessage
Track
VoiceStatus
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
public abstract class MidiMessage
• MidiMessage è la classe base per i messaggi MIDI
– messaggi MIDI gestibili da un sintetizzatore
– meta-eventi (lyrics, copyrights, tempo, ecc.)
• La classe permette di accedere sostanzialmente a 3
tipi di informazione sui messaggi MIDI:
– status byte
– dimensione totale del messaggio (status byte e data byte)
– array di byte contenente il messaggio MIDI completo
• I metodi forniti permettono di leggere tali info, per
accedere in scrittura si usano sottoclassi
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Byte in JAVA e in MIDI
• Lo standard MIDI esprime i dati in byte. Però il tipo
byte in Java adotta la codifica con segno, quindi la
libreria esprime i dati MIDI come Integer
• Come convertire un byte b MIDI in un intero i Java:
int i = (int)(b & 0xFF)
• Se si vuole passare un valore noto di byte MIDI come
parametro intero di un metodo, può essere espresso
direttamente come intero in base 10 o 16
– Esempio: passare lo status byte di Active sensing [11111110]2
in ingresso al metodo setMessage(int)
setMessage(254) oppure setMessage(0xFE)
Notazione
esadecimale
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Costruttore e Attributi della classe MidiMessage
Costruttore
• protected MidiMessage(byte[] data)
costruisce un nuovo MidiMessage
Attenzione: è una classe astratta, non si possono
istanziare direttamente oggetti MidiMessage
Attributi
• protected byte[] data
i dati del messaggio MIDI
• protected int length
il numedo di byte che costituisce il messaggio MIDI
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Metodi della classe MidiMessage
Metodi
• abstract Object clone()
crea un nuovo oggetto della stessa classe e con gli stessi contenuti di
quello corrente
• int getLength()
restituisce la lunghezza totale in byte del messaggio
• byte[] getMessage()
restituisce i dati del messaggio MIDI
• int getStatus()
restituisce il solo status byte del messaggio MIDI
• protected void setMessage(byte[] data, int length)
imposta i dati del messaggio MIDI
• Inoltre, la classe eredita i metodi della classe Object, tra cui equals,
getClass, e toString
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Class ShortMessage
• La classe MidiMessage è dichiarata astratta:
public abstract class MidiMessage
• La classe ShortMessage eredita da MidiMessage e la rende concreta:
public class ShortMessage extends MidiMessage
• Uno ShortMessage contiene un messaggio MIDI con al più due byte
di dati che seguono il byte di stato
–
–
Rientrano channel voice, channel mode, system common, e system real-time
Non rientrano system exclusive e meta-eventi
• La classe fornisce metodi per leggere e scrivere i contenuti di tali
messaggi
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Class ShortMessage
• Molti dei metodi della classe presentano parametri
interi con cui si specifica lo status e i data byte MIDI
• Conoscendo tali valori, si possono esprimere
direttamente
In alternativa:
– per i messaggi di sistema, si possono usare direttamente gli
attributi della classe
– per i messaggi di canale, i 4 bit superiori (comando) si
possono esprimere tramite gli attributi della classe e quelli
inferiori tramite un ulteriore valore intero
Vedi elenco completo più avanti
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Costruttori della classe ShortMessage
• ShortMessage()
• protected ShortMessage(byte[] data)
• ShortMessage(int status)
non presenta data byte
• ShortMessage(int status, int data1, int data2)
presenta al più 2 data byte
• ShortMessage(int command, int channel, int data1, int
data2)
permette di specificare il canale per i messaggi di canale
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Attributi (aggiuntivi) della classe ShortMessage
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
static
int ACTIVE_SENSING
int CHANNEL_PRESSURE
int CONTINUE
int CONTROL_CHANGE
int END_OF_EXCLUSIVE
int MIDI_TIME_CODE
int NOTE_OFF
int NOTE_ON
int PITCH_BEND
int POLY_PRESSURE
int PROGRAM_CHANGE
int SONG_POSITION_POINTER
int SONG_SELECT
int START
int STOP
int SYSTEM_RESET
int TIMING_CLOCK
int TUNE_REQUEST
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
0xFE, o 254
0xD0, o 208
0xFB, o 251
0xB0, o 176
0xF7, o 247
0xF1, o 241
0x80, o 128
0x90, o 144
0xE0, o 224
0xA0, o 160
0xC0, o 192
0xF2, o 242
0xF3, o 243
0xFA, o 250
0xFC, o 252
0xFF, o 255
0xF8, o 248
0xF6, o 246
Metodi (aggiuntivi) della classe ShortMessage
EsempioMidiMessage.java
•
•
•
•
•
•
Object clone()
int getChannel()
int getCommand()
int getData1()
int getData2()
protected int getDataLength(int status)
restituisce il numero di data byte associati a un particolare status byte
• void setMessage(int status)
imposta lo status byte di un messaggio MIDI privo di data byte
• void setMessage(int status, int data1, int data2)
• void setMessage(int command, int channel, int data1,
int data2)
• Metodi ereditati da MidiMessage:
getLength, getMessage, getStatus, setMessage
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Eccezioni
• Ereditano dalle classi
java.lang.Object
java.lang.Throwable
java.lang.Exception
• InvalidMidiDataException
Viene sollevata quando si incontrano dati MIDI non appropriati
• MidiUnavailableException
Viene lanciata quando un componente MIDI richiesto non può
essere aperto o creato in quanto non disponibile
• In Java è possibile istanziare oggetti della classe Exception (o
classi figlie) e sollevare manualmente con il comando throw
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Gestione delle eccezioni MIDI
• Il package Java dedicato al MIDI costringe il programmatore a
“proteggere” le parti di codice relative al MIDI tramite blocchi
try … catch
• Nel caso in cui appaiano istruzioni al di fuori del try, a compiletime si segnala il messaggio di errore:
“unreported exception InvalidMidiDataException; must be caught
or declared to be thrown”
e dunque il codice non viene compilato
EsempioEccezioni.java
Programmazione MIDI (Prof. Luca A. Ludovico)
21. Package javax.sound.midi
Scarica

Presentazione del corso