47 lines
1.1 KiB
C++
47 lines
1.1 KiB
C++
#include "decimator.h"
|
|
|
|
using namespace daisysp;
|
|
|
|
void Decimator::Init()
|
|
{
|
|
downsample_factor_ = 1.0f;
|
|
bitcrush_factor_ = 0.0f;
|
|
downsampled_ = 0.0f;
|
|
bitcrushed_ = 0.0f;
|
|
inc_ = 0;
|
|
threshold_ = 0;
|
|
smooth_crushing_ = false;
|
|
bit_overflow_ = 1.0f;
|
|
}
|
|
|
|
float Decimator::Process(float input)
|
|
{
|
|
int32_t temp;
|
|
//downsample
|
|
threshold_ = (uint32_t)((downsample_factor_ * downsample_factor_) * 96.0f);
|
|
inc_ += 1;
|
|
if(inc_ > threshold_)
|
|
{
|
|
inc_ = 0;
|
|
downsampled_ = input;
|
|
}
|
|
|
|
//bitcrush
|
|
if(smooth_crushing_)
|
|
{
|
|
temp = (int32_t)(downsampled_ * 65536.0f * bit_overflow_);
|
|
temp >>= bits_to_crush_ + 1; // shift off
|
|
temp <<= bits_to_crush_ + 1; // move back with zeros
|
|
bitcrushed_ = (float)temp / (65536.0f * bit_overflow_);
|
|
}
|
|
else
|
|
{
|
|
temp = (int32_t)(downsampled_ * 65536.0f);
|
|
temp >>= bits_to_crush_; // shift off
|
|
temp <<= bits_to_crush_; // move back with zeros
|
|
bitcrushed_ = (float)temp / 65536.0f;
|
|
}
|
|
|
|
return bitcrushed_;
|
|
}
|