Perfecto Oscar,
mil gracias.
Oye, otra pregunta: en una onda sine, los valores oscilan entre -1 y 1. La
frecuencia da la "altura" del tono, Pero un sample singulo que es al final?
Es la amplituda? Osea un número 0.98 es más duro que 0.2? O como hay que
entender eso.
Te mando el archivo en el estado actual, le estaba haciendo mil
experimentos y muchas cosas ya no tienen sentido ni están con comentarios
jejeje
para compilar:
gcc -lasound -lm -lbsd sine.c -o mywave
2015-04-03 11:55 GMT-05:00 Oscar Fernando Moreno <[email protected]>:
> Sí, sonidos complejos como instrumentos superpuestos, sintes y efectos
> también son números de números entre -1 y 1.
>
> Los números mayores a 1 (y menores a -1), van a causar distorsión. yo no
> creo que dañe la tarjeta pero si puede dañar los parlantes, ya que la señal
> eléctrica que saldría con estos valores buscaría llevar la membrana de los
> parlantes más allá de su amplitud máxima.
>
> hay que tener cuidado cuando se suman dos generadores de señal de audio
> para que el resultado no vaya a salirse de valores entre -1 y 1.
>
> podrías mandar el programa para pillarlo? (aunque no se C, ps para conocer
> almenos :p )
>
> *Oscar Fernando Moreno R.*
> *Estudiante Informática musical - ITM*
>
> *INGBIO - UNALMED*
>
> 2015-04-03 11:34 GMT-05:00 Fabio Barone <[email protected]>:
>
>> Estaba mirando algo super simple. Me perdonen expresiones en inglés que
>> no se como son en español.
>>
>> Me bajé un programa en C que llena un buffer con valores de una sine wave
>> y lo manda a la tarjeta de sonido. Se escucha una onda sine básica.
>>
>> Ahí me puse a experimentar, y lo primero que se me ocurrió es llenar el
>> buffer con valores random entre 0 y 1. Resultado: como un ruido "blanco"
>> (white noise)
>>
>> La pregunta:
>> Los sonidos más complejos que escuchamos, cómo por ejemplo un synth
>> ritimico con una textura compleja, con reverberación y todo lo que uno se
>> puede imaginar....al final siempre también equivalen a un numero float que
>> se manda como un sample específico a la tarjeta de sonido cierto? Y siempre
>> es entre -1 y 1 o que? (Ahí si no quise experimentar mandando un valor > 1,
>> no quiero dañar la tarjeta jaja)
>>
>> Gracias
>>
>> _______________________________________________
>> unloquer mailing list
>> [email protected]
>> https://lists.aktivix.org/mailman/listinfo/unloquer
>>
>>
>
> _______________________________________________
> unloquer mailing list
> [email protected]
> https://lists.aktivix.org/mailman/listinfo/unloquer
>
>
#include <alsa/asoundlib.h>
#include <alsa/pcm.h>
#include <math.h>
#define BUFFER_LEN 48000
#define ARC4RANDOM_MAX 0x100000000
static char *device = "default"; //soundcard
snd_output_t *output = NULL;
float buffer [BUFFER_LEN];
int main(void)
{
int err;
int j,k;
int f = 440; //frequency
int fs = 48000; //sampling frequency
snd_pcm_t *handle;
snd_pcm_sframes_t frames;
// ERROR HANDLING
if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
if ((err = snd_pcm_set_params(handle,
SND_PCM_FORMAT_FLOAT,
SND_PCM_ACCESS_RW_INTERLEAVED,
1,
48000,
1,
500000)) < 0) {
printf("Playback open error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}
// SINE WAVE
printf("Sine tone at %dHz ",f);
float maxval = 0;
double cnt = 0;
double val = 0;
double MAX_AMP = 0.98;
double FACTOR_INC = 0.03;
int INTERVAL = 15000;
int ok_cnt = 0;
int interval_cnt = 0;
int silence_interval = 15000;
for (k=0; k<BUFFER_LEN; k++){
if (cnt > 0) {
ok_cnt = 0;
val = 0;
cnt++;
if (cnt == INTERVAL -1) {
printf("### END INTERVAL ###\n");
}
} else {
if (ok_cnt == 0) {
printf("### START INTERVAL ###\n");
ok_cnt++;
}
val = (sin(2*M_PI*f/fs*k));
val = fabs(val);
if (val > MAX_AMP) {
val = MAX_AMP;
MAX_AMP = MAX_AMP - FACTOR_INC;
if (MAX_AMP < -1) {
MAX_AMP = 0.98;
}
}
}
if (k%INTERVAL == 0 && k > 0) {
if (cnt > INTERVAL) {
cnt = 0;
} else {
cnt++;
}
}
if ( val != 0 ) {
printf("Val: %f\n", val);
}
buffer[k] = val;
/*buffer[k] = (sin(2*M_PI*f/fs*k)); //sine wave value generation
}
buffer[k] = (cos(2*M_PI*f/fs*k)); //sine wave value generation
if (maxval < buffer[k]) {
maxval = buffer[k];
*/
/*printf("%f\n" , buffer[k]);*/
}
printf("Maxval: %f\n", maxval);
for (j=0; j<5; j++){
frames = snd_pcm_writei(handle, buffer, BUFFER_LEN); //sending values to sound driver
}
snd_pcm_close(handle);
return 0;
}
_______________________________________________
unloquer mailing list
[email protected]
https://lists.aktivix.org/mailman/listinfo/unloquer