Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Articulos para programar aspectos de sonidos (OpenAL)

Aquí os mando mis primeros pasos en la traducción de unos articulos muy bueno que encontré por la red. Espero que os gusten y si encontrais fallos...avisad.

INTRODUCCIÓN
OpenAL es una multi plataforma 3D audio API adecuada para usarse en juegos o aplicaciones de audio. La versión 1.0 está terminada i funciona bajo Linux, MacOS (8/9 and OS X), i Windows (32-bits) casi a la perfección. Existen muchas aplicaciones que actualmente usan OpenAL.
Las tarjetas de sonido Creative llevan incorporadas un hardware que acelera el sistemaOpenAL. Otras tarjetas de sonido usan DirectSound(3D) indirectly via OpenAL. La mayoria de ordenadores pueden trabajar con OpenAL. A la web de Creative puedes encontrar la versión 'end user' redistribuible y con instalador.
¿Porque usar OpenAL i no, otras soluciones?
  • Facilidad de uso.
  • Multi Plataforma (Windows,Linux,MacOS)
  • Similar a la plataforma OpenGL.
  • Más libertad de uso y configuración que soluciones similares (FMOD...)
En conclusión, si usas OpenGL para gráficos tienes muchas ventajas para usar OpenAL si necesitas manejar sonidos en tu aplicación.

¿Qué necesito para empezar? Opcionalmente puedes descargar SDK para ejemplos en C. Ve con cuidado cuando instale SDK porque puede provocar interferencias con OpenAL. Reinstale soundblasterlive.

Escrito por Noeska.
Traducido por Gerard Turmo.
Corregido por ..............................

Última edición por dicatek fecha: 27-07-2006 a las 13:34:39.
Responder Con Cita
  #2  
Antiguo 27-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Lección1 Un sonido en una posición

LECCIÓN1
En este primer tutorial aprenderás a reproducir un único archivo de sonido usando OpenAL.
Primero ejecutamos Delphi e iniciamos una nueva aplicación (new aplication). A continuación, añadimos openal a la claúsula uses.

