sint-gauntlet/daisysp/Effects/decimator.cpp
2026-04-24 14:46:05 +02:00

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_;
}