mr4th/src/audio_gen.c

103 lines
2.2 KiB
C

////////////////////////////////
// NOTE(allen): Audio Generation Decibel Math
function F32
audgen_mul_from_decibel(F32 db){
F32 div_db = db/10.f;
F32 exp_db = pow_F32(10.f, div_db);
return(exp_db);
}
////////////////////////////////
// NOTE(allen): Audio Generation Rate
function AUDGEN_Rate
audgen_rate(F32 sample_per_second){
AUDGEN_Rate result = {0};
result.sample_per_second = sample_per_second;
result.delta_t = 1.f/sample_per_second;
return(result);
}
function U64
audgen_i_from_t(F32 sample_per_second, F32 t){
U64 result = (U64)(sample_per_second*t);
return(result);
}
////////////////////////////////
// NOTE(allen): Audio Generation Basic Arithmetic
function void
audgen_add_in_place(F32 *dst, F32 *src, U64 sample_count){
F32 *dptr = dst;
F32 *sptr = src;
F32 *opl = src + sample_count;
for (; sptr < opl; sptr += 1, dptr += 1){
*dptr += *sptr;
}
}
function void
audgen_scalar_mul_in_place(F32 scalar, F32 *dst, U64 sample_count){
F32 *ptr = dst;
F32 *opl = dst + sample_count;
for (; ptr < opl; ptr += 1){
*ptr = scalar*(*ptr);
}
}
////////////////////////////////
// NOTE(allen): Audio Generation Filters
function void
audgen_low_pass_in_place(F32 alpha, F32 *dst, U64 sample_count){
// TODO(allen): low-level optimization
// low pass: Y = (1 - alpha)*[-1]Y + alpha*X
F32 *ptr = dst;
F32 *opl = dst + sample_count;
if (ptr < opl){
F32 n_alpha = 1.f - alpha;
F32 v = alpha*(*ptr);
*ptr = v;
for (; ptr < opl; ptr += 1){
v = alpha*(*ptr) + n_alpha*v;
*ptr = v;
}
}
}
function void
audgen_high_pass_in_place(F32 alpha, F32 *dst, U64 sample_count){
// TODO(allen): low-level optimization
// high pass: Y = alpha*([-1]Y + X - [-1]X)
F32 *ptr = dst;
F32 *opl = ptr + sample_count;
if (ptr < opl){
F32 d = 0;
ptr += 1;
for (; ptr < opl; ptr += 1){
F32 x = *ptr;
F32 y = alpha*(d + x);
*ptr = y;
d = y - x;
}
}
}
function F32
audgen_low_pass_alpha(F32 delta_t, F32 freq){
F32 rc = 1.f/(tau_F32*freq);
F32 alpha = delta_t/(delta_t + rc);
return(alpha);
}
function F32
audgen_high_pass_alpha(F32 delta_t, F32 freq){
F32 rc = 1.f/(tau_F32*freq);
F32 alpha = rc/(rc + delta_t);
return(alpha);
}