sine wave

This commit is contained in:
corey 2024-05-15 07:36:04 -05:00
parent 8649141cbb
commit a586af8b5c
2 changed files with 38 additions and 19 deletions

53
audio.c
View File

@ -70,24 +70,6 @@ void aud_rnd(Audio*aud,size_t mode)
}
}
/*******
* Triangle waveform generator
*******/
void aud_tri(Audio*aud,double freq,size_t mode)
{
if(!aud->data||!aud->nsamples||!aud->samplerate||!aud->channels)return;
for(size_t i=0;i<aud->nsamples;++i)
{
/* for(size_t ch=0;ch<aud->channels;++ch,++i) */
//aud->data[i]=sin(i);
uint16_t sample=(i%(int)(aud->samplerate/freq))*7;
if(mode==GEN)
aud->data[i]=sample;
else if(mode==ADD)
aud->data[i]=(aud->data[i]+sample)/2;
}
}
/*******
* Zero all data
*******/
@ -110,3 +92,38 @@ void aud_env(Audio*aud)
for(size_t i=0;i<aud->nsamples/8;++i)
aud->data[aud->nsamples-1-i]*=(float)i/range;
}
/*******
* Sine waveform generator
*******/
void aud_sine(Audio*aud,double freq,size_t mode)
{
if(!aud->data||!aud->nsamples||!aud->samplerate||!aud->channels)return;
for(size_t i=0;i<aud->nsamples;++i)
{
/* for(size_t ch=0;ch<aud->channels;++ch,++i) */
uint16_t sample=sin((2*PI)/(aud->samplerate/freq)*i)*8000;
if(mode==GEN)
aud->data[i]=sample;
else if(mode==ADD)
aud->data[i]=(aud->data[i]+sample)/2;
}
}
/*******
* Triangle waveform generator
*******/
void aud_tri(Audio*aud,double freq,size_t mode)
{
if(!aud->data||!aud->nsamples||!aud->samplerate||!aud->channels)return;
for(size_t i=0;i<aud->nsamples;++i)
{
/* for(size_t ch=0;ch<aud->channels;++ch,++i) */
//aud->data[i]=sin(i);
uint16_t sample=(i%(int)(aud->samplerate/freq))*7;
if(mode==GEN)
aud->data[i]=sample;
else if(mode==ADD)
aud->data[i]=(aud->data[i]+sample)/2;
}
}

View File

@ -24,6 +24,7 @@ Audio aud_new(size_t samplerate,size_t nsamples,size_t channels);
void aud_free(Audio*aud);
// Audio data manipulation
#define PI 3.141592653589793
#define SEMITONE_CONSTANT 1.0594630943592953 // pow(2,1/12.0)
#define raisesemitone(freq,nsemitones) ((freq)*pow(SEMITONE_CONSTANT,(nsemitones)))
@ -35,7 +36,8 @@ void aud_free(Audio*aud);
enum{GEN,ADD};
void aud_avg(Audio*aud,size_t blocksize);
void aud_env(Audio*aud);
void aud_rnd(Audio*aud,size_t mode);
void aud_sine(Audio*aud,double freq,size_t mode);
void aud_tri(Audio*aud,double freq,size_t mode);
void aud_zero(Audio*aud);
void aud_env(Audio*aud);