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

Responder a