103 lines
2.2 KiB
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);
|
|
}
|