Delphi - Conversion de 8 bits a 16 bits.

 
Vista:

Conversion de 8 bits a 16 bits.

Publicado por fafilberg (11 intervenciones) el 23/08/2005 13:30:21
Hola, estoy haciendo un programa para composicion musical que trabaja con .wav's.
Necesito alguna forma de poder convertir un valor de 8 bits a 16, 24 bits o lo que uno quiera.
Los archivos .wav tienen una cabecera y a partir de la posicion 44, los datos en si del sonido (samples). Para leer estos datos hay que conocer el formato del archivo lo cual viene definido en la cabecera, una vez conocido esto sabremos si es 8, 16, ... bits o 1, 2, ... canales.
Como esto no es fijo, necesito alguna funcion o formula para convertir dinamicamente, ya que el origen puede ser 24 bits y el destino 8 bits o podria ser 32 bits y el destino 24 bits y asi etc., por lo tanto no puedo hacer una funcion por cada posibilidad como ser:

1) convertir_8b_1ch_a_16b_1ch
2) convertir_8b_1ch_a_24b_1ch
3) convertir_8b_1ch_a_32b_1ch
...
no es practico cubrir todas las posibilidades de esta forma, por eso que necesito saber como llevar un dato de origen que puede ser BYTE, WORD o DWORD a otro de destino que puede ser tambien BYTE, WORD o DWORD.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Conversion de 8 bits a 16 bits.

Publicado por Cuervo (263 intervenciones) el 23/08/2005 19:09:52
gracias por definir una cabezera .wav en este foro.......http://www.sonicspot.com/guide/wavefiles.html#wavefileheader/

en este enlace: http://www.programmersheaven.com/zone2/cat425/ hay mucho codigo escrito para este tipo de archivos. talvez encuentres algo que te ayude.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Conversion de 8 bits a 16 bits.

Publicado por fafilberg (11 intervenciones) el 24/08/2005 01:40:09
Ya lo habia revisado a la pagina de programmersheaven y lo que hay es standar, trabajan con formatos standars y no es muy maleable.

"gracias por definir una cabezera .wav en este foro.......http://www.sonicspot.com/guide/wavefiles.html#wavefileheader/ "

que queres decir con esto ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Conversion de 8 bits a 16 bits.

Publicado por Mat (1 intervención) el 25/08/2005 17:34:47
" gracias por definir una cabezera .wav en este foro.......http://www.sonicspot.com/guide/wavefiles.html#wavefileheader/

que queres decir con esto ? "

Lo que quiso es ser ironico, se ve que el pibe la tiene re-clara y se las sabe a todas, la tiene tan clara que por eso te envia a otra pagina.

En fin, vamos a lo que realmente te importa, para convertir waveforms simplemente tenes que usar los operadores shift left o shift right, en C++ es >> y << y en Delphi es SHR y SHL. Simplemente moves la cantidad de bits necesarios hacia la derecha o izquierda, dependiendo de si se disminuye la resolucion o se amplia. Si queres llevar de una cifra a otra cifra menor, usas shift right, sino usas shift left.
Tenes que tener en cuenta que las waveforms pueden tener un valor positivo y otro negativo, esto es lo que ves cuando se dibuja una waveforma por ej. en el Cool Edit, las que estan por debajo de la linea central son valores negativos y los que estan por arriba son positivo.
El tema esta en que la muestra se toma con valores con signo y se guarda con valores sin signo, entonces el valor de la muestra en 8 bits comprende desde
-128 hasta 127 pero se guarda sin signo, cambiando el rango desde 0 a 255, esto se hace obviamente ya que no se puede especificar el signo menos en un byte. Por consiguiente un valor de -128 en una muestra se guardara como 0 en un archivo y un valor de 127 en una muestra se guardara como 255 en una archivo.
En 8 bits, el 0 es el valor 128, de 129 a 255 es la parte positiva de la waveform, de 127 a 0 es la parte negativa.
En el caso de 16 bits el rango de las muestras va desde -32768 a 32767 guardandose como UNSIGNED, siendo de 0 a 32767 la parte positiva y de 65535 a 32768 la parte negativa (65535 = -1, 65534 = -2, ...)
En 24 bits igual y asi por cada resolucion de bits.
Tene en cuenta que en el caso de 8 bits el cero seria 128, y a partir de 127 hacia 0 comienza la parte negativa siendo -1 el 127, pero en el caso de 16 bits (o mas) el 0 no es 32768, sino que el 0 es 0 y el -1 empezaria en 65535 (en caso de que sean 16 bits).
Para muestrear un sonido se debe especificar la resolucion y la cantidad de muestras pore segundo que se tomaran, entonces un waveform de 16 bits y 44100 Hz indica 44100 muestras por segundo y que cada muestra podra registrar 65536 valores diferentes, estos valores en definitiva son diferentes voltajes que pueden ser registrados.

