2020-04-26 14:48:47 +00:00
|
|
|
#include "processor.h"
|
|
|
|
#include "stmlib/stmlib.h"
|
2020-05-10 12:54:25 +00:00
|
|
|
#include "stmlib/dsp/dsp.h"
|
2020-04-28 20:07:34 +00:00
|
|
|
#include "stmlib/utils/dsp.h"
|
2020-04-26 14:48:47 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
using namespace stereo_mix;
|
2020-04-28 20:07:34 +00:00
|
|
|
using namespace stmlib;
|
2020-04-26 14:48:47 +00:00
|
|
|
|
|
|
|
void Processor::Process(int16_t cvs[], uint16_t* outs)
|
|
|
|
{
|
|
|
|
uint32_t value_l;
|
|
|
|
uint32_t value_r;
|
|
|
|
|
2020-05-09 16:06:44 +00:00
|
|
|
uint16_t pan_pot = (pan_offset + 32767L);
|
2020-05-10 12:54:25 +00:00
|
|
|
uint16_t vol_pot = (vol_offset);
|
|
|
|
int32_t pan_cv = (cvs[0] * static_cast<int32_t>(pan_att)) >> 15; // full attenuate gives 3x amplification :)
|
|
|
|
int32_t vol_cv = (cvs[1] * static_cast<int32_t>(vol_att)) >> 15;
|
|
|
|
pan_cv = Clip16(pan_cv);
|
|
|
|
vol_cv = Clip16(vol_cv);
|
|
|
|
|
2020-04-28 20:51:36 +00:00
|
|
|
|
|
|
|
// calculate value for ui
|
2020-05-10 12:54:25 +00:00
|
|
|
int32_t lin = vol_offset + vol_cv * 3;
|
|
|
|
lin = ClipU16(lin);
|
2020-04-28 20:07:34 +00:00
|
|
|
lin *= !mute;
|
2020-05-09 16:06:44 +00:00
|
|
|
this->linear_vol = lin;
|
2020-04-26 14:48:47 +00:00
|
|
|
|
2020-05-09 16:06:44 +00:00
|
|
|
uint16_t vol_pot_exp = Interpolate124(lut_linear_to_exp, vol_pot);
|
|
|
|
uint16_t vol_pot_log = 65535 - InverseInterpolate124(lut_linear_to_exp, vol_pot);
|
2020-04-26 14:48:47 +00:00
|
|
|
|
2020-04-28 20:07:34 +00:00
|
|
|
vol_pot = Mix(vol_pot_exp, vol_pot_log, log_exp_mix_pot);
|
2020-04-28 20:51:36 +00:00
|
|
|
int32_t vol = vol_pot;
|
2020-04-26 14:48:47 +00:00
|
|
|
|
2020-05-10 12:54:25 +00:00
|
|
|
uint16_t vol_cv_absu16 = abs(vol_cv) << 1;
|
2020-05-09 16:06:44 +00:00
|
|
|
uint16_t vol_cv_exp = Interpolate124(lut_linear_to_exp, vol_cv_absu16);
|
|
|
|
uint16_t vol_cv_log = 65535 - InverseInterpolate124(lut_linear_to_exp, vol_cv_absu16);
|
2020-05-10 12:54:25 +00:00
|
|
|
uint32_t vol_cv_pre = Mix(vol_cv_exp, vol_cv_log, log_exp_mix_cv) * 3;
|
2020-04-28 20:07:34 +00:00
|
|
|
vol += vol_cv > 0 ? vol_cv_pre : -vol_cv_pre;
|
|
|
|
vol *= !mute;
|
|
|
|
|
2020-05-10 12:54:25 +00:00
|
|
|
vol = ClipU16(vol);
|
2020-04-26 14:48:47 +00:00
|
|
|
|
2020-05-09 16:06:44 +00:00
|
|
|
this->previous_vol = vol;
|
2020-04-26 14:48:47 +00:00
|
|
|
|
2020-05-10 12:54:25 +00:00
|
|
|
int32_t pan = pan_pot + (pan_cv * 3);
|
|
|
|
pan = ClipU16(pan);
|
|
|
|
|
2020-05-09 16:06:44 +00:00
|
|
|
value_l = (Interpolate124(lut_left_sin_pan, pan) * vol) >> 16;
|
|
|
|
value_r = (Interpolate124(lut_right_cos_pan, pan) * vol) >> 16;
|
2020-04-26 14:48:47 +00:00
|
|
|
|
|
|
|
outs[0] = value_r;
|
|
|
|
outs[1] = value_l;
|
|
|
|
}
|