En la sección var, añadimos los siguientes valores:
Código Delphi [-]
buffer : TALuint;
source : TALuint;
sourcepos: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0 );
sourcevel: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0 );
listenerpos: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0);
listenervel: array [0..2] of TALfloat= ( 0.0, 0.0, 0.0);
listenerori: array [0..5] of TALfloat= ( 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
La variable buffer será utilizada para almacenar el sonido que vamos a reproducir. Las variables source(...) serán utilizadas para describir dónde y cómo será reproducido el sonido. Las variables listener(...) se usarán para describir dónde será oído el archivo en el espacio (3D). Ahora dejaremos el sonido, al centro del espacio (3D).

Antes que OpenAL sea activo para reproducir un sonido, es necesario, iniciarlo. Por lo tanto, el siguiente código debe de añadirse en los forms de tu aplicación en el evento oncreate.
Código Delphi [-]
var
argv: array of PalByte;
format: TALEnum;
size: TALSizei;
freq: TALSizei;
loop: TALInt;
data: TALVoid;
Primero debes inicializar la libreria OpenAL en tus forms en el evento oncreate.
Código Delphi [-]
InitOpenAL;
Después en el evento de los forms oncreate, debes inicializarlo como esto. Automáticamente escoge el mejor hardware de tu ordenador.
Código Delphi [-]
AlutInit(nil,argv);
A continuación, debes crear un buffer para almacenar el archivo de sonido .wav. Una vez el archivo .wav es cargado en el buffer, también se puede descargar para liberar memoria.
Código Delphi [-]
AlGenBuffers(1, @buffer);
AlutLoadWavFile(’ding.wav’, format, data, size, freq, loop);
AlBufferData(buffer, format, data, size, freq);
AlutUnloadWav(format, data, size, freq);
Si tu quieres sentir el sonido, tienes que decir dónde se encuentra del espacio (3D), cuál es su volumen, si tiene bucle...
Código Delphi [-]
AlGenSources(1, @source);
AlSourcei ( source, AL_BUFFER, buffer);
AlSourcef ( source, AL_PITCH, 1.0 );
AlSourcef ( source, AL_GAIN, 1.0 );
AlSourcefv ( source, AL_POSITION, @sourcepos);
AlSourcefv ( source, AL_VELOCITY, @sourcevel);
AlSourcei ( source, AL_LOOPING, loop);
Donde AL_PITCH puede hacer el sonido más agudo.
Con AL_GAIN puedes especificar que volumen tendrá el sonido reproducido.
El paso siguiente es especificar cuando se oirá el sonido. Esto puede hacerse cuando la camara lo localice o cuando el objeto represente al jugador.
Código Delphi [-]
AlListenerfv ( AL_POSITION, @listenerpos);
AlListenerfv ( AL_VELOCITY, @listenervel);
AlListenerfv ( AL_ORIENTATION, @listenerori);
En este momento, tu aplicación está a punto para empezar a reproducir algunos sonidos.
Añade al form de tu aplicación, un botón llamado Reproducir, y añade el siguiente código al evento onclick:
Código Delphi [-]
AlSourcePlay(source);
Repita dos veces el procedimiento anterior con dos botones llamados Detener y pausar y con su código respectivo, al evento onclick:
AlSourceStop(source); Para detener.
AlSourcePause(source); Para pausar.

Finalmente, antes de cerrar la aplicación y con el propósito de liberar memoria puedes meter el siguiente código al evento destroy, de tus forms:
Código Delphi [-]
AlDeleteBuffers(1, @buffer);
AlDeleteSources(1, @source);
AlutExit();
Ahora ya estas preparado para ejecutar tu primera aplicación OpenAL. Tan rápido como puedas, prueba tu programa pulsando en los botones: Reproducir, detener o pausar.
Si quieres reproducir tu sonido en bucle, basta con cambiar la siguiente línea de código.
De:
Código Delphi [-]
AlSourcei ( source, AL_LOOPING, loop );

A:
Código Delphi [-]
AlSourcei ( source, AL_LOOPING, AL_TRUE );
Prueba en cambiar los valores del pitch y la ganancia (GAIN) para comprobar qué ocurre. Prueba tambien de cambiar la posición (sourcepos) por otros valores.
Lección1

Escrito por Noeska.
Traducido por Gerard Turmo.
Corregido por ..............................

Última edición por dicatek fecha: 27-07-2006 a las 01:02:14.
Responder Con Cita
  #3  
Antiguo 27-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Lección2 Un sonido en movimiento

LECCIÓN2
Si la lección anterior te salió perfecto, puedes usarla como base, para la lección siguiente. Deberemos hacer algunos cambios para conseguir un sonido que se mueva en el espacio (3D).
Cuando el sonido se está moviendo debemos cambiar los valores de sourcevel a:
Código Delphi [-]
sourcevel: array [0..2] of TALfloat= ( 0.5, 0.0, 0.5);
Se mueve de izquierda a derecha y de adelante hacia atras.
El valor de sourcepos debe de ser cambiado:
Código Delphi [-]
sourcepos: array [0..2] of TALfloat= ( -5.0, 0.0, -5.0 );
It is placed left and front of you.
Para tener un sonido más interesante en ese aspecto, usaremos el siguiente, que lo podemos encontrar en el .Zip del final de la lección.

Código Delphi [-]
AlutLoadWavFile('footsteps.wav', format, data, size, freq, loop);

Si no pusimos el sonido anteriormente en bucle, debemos de hacerlo ahora:
Código Delphi [-]
AlSourcei ( source, AL_LOOPING, AL_TRUE);

Ahora debemos cambiar la posición del sonido cada cierto tiempo. Lo más facil, es usar un Timer dispuesto en el form. En el evento ontimer ponemos el siguiente código:
Código Delphi [-]
SourcePos[0] := SourcePos[0] + SourceVel[0];
SourcePos[1] := SourcePos[1] + SourceVel[1];
SourcePos[2] := SourcePos[2] + SourceVel[2];
If SourcePos[0] >= 5 then SourcePos[0]:=-5;
If SourcePos[2] >= 5 then SourcePos[2]:=-5;
alSourcefv(source, AL_POSITION, @SourcePos);
Cada segundo el sourcevel es añadido al sourcepos, y el nuevo sourcepos es mandado a OpenAL. Si el sourcepos llega a tu derecha, automáticamente vuelve a su posición inicial.
En el botón de reproducir, debemos añadir el siguiente código para poder activar el Timer:

Código Delphi [-]
Timer1.Enabled:=True;

En el botón de detención, también debemos añadir el siguiente código para anular el Timer.

Código Delphi [-]
Timer1.Enabled:=False;

Lección2
Escrito por Noeska.
Traducido por Gerard Turmo.
Corregido por ..............................
Responder Con Cita
  #4  
Antiguo 27-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Múltiples sonidos en movimiento

LECCIÓN3
Un sonido en movimiento no tiene demasiada complicación, pero ¿qué ocurre cuando tenemos varios sonidos en movimiento? Para realizar la siguiente lección, necesitaremos como base, el código hecho en la lección2.
El uso de sonidos múltiples no tiene la complicación que parece. En la unidad de la lección2 debemos añadir una sección de constantes (
Código Delphi [-]
const
) que contenga el siguiente codigo:

Código Delphi [-]
numbuffers = 3;
numsources = 3;
walk = 0;
ding = 1;
zap = 2;

Este código significa que tendremos tres buffers y tres sources. Tambien debemos dar nombres sencillos a dichos recursos.
La variable buffer y source necesitan ser modificados de la siguiente manera:

Código Delphi [-]
buffer : array [0..numbuffers] of TALuint;
source : array [0..numsources] of TALuint;

That gives you an array of buffers and an array of sources. Now every buffer has to be initialised in the oncreate event:

Código Delphi [-]
alGenBuffers(numbuffers, buffer);
alGenSources(numsources, source);


y cada sonido debe ser cargado:

Código Delphi [-]
AlutLoadWavFile(’footsteps.wav’, format, data, size, freq, loop);
AlBufferData(buffer[walk], format, data, size, freq);
AlutUnloadWav(format, data, size, freq);

AlutLoadWavFile(’ding.wav’, format, data, size, freq, loop);
AlBufferData(buffer[ding], format, data, size, freq);
AlutUnloadWav(format, data, size, freq);

AlutLoadWavFile(’phaser.wav’, format, data, size, freq, loop);
AlBufferData(buffer[zap], format, data, size, freq);
AlutUnloadWav(format, data, size, freq);


Tambien hemos de localizar cada source:

Código Delphi [-]
AlSourcei ( source[walk], AL_BUFFER, buffer[walk]);
AlSourcef ( source[walk], AL_PITCH, 1.0 );
AlSourcef ( source[walk], AL_GAIN, 1.0 );
AlSourcefv ( source[walk], AL_POSITION, @sourcepos);
AlSourcefv ( source[walk], AL_VELOCITY, @sourcevel);
AlSourcei ( source[walk], AL_LOOPING, AL_TRUE);


Debes añadir lo mismo para el sondidp "ding" y "zap".

Para reproducir un único sonido debemos de aplicar la siguiente función:

Código Delphi [-]
AlSourcePlay(source[walk]);
AlSourcePlay(source[ding]);
AlSourcePlay(source[zap]);


Lo mismo ocurre si queremos detener o pausar un sonido. Puedes crear botones para reproducir, pausar o detener cada sonido o bien crear un botón para reproducirlos todos a la vez.
The ontimer event also needs calls to multiple sources instead of one. You should have an idea on thow to change this.

Ahora todos los sonidos se mueven en la misma dirección y esto no es muy interesante. Change the ontimer event so that it only updates the walk source. In front of setting the source for ding and zap place something like this:

Código Delphi [-]
SourcePos[0] := 8.0;
SourcePos[1] := 1.0;
SourcePos[2] := -8.0;


You may also want to lower the gain (loudnes) of ding and zap to 0.2 The walk could use a boost to 1.5 . But you could place ding and zap further away to make them sound softer.
Lección3
Responder Con Cita
  #5  
Antiguo 27-07-2006
dicatek dicatek is offline
Miembro
 
Registrado: jun 2006
Posts: 46
Poder: 0
dicatek Va por buen camino
Compartiendo buffers

LECCIÓN4
Si tu quieres usar un sonido varias veces no es necesario cargarlo constantemente, basta con compartir el buffer usado.
Modifica el numsources a 4, pero deja el numbuffers a 3. Añade un nuevo nombre al nuevo source:

Código Delphi [-]
walk2 = 3;


En el evento oncreate necesitamos inicializar el nuevo source:

Código Delphi [-]
SourcePos[0] := -8.0;
SourcePos[1] := 0.0;
SourcePos[2] := -8.0;
AlSourcei ( source[walk2], AL_BUFFER, buffer[walk]);
AlSourcef ( source[walk2], AL_PITCH, 1.0 );
AlSourcef ( source[walk2], AL_GAIN, 0.2 );
AlSourcefv ( source[walk2], AL_POSITION, @sourcepos);
AlSourcefv ( source[walk2], AL_VELOCITY, @sourcevel);
AlSourcei ( source[walk2], AL_LOOPING, AL_TRUE);


You see instead of using buffer[walk2] we use buffer[walk] again. If you want you could use the same walk sound again and again.
For playing the new source it is easiest to create some new buttons for playing and stopping it.

If you feel up to it you really should change the way sourcepos and sourcevel are used. Instead of sharing it for all sounds you should give each source its own sourcepos and sourcevel.
Lección4
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Que usais para programar en php? chux HTML, Javascript y otros 22 18-08-2006 16:38:31
programar para windows CE ronalg Varios 8 31-08-2005 09:06:13
Programar para APPLE eduarcol Varios 0 27-02-2005 20:59:56
Programación Orientada a Aspectos marcoszorrilla Debates 17 06-04-2004 23:18:27
Programar para PDA Novás Varios 2 02-12-2003 15:06:30


La franja horaria es GMT +2. Ahora son las 05:05:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi