Un applet AWT que reproduce música


Introducción

El applet que puedes ver más abajo reproduce archivos de música, que han sido empaquetados en un archivo JAR. Para crear el archivo JAR:


	jar -cvf sonidos.jar adagio_barber.mid ....[el resto de archivos que se incluyen]

Para visualizar las entradas (archivos) que están en el JAR:


	jar -tvf sonidos.jar

El nombre del archivo JAR se le pasa al applet desde la página HTML en la forma de parámetro. En la página HTML se utiliza PARAM para definir el nombre del parámetro y el valor:


	<APPLET
		codebase = "."
		code     = "awt03_musica.applet.class"
	... >
	<PARAM NAME = ARCHIVO_JAR VALUE = "awt03_musica/sonidos/sonidos.jar"> </APPLET>

En el código fuente usamos getParameter(), que devuelve la cadena indicada antes en VALUE:


	getParameter("ARCHIVO_JAR")

Se usa este procedimiento para leer el nombre del archivo JAR por razones pedagógicas (así aprendemos a usar la función getParameter) y de su comodidad.

El applet aparece a continuación: En la parte izquierda del applet tenemos la lista de temas musicales. En la parte derecha:

¿Por qué usar archivos JAR? Esencialmente por su capacidad de compresión. Por ejemplo, los archivos MIDI son comprimidos a un 30% de su peso original.



Una nota final: se pueden reproducir otro tipo de archivos. Se ha escogido el formato MIDI porque son las más ligeros (aunque también los de peor calidad). Hemos utilizado las capacidades básicas de reproducción de sonido que había en Java 1.1. En versiones posteriores de Java las capacidades de reproducción y tratamiento de sonidos han mejorado espectacularmente. Para más información ver: java.sun.com


Puede descargar el código fuente del applet: applet.java

Leer los nombres de los archivos

Necesitamos leer los nombres de los archivos musicales contenidos en el fichero JAR. Los leemos para añadirlos a un combo box del applet donde el usuario puede ver la música disponible. Afortunadamente para nosotros el archivo JAR contiene no sólo los archivos de música comprimidos, sino además un listado de los nombres de estos archivos. Estos nombres se denominan "entradas" (entries) del archivo JAR y como veremos son relativamente fáciles de leer.

Para obtener las entradas (entries) del archivo JAR usamos las clases JarFile y JarEntry:

En el siguiente ejemplo puede ver que montamos un bucle (for) para:


	JarFile jar = conexion.getJarFile();

	/***** Consigo las entradas del JarFile y las añado a la lista ********/
	JarEntry entry;
	for (Enumeration e = jar.entries() ; e.hasMoreElements() ;) {
		entry = (JarEntry) e.nextElement();

		// Excluye estas entradas, el resto las añade a la lista
		if (!"META-INF/MANIFEST.MF".equals(entry.getName()) && !"META-INF/".equals(entry.getName()) ) 
			lista.add(entry.getName());                       // Añadir a la lista

			...
	}

¿Cómo obtener los archivos musicales almacenados en el JAR y reproducirlos (play)?

Tenemos que unir en una cadena (String) dos rutas:

Con estas dos variables podemos construir la URL del tema contenido en el archivo JAR (variable 'url_tema'):


	String path_absoluto_jar = protocol + this.getCodeBase().toString()+path_relativo_jar;

	/****** Construimos la URL del archivo de sonido a partir de: url de jar y nombre de archivo de música **/
	URL url_tema = new URL( new URL( path_absoluto_jar), archivo_tema);

	AudioClip tema = getAudioClip(url_tema);
	tema.play();

Puedes ver que conseguimos un objeto AudioClip a partir de una llamada a getAudioClip() (método de la clase Applet). El objetivo de reproducir el archivo de audio se consigue llamando al método play.