El Guru Programador
Usuario DESCONOCIDO | Registrate Gratis | Usuarios Registrados
Foro de Visual Basic/VB.NET
Foros del Guru > Visual Basic/VB.NET
Usuario Sonidos...
delta24
19 Mensaje(s)
Enviado - 30/12/2004
?
Quesiera saber si hay alguna funcion, metodo,objeto o codigo, que me permitiera reproducir sonidos a diferentes frecuencias por las altavoces.

?
Scrishacker
47 Mensaje(s)
Enviado - 31/12/2004
?
Dejam ver bien si te entiendo... lo que buscas es algo que te permita reproducir algun sonido.. con cierto volumen, y con sierta tonalidad... como en qbasic que era... Sound x,x.----?

?
Scrishacker
47 Mensaje(s)
Enviado - 31/12/2004
?
OK... espero que te sirva este articulo...

En Visual Basic se definen variables de todo tipo, n?meros, letreros, arrays o vectores, estructuras que incluyen uno o varios de los tipos anteriores, etc. Pero estos son como nombres privados de Basic que no tienen existencia en un mundo m?s amplio, como el de Windows, de manera que resulta dif?cil pero indispensable conectar ambos mundos, cuando alguien quiera ampliar las propiedades de VBasic con las llamadas de Windows, como las API (Application Programming Interface).

Estas API son extraordinariamente sensitivas a la menor incorrecci?n o descortes?a y se cierran como la mimosa o el puercoesp?n. Las funciones y subrrutinas (las funciones devuelven un valor al ejecutarse, las subrrutinas no, s?lo hacen algo) a llamar en este orden para grabar se?al de sonido en memoria y recuperarla son:

waveInGetNumDevs Lib "winmm.dll" () As Long

waveInGetDevCaps Lib "winmm.dll" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As WAVEINCAPS, ByVal uSize As Long) As Long

waveInOpen Lib "winmm.dll" (lphWaveIn As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMAT, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long

waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long

waveInAddBuffer Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long

waveInStart Lib "winmm.dll" (ByVal hWaveIn As Long) As Long

waveInReset Lib "winmm.dll" (ByVal hWaveIn As Long) As Long

waveInStop Lib "winmm.dll" (ByVal hWaveIn As Long) As Long

waveInUnprepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long

waveInClose Lib "winmm.dll" (ByVal hWaveIn As Long) As Long

Y asimismo son necesarias algunas funciones para usar la memoria donde se guarda la se?al muestreada.

GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long

GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long

GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long

Y sobre todo, estas perlas que permiten conectar los dos mundos de los que habl?bamos

CopyStructFromPtr Lib "kernel32" Alias "RtlMoveMemory" (struct As Any, ByVal ptr As Long, ByVal cb As Long)

CopyPtrFromStruct Lib "kernel32" Alias "RtlMoveMemory" (ByVal ptr As Long, struct As Any, ByVal cb As Long)

Describ?moslas en cristiano:

WaveInGetNumDevs. Es la funci?n que accede a la informaci?n que tiene el sistema operativo ( o sea, Windows en nuestro caso) acerca de los dispositivos perif?ricos de audio operativos, y nos devuelve el n?mero de ellos que son capaces de soportar entrada de audio.

waveInGetDevCaps. Es una funci?n que accede a la informaci?n que el driver (o sea, ) de la tarjeta de sonido nos presta, y nos devuelve una estructura (variable mixta que incluye otras, sus campos, en su interior, digamos) de datos llamada WAVEINCAPS, en la que podemos encontrar informaci?n sobre el nombre, versi?n, capacidades, etc?tera, accediendo a sus campos.

waveInOpen. Una vez que tenemos informaci?n sobre la tarjeta de sonido, hemos de tratarla al m?s estilo UNIX, es decir, vamos a identificarla a partir de ahora con un manejador. ?Qu? es un manejador? En realidad, no es m?s que un n?mero con el que el sistema va a identificar a partir de ahora un descriptor de fichero abierto, es decir, un n?mero que identifica plenamente al dispositivo.


Por ejemplo, esta rutina

CopyStructFromPtr senales(indi).senal(0), inHdr(indi).lpData, longitud_muestreo_bytes

copia longitud_muestreo_bytes los bytes ocupados por el muestreo, en una estructura de se?ales, es decir, varias se?ales unidas e indexadas. La rutina pasa la posici?n de la se?al muestreada en el principio de una de las se?ales indexadas. El ?ndice permite disponer de dos buffer que se alternan, de modo que mientras el conversor muestrea, el programa puede procesar la se?al muestreada anteriormente.

Atenci?n: como los conversores suelen codificar la se?al en valores enteros positivos, puede ser necesario llevar esos valores a enteros con signo, es decir, restar a cada muestra la mitad del ?mbito. Para un byte, 8 bits, restar 128. Para 2, 16 bits, 32000 y pico.

Veamos una implementaci?n de estas rutinas con una interesant?sima cualidad: funciona.

'TIPO DE SENAL
'1. reservo memoria para muestrear

hMem = GlobalAlloc(&H42, longitud_muestreo_bytes) 'moveable
inHdr.lpData = GlobalLock(hMem)
inHdr.dwBufferLength = longitud_muestreo_bytes 'BUFFER_SIZE
'2. muestreo
rc = waveInOpen(hWaveIn, DEVICEID, formato_senal, 0, 0, 0)
rc = waveInPrepareHeader(hWaveIn, inHdr, Len(inHdr)
rc = waveInAddBuffer(hWaveIn, inHdr, Len(inHdr))
rc = waveInStart(hWaveIn)
'=====================================================================
'3. llevo a array para procesa

'BUFFER de BYTES de 0 a 255, cero en 128
CopyStructFromPtr senal(0), inHdr.lpData, longitud_muestreo_bytes
' la se?al en un buffer para su procesado.

Ok.... esto es lo basico... pero si te interesa mas sobre sonido... y ver como funcionan diferentes cosas como reconocimiento de voz... o cosillas asi...

visita la siguiente pagina:
http://www.uam.es/personal_pdi/filoyletras/jsango/Conversaciones%20con%20Enrique.htm

[email protected]
?
?

?

Contactos myStudio Network
?