From 0de4e549d58fd11ec662b40a9d776a536d1b2b0d Mon Sep 17 00:00:00 2001 From: Jan-Henrik Bruhn Date: Mon, 11 May 2020 13:15:56 +0200 Subject: [PATCH] Fix onepole filter bug in processor resulting in wrong CV values --- stereo_mix/processor.cc | 10 +++++----- stereo_mix/stereo_mix.cc | 26 ++++++++++++-------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/stereo_mix/processor.cc b/stereo_mix/processor.cc index 4be6cb4..d534a56 100644 --- a/stereo_mix/processor.cc +++ b/stereo_mix/processor.cc @@ -13,8 +13,8 @@ void Processor::Process(int16_t cvs[], uint16_t* outs) uint32_t value_r; // dirty low pass - this->cv_input_pan = ((cvs[0] - this->cv_input_pan) >> 3); - this->cv_input_vol = ((cvs[1] - this->cv_input_vol) >> 3); + this->cv_input_pan += ((cvs[0] - this->cv_input_pan) >> 4); + this->cv_input_vol += ((cvs[1] - this->cv_input_vol) >> 5); uint16_t pan_pot = (pan_offset + 32767L); uint16_t vol_pot = (vol_offset); @@ -35,7 +35,7 @@ void Processor::Process(int16_t cvs[], uint16_t* outs) uint16_t vol_cv_absu16 = abs(vol_cv) << 1; 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); - uint32_t vol_cv_pre = (Mix(static_cast(vol_cv_exp >> 1), vol_cv_log >> 1, log_exp_mix_cv) << 3) * 3; + uint32_t vol_cv_pre = (Mix(static_cast(vol_cv_exp >> 1), vol_cv_log >> 1, log_exp_mix_cv) << 1) * 2; vol += vol_cv > 0 ? vol_cv_pre : -vol_cv_pre; vol *= !mute; @@ -43,9 +43,9 @@ void Processor::Process(int16_t cvs[], uint16_t* outs) this->previous_vol = vol; - int32_t pan_cv = (cv_input_pan * static_cast(pan_att)) >> 15; // full attenuate gives 3x amplification :) + int32_t pan_cv = (cv_input_pan * static_cast(pan_att)) >> 15; // full attenuate gives 2x amplification :) pan_cv = Clip16(pan_cv); - int32_t pan = pan_pot + ((pan_cv << 3) * 4); + int32_t pan = pan_pot + ((pan_cv) * 2); pan = ClipU16(pan); value_l = (lut_left_sin_pan[pan >> 4] * vol) >> 16; diff --git a/stereo_mix/stereo_mix.cc b/stereo_mix/stereo_mix.cc index c84e995..d58862e 100644 --- a/stereo_mix/stereo_mix.cc +++ b/stereo_mix/stereo_mix.cc @@ -110,11 +110,11 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) { if (htim == &htim3) { - leds.Write(); + leds.Write(); // 53571 Hz return; } if (htim == &htim6) { - WriteOutputs(); + WriteOutputs(); // 4076 Hz } } } @@ -133,7 +133,7 @@ void Init(void) HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); - htim3.Init.Prescaler = 10; + htim3.Init.Prescaler = 8; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 128; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; @@ -143,9 +143,9 @@ void Init(void) HAL_NVIC_SetPriority(TIM6_IRQn, 1, 0); HAL_NVIC_EnableIRQ(TIM6_IRQn); - htim6.Init.Prescaler = 64; + htim6.Init.Prescaler = 47; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; - htim6.Init.Period = 96; // 512 without optimize + htim6.Init.Period = 256; // 96 without optimize htim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim6.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&htim6); @@ -154,23 +154,20 @@ void Init(void) system_clock.Init(); } +uint16_t out[kNumChannels][2]; + void WriteOutputs(void) { - uint16_t out[kNumChannels][2]; - DEBUG_ON + for (int i = 0; i < kNumChannels; i++) { + dacs.Write16(i, 0, out[i][0]); + dacs.Write16(i, 1, out[i][1]); + } for (int i = 0; i < kNumChannels; i++) { int16_t cvs[2]; cvs[0] = 65535 - adc.cv_value(AdcChannel(ADC_CHANNEL_PAN_1 + i)); cvs[1] = adc.cv_value(AdcChannel(ADC_CHANNEL_VOL_1 + i)); processors[i].Process(cvs, out[i]); } - for (int i = 0; i < kNumChannels; i++) { - dacs.Write16(i, 0, out[i][0]); - //dacs.Write16(0, out[i][0]); - dacs.Write16(i, 1, out[i][1]); - //dacs[i + 4].Write16(1, out[i][1]); - } - DEBUG_OFF } int main(void) @@ -179,6 +176,7 @@ int main(void) SystemClock_Config(); Init(); + ui.Init(); while (true) { ui.DoEvents();