ref: 42bc0e304eef602cd288728a1dbe0b98694f5681
dir: /modules/bitcrush.c/
/* This code is placed in the public domain. */ #include <stdlib.h> #include <math.h> #include "soundpipe.h" int sp_bitcrush_create(sp_bitcrush **p) { *p = malloc(sizeof(sp_bitcrush)); return SP_OK; } int sp_bitcrush_destroy(sp_bitcrush **p) { free(*p); return SP_OK; } int sp_bitcrush_init(sp_data *sp, sp_bitcrush *p) { p->bitdepth = 8; p->srate = 10000; p->incr = 1000; p->sample_index = 0; p->index = 0.0; p->value = 0.0; return SP_OK; } int sp_bitcrush_compute(sp_data *sp, sp_bitcrush *p, SPFLOAT *in, SPFLOAT *out) { SPFLOAT bits = pow(2, floor(p->bitdepth)); SPFLOAT foldamt = sp->sr / p->srate; SPFLOAT sig; *out = *in * 65536.0; *out += 32768; *out *= (bits / 65536.0); *out = floor(*out); *out = *out * (65536.0 / bits) - 32768; sig = *out; p->incr = foldamt; /* apply downsampling */ if (p->index < (SPFLOAT)p->sample_index) { p->index += p->incr; p->value = sig; } *out = p->value; p->sample_index++; *out /= 65536.0; return SP_OK; }