4,52/5
(83 opiniones)
|12507 alumnos|Fecha publicación: 07/09/2004
try {
Manager.playTone(ToneControl.C4, 100, 80);
} catch (Exception e){}
Este método tiene tres parámetros. El primero es la
frecuencia del tono. En este caso hemos utilizado la constante
ToneControl.C4, que es la frecuencia de la nota Do central. Otra
constante interesante es ToneControl.SILENCE. El segundo parámetro
es la duración de la nota en milisegundos, y el tercero el volumen
de reproducción.
Reproducir una melodía con la ayuda del método playTone() puede ser un trabajo algo arduo. Es por ello que la API multimedia nos ofrece otra forma de reproducir secuencias de notas. Una secuencia es un array de bytes con un formato muy concreto. El array se va rellenando con pares de bytes cuyo significado analizaremos con un ejemplo.
byte[] secuencia = {
ToneControl.VERSION, 1,
ToneControl.TEMPO, tempo,
// comienzo del bloque 0
ToneControl.BLOCK_START, 0,
// notas del bloque 0
C4,d, F4,d, F4,d, C4,d, F4,d, F4,d, C4,d,
F4,d,
// fin del bloque 0
ToneControl.BLOCK_END, 0,
// inicio del bloque 1
ToneControl.BLOCK_START, 1,
// notas del bloque 1
C4,d, E4,d, E4,d, C4,d, E4,d, E4,d, C4,d,
E4,d,
// fin del bloque 1
ToneControl.BLOCK_END, 1,
// reproducir bloque 0
ToneControl.PLAY_BLOCK, 0,
// reproducir bloque 1
ToneControl.PLAY_BLOCK, 1,
// reproducir bloque 0
ToneControl.PLAY_BLOCK, 0,
};
Podemos observar que la secuencia está dividida en tres secciones
bien diferenciadas. En la primera establecemos la versión (del
formato de secuencia) y el tempo de la melodía. Observa como la
información se codifica en pares de bytes. El primero indica el
atributo para el que queremos establecer un valor, y el segundo es
el valor mismo.
En la segunda sección de la secuencia definimos bloques de notas. Las notas comprendidas entre ToneControl.BLOCK_END y ToneControl.BLOCK_START forman un bloque. Podemos definir tantos bloques como necesitemos. Dentro de un bloque, las notas van definidas en pares, cuyo primer byte es la nota y el segundo es la duración. Finalmente, la tercera sección indica el orden de reproducción de cada bloque de notas.
El código encargado de reproducir la secuencia es el siguiente.
Player p =
Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
p.realize();
ToneControl c = (ToneControl)p.getControl("ToneControl");
c.setSequence(secuencia);
p.start();
Vamos a reunir en el siguiente ejemplo práctico todo lo expuesto en
el presente capítulo.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import java.io.*;
public class Sonido extends MIDlet implements
CommandListener {
private Display display;
private Form formulario;
private Command exit;
private Command wav, nota,
secuencia;
public Sonido() {
display =
Display.getDisplay(this);
exit = new
Command("Salir", Command.EXIT, 1);
wav = new Command("WAV",
Command.SCREEN, 2);
nota = new
Command("Nota", Command.SCREEN, 2);
secuencia = new
Command("Secuencia", Command.SCREEN, 2);
formulario = new
Form("Reproducir.");
formulario.addCommand(exit);
formulario.addCommand(wav);
formulario.addCommand(nota);
formulario.addCommand(secuencia);
formulario.setCommandListener(this);
}
public void startApp() {
display.setCurrent(formulario);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c,
Displayable s) {
if (c == exit) {
destroyApp(false);
notifyDestroyed();
} else {
if (c == wav)
playWav();
if (c == nota)
playNota();
if (c == secuencia)
playSecuencia();
}
}
public void playWav() {
try {
// Abrir corriente de datos del archivo de sonido
InputStream in =
getClass().getResourceAsStream("/explosion.wav");
Player p = Manager.createPlayer(in, "audio/x-wav");
// comenzar reproducción
p.start();
} catch (Exception e)
{
Alert alr = new Alert("Error", "No se pudo reproducir el
sonido.",
null, AlertType.ERROR);
alr.setTimeout(Alert.FOREVER);
display.setCurrent(alr, formulario);
}
}
public void playNota() {
try {
// reproducir nota
Manager.playTone(ToneControl.C4, 100, 80);
} catch (Exception
e){}
}
public void playSecuencia() {
byte tempo = 30;
byte d = 8;
// Creamos
las notas a partir del Do central
byte C4 =
ToneControl.C4;;
byte D4 = (byte)(C4 +
2);
byte E4 = (byte)(C4 +
4);
byte F4 = (byte)(C4 +
5);
byte G4 = (byte)(C4 +
7);
byte silencio =
ToneControl.SILENCE;
byte[]
secuencia = {
ToneControl.VERSION, 1,
ToneControl.TEMPO, tempo,
// comienzo del bloque 0
ToneControl.BLOCK_START, 0,
// notas del bloque 0
C4,d, F4,d, F4,d, C4,d, F4,d, F4,d, C4,d, F4,d,
// fin del bloque 0
ToneControl.BLOCK_END, 0,
// inicio del bloque 1
ToneControl.BLOCK_START, 1,
// notas del bloque 1
C4,d, E4,d, E4,d, C4,d, E4,d, E4,d, C4,d, E4,d,
// fin del bloque 1
ToneControl.BLOCK_END, 1,
// reproducir bloque 0
ToneControl.PLAY_BLOCK, 0,
// reproducir bloque 1
ToneControl.PLAY_BLOCK, 1,
// reproducir bloque 0
ToneControl.PLAY_BLOCK, 0,
};
try{
Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
p.realize();
ToneControl c = (ToneControl)p.getControl("ToneControl");
c.setSequence(secuencia);
p.start();
} catch (IOException
ioe) {
} catch (MediaException
me) {}
}
}
Hay 83 opiniones. Opina sobre este curso.
| Cursos | Valoración | Alumnos | Vídeo | |
|---|---|---|---|---|
|
Sistemas Informativos. Diseño y creación (1/2) Diseño de sistemas informativos. El proceso de creación de los sistemas informativos es el centro de esta primera parte del curso. Desarrollamos u... [08/04/09] |
|
2.909 | ||
|
Apache + PHP + MySql + PhpMyAdmin como módulo de Apache Éste es un breve manual para una instalación rápida de PHP como módulo de Apache. Recuerda que el PHP también puede instalarse como CGI aunque no es el tipo de ... [18/01/05] |
|
8.794 | ||
|
Introducción al lenguaje Pascal Pascal es un lenguaje de alto nivel y de propósito general (es aplicable a un gran número de aplicaciones diversas) desarrollado por el profesor suizo Niklaus Wirth como ... [01/03/06] |
|
10.784 | ||
Publicar en
del.icio.us
digg
meneame