MokaByte
Numero 28 - Marzo 1999
|
|||
|
|||
Mauro Molino |
|
||
La nuove Java Sound API promette la possibilita' di interagire in maniera estremamente efficace con le piu' disparate sorgenti audio, operando a basso livello sul suono digitale.Nell'articolo cercheremo di entrare nel dettaglio dell'utilizzo di questa neo-nata API. |
Perche' Java
Sound API?
E' lecito porre
la domanda in quanto gia' esiste Java Media Framework che si occupa di
gestire formati multimediali. Diciamo che laddove sia necessaria la sola
esecuzione di files multimediali e' senz'altro sufficiente Java Media Framework,
mentre dovunque siano richieste funzionalita' piu' avanzate come elaborazione,
registrazione e mixaggio di audio digitale la Java Sound API trova la sua
ideale collocazione. Fra i formati audio supportati ricordiamo : MIDI,
WAV, AU,AIFF.L'elaborazione audio in generale richiede un grosso lavoro
a livello di processore, e la maggior parte dei sistemi di sviluppo audio
sono fortemente basati su codice specifico per la piattaforma utilizzata.
Java Sound utilizza invece uno strato di astrazione che isola la specificita'
architetturale dal lavoro dello sviluppatore,
Architettura dell'API In un sistema
audio su computer possiamo distinguere dispositivi di due tipi: hardware
e
Altri oggetti L'oggetto base
per la sincronizzazione e' javax.media.Time . Questo oggetto supporta una
import javax.media.*; import javax.media.format.*; import javax.media.format.midi.*; import javax.media.transport.*; import javax.media.sound.*; import javax.media.sound.midi.*;
import java.io.*; import java.net.*; per la gestione
dei file e per l'oggetto URL.
public class ProvaMidi {Per tutti gli errori che potranno essere generati lanciamo una MediaException, che verra' gestita nel "main", che crea l'istanza della classe ProvaMidi. In questo modo semplifichiamo la gestione degli errori. Questo e' possibile perche' nel nostro caso, un errore genera sempre lo stesso tipo di comportamento, cioe' la visualizzazione di una stringa di errore, e l'uscita dal programma. public ProvaMidi(String file) throws MediaException {Creiamo ora un FileInputStream da associare ad un MediaStream per la lettura del file MIDI. Costruiamo un MediaStream per il file MIDI. Notiamo che il MediaStream e' creato nell'AudioManager, che e' il punto di accesso alla Java Sound API. Facciamo tutti i controlli sul file, e cioe' se esiste e se il suo formato e' valido.
try {
mediaStream = AudioManager.newMediaStream(is);
} catch (Exception e) {
throw new MediaException("Controllare file "+ file + " sia valido" );
}
if ( ! (mediaStream.getFormat() instanceof MidiFileFormat) ) {
throw new MediaException("Not a MIDI file: " + mediaStream.getFormat().toString());
}
Creiamo ora sul
dispositivo virtuale MIDI un "player" MIDI, che e' poi l'esecutore del
brano.
try {
MidiOutControlDevice controlDevice = (MidiOutControlDevice)AudioManager.getControlDevice(Class.forName( "javax.media.sound.midi.MidiOutControlDevice"), null);
channel = controlDevice.newSequencePlayer();
} catch (Exception e) {
throw new MediaException("MidiOutControlDevice non disponibile sul sistema");
}
Carichiamo la sequenza di dati MIDI nel "player" appena creato.
try {
channel.load(mediaStream);
} catch(Exception e) {
throw new MediaException("Controllare che il file "+ file + " esista e sia valido");
}
Allochiamo le risorse per il MediaChannel e facciamo partire l'esecuzione del brano.
try {
channel.acquire();
channel.start();
} catch (ResourceUnavailableException e) {
throw new MediaException("Dispositivo audio non disponibile");
}
} Il metodo "main"
si occupa di istanziare la classe ProvaMidi e di intercettare gli errori
public static void main( String[] args) {
if (args.length == 0) {
System.err.println("\nE' necessario specificare un file
MIDI come parametro.\n");
} else {
try {
ProvaMidi app = new ProvaMidi(args[0]);
} catch (MediaException e) {
System.err.println("Impossibile eseguire l'applicazione: " + e.getMessage()); } } } } Per evitare di
dover gestire degli eventi, cosa che avrebbe spostato la focalizzazione
su altre
channel.stop(); // ferma l'esecuzione del brano. channel.setDB(float gain); // stabilisce il guadagno in decibel. channel.setPan(float pan); // stabilisce il panning (destra,sinistra,centro) channel.fade(float gain,Time time) // porta il guadagno a "gain" nel tempo "time" channel.setMute(boolean mute) // attiva/disattiva il "muto" E cosi' via.
Come si vede la quantita' di azioni intraprendibili e' notevole, malgrado
ci
Stato dei lavori La versione testata
e' la 0.8 Early Access. I formati audio supportati sono : WAVE, AIFF/AIFC,
Conclusioni Un solo articolo
non poteva essere minimamente esaustivo, data la vastita' di oggetti
|
|
||
MokaByte ricerca
nuovi collaboratori.
|
||
|