| 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] |
| ? |
|
|
|