Espero te haya servido, aunque como profesor soy de terror.
Cualquier cosa ahi tenes mi mial.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Conversion de 8 bits a 16 bits.

Publicado por fafilberg (11 intervenciones) el 25/08/2005 19:17:21
No te puedo decir otra cosa mas que muchas gracias.
Yo no se si sos buen profesor o no, pero si veo que la tenes totalmente clara con este tema.
Ya hice la funcion con tu explicacion, ahora la pruebo y te escribo para contarte.

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

me tocaron el nervio

Publicado por Cuervo (263 intervenciones) el 26/08/2005 19:48:54
// supongo que habrá foros de discusion para medir la capacidad intelectual de cada miembro. pero bueno: entre numeros negativos y posittivos, rangos, muestras por segundo:

// definicion de un archivo .wav

// extructura wav en C
typedef unsigned long dword;
typedef unsigned short word;
struct TWAVHeader */
{
char rID;
dword rLen;
char wID;
char fID;
dword fLen;
word FmtTag;
word Channels;
dword SampleRate;
dword AvgBytesPerSec;
word BlockAlign;
word BitsPerSample;
char dID;
dword dLen;
};

TWavHeader = record
id_metodo : longint;
rLen : longint;
wavId : longint;
fmt_data : longint;
fLen : longint;
nLongitudSampleo:longint;
xBytesPorSegundo:longint;
eFormato : word;

wCanales : word;
BitsPorSampleo : longint;
nSampleosPorSegundo : longint;
BlockAlign : word;
DataId : longint;

var
ArchivoWav : file of TWavHeader;
Cabecera : TWavHeader;

begin

// traduccion de la extructura a pascal
with cabecera do
begin
Id_metodo := $46464952; // string = "RIFF"
rLen:= 36; //ver enlace
wavId:= $45564157; //contiene la cadena "WAVE"
dataId := $61746164; // "DATA" : ver enlace
fmt_data:= $20746d66; // "fmt"+"data": ver enlace
fLen:= 16; //
eFormato := 1; // tipo comprimido PCM
wCanales:= 2; // canales 2:estereo, 1:mono
nSampleosPorSegundo := rate; //8000..44100, etc.
xBytesPorSegundo:= 2 * rate * (resolucion div 8); //en C: SampleRate * canales * BitsPerSample / 8
BlockAlign := 2 * (resolucion div 8); // en:C canales * wBitsPerSample / 8
BitsPorSampleo := resolucion; //8,16,etc
nLongitudSampleo:= 0;
end; //with begin
...
entonces


para fafilberg :
esta es la interpretacion de la estructura de un wav, en este enlace tienes las opciones para posicionar el puntero.header
no olvides tWAVE(wav.pas) en ella podras encontrar todo calculos, la interpretacion de la cabecera mas extendida.
o unico que tines que hacer asignar un archivo leerlo desde un tstream por ejemplo. y bajarlo al discoduro, se entiende? ademas hay cientos de lineas de codigo,gratis, de como interpretar estos.

no necesito demostrarle nada a nadie. ademas de tenerla re-clara, soy re-pillo.
posteo como me salga de la poll$@%. como quiero y cuando quiero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:me tocaron el nervio

Publicado por fafilberg (11 intervenciones) el 27/08/2005 02:43:55
Gracias por la info, pero esto:

"no necesito demostrarle nada a nadie. ademas de tenerla re-clara, soy re-pillo.
posteo como me salga de la poll$@%. como quiero y cuando quiero. "

tal vez no deberias decirmelo a mi.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:me tocaron el nervio

Publicado por Seba (1 intervención) el 27/08/2005 17:24:51
"... no necesito demostrarle nada a nadie. ademas de tenerla re-clara, soy re-pillo posteo como me salga de la poll$@%. como quiero y cuando quiero. "

En algo no estoy de acuerdo con lo que dijo este gallego y es que no es decision de el haber hablado asi, es su unica opcion ya que desconoce lo que es educacion.

Fafilberg, lo que te dijo el galleguito no tiene nada que ver, ya que vos no preguntas como es la cabecera de un wav, sino como convertir de un formato a otro asi que te paso un dato interesante, hay un programa que es open source, se llama modplugtracker y de ahi podes sacar toda la ayuda que necesites.
Esta hecho en Visual C pero es entendible.

SLAligator.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar