11.500 cursos gratis
7.879.693 alumnos
Facebook Twitter YouTube
Busca cursos gratis:
Estás aquí: mailxmail > Cursos de Informática > Programación > Programación de juegos para móviles con J2ME > Música

Programación de juegos para móviles con J2ME

Autor: Alberto García Serrano
Curso:
9/10 (85 opiniones) |34232 alumnos|Fecha publicación: 07/09/2004

Capítulo 24:

 Música

Además de samples, la API multimedia nos permite reproducir notas musicales (tonos). La forma más simple de reproducir un tono es utilizar el método playTone() de la clase Manager.

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) {}

    }

}

Capítulo siguiente - Almacenamiento. RMS
Capítulo anterior - Sonidos

Nuestras novedades en tu e-mail

Escribe tu e-mail:

Al presionar "Recibir" estás dándote de alta y aceptas las condiciones legales de mailxmail

Cursos similares a Programación de juegos para móviles con J2ME


  • Vídeo
  • Alumnos
  • Valoración
  • Cursos
1. Flash. Programación de juegos
Tutorial de Flash , es lo que podrás aprender hoy en nuestro nuevo curso de... [24/06/11]
257
Curso con video
2. Metodología de la Programación
Este curso gratis le proporcionará, a modo de iniciación, algunos de los pasos a... [23/05/03]
63.775  
3. Programación en C++
C++ es un potente lenguaje de programación que apareció en 1980, continuando con... [04/06/04]
69.596  




El blog de mailxmail|¿Qué es mailxmail.com?|ISSN: 1699-4914|Recomiéndanos|Ayuda
Publicidad|Condiciones legales de mailxmail


¿Te interesa? ¡Te enviamos gratis las novedades de Programación!

 Regístrate gratis »