Fixes in processing and attenuverter operation

This commit is contained in:
Jan-Henrik 2020-05-11 01:08:50 +02:00
parent 6d54dc0a7b
commit 76175accf3
6 changed files with 90 additions and 82 deletions

View file

@ -1,10 +1,12 @@
#pragma once #pragma once
#include "../resources.h" #include "../resources.h"
#include "stmlib/utils/dsp.h"
#include "stm32f0xx_hal_gpio.h" #include "stm32f0xx_hal_gpio.h"
#include <stm32f0xx_hal.h> #include <stm32f0xx_hal.h>
using namespace stereo_mix; using namespace stereo_mix;
using namespace stmlib;
const uint8_t kNumChannels = 4; const uint8_t kNumChannels = 4;
@ -31,10 +33,6 @@ class Leds {
} }
void Write() void Write()
{ {
pwm_counter++;
pwm_counter &= 0x1ff; // equals to if(pwm_counter > 512) pwm_counter = 0;
blink_counter++;
if(blink_counter > 0x2000) blink_counter = 0;
#ifdef DEBUG_PIN #ifdef DEBUG_PIN
for (size_t i = 0; i < kNumChannels - 1; i++) { for (size_t i = 0; i < kNumChannels - 1; i++) {
#else #else
@ -42,17 +40,23 @@ class Leds {
#endif #endif
bool in_blink_phase = blink_counter > (0x2000 / 2) || !blinking[i]; bool in_blink_phase = blink_counter > (0x2000 / 2) || !blinking[i];
if (intensities[0] && lut_led_gamma[intensities[i]] >= pwm_counter && in_blink_phase) { if (intensities[i] && lut_led_gamma[intensities[i] >> 8] >= pwm_counter && in_blink_phase) {
kGpioPorts[i]->BSRR |= kGpioPins[i]; kGpioPorts[i]->BSRR |= kGpioPins[i];
} else { } else {
kGpioPorts[i]->BRR |= kGpioPins[i]; kGpioPorts[i]->BRR |= kGpioPins[i];
} }
} }
pwm_counter++;
blink_counter++;
if(blink_counter > 0x2000) blink_counter = 0;
} }
void set_intensity(uint8_t channel, uint8_t intensity)
void set_intensity(uint8_t channel, uint16_t intensity)
{ {
if (channel >= kNumChannels) if (channel >= kNumChannels)
return; return;
intensities[channel] = intensity; intensities[channel] = intensity;
} }
void set_blinking(uint8_t channel, bool blink) void set_blinking(uint8_t channel, bool blink)
@ -63,8 +67,8 @@ class Leds {
} }
private: private:
uint16_t pwm_counter; uint8_t pwm_counter;
uint16_t blink_counter; uint16_t blink_counter;
uint8_t intensities[kNumChannels]; uint16_t intensities[kNumChannels];
bool blinking[kNumChannels]; bool blinking[kNumChannels];
}; };

View file

@ -12,16 +12,18 @@ void Processor::Process(int16_t cvs[], uint16_t* outs)
uint32_t value_l; uint32_t value_l;
uint32_t value_r; 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);
uint16_t pan_pot = (pan_offset + 32767L); uint16_t pan_pot = (pan_offset + 32767L);
uint16_t vol_pot = (vol_offset); 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 = (cv_input_vol * static_cast<int32_t>(vol_att)) >> 15;
int32_t vol_cv = (cvs[1] * static_cast<int32_t>(vol_att)) >> 15;
pan_cv = Clip16(pan_cv);
vol_cv = Clip16(vol_cv); vol_cv = Clip16(vol_cv);
// calculate value for ui // calculate value for ui
int32_t lin = vol_offset + vol_cv * 3; int32_t lin = vol_offset + (vol_cv << 3) * 3;
lin = ClipU16(lin); lin = ClipU16(lin);
lin *= !mute; lin *= !mute;
this->linear_vol = lin; this->linear_vol = lin;
@ -29,13 +31,11 @@ void Processor::Process(int16_t cvs[], uint16_t* outs)
uint16_t vol_pot_exp = Interpolate124(lut_linear_to_exp, vol_pot); 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); uint16_t vol_pot_log = 65535 - InverseInterpolate124(lut_linear_to_exp, vol_pot);
vol_pot = Mix(vol_pot_exp, vol_pot_log, log_exp_mix_pot); int32_t vol = Mix(static_cast<uint16_t>(vol_pot_exp >> 1), vol_pot_log >> 1, log_exp_mix_pot) << 1;
int32_t vol = vol_pot;
uint16_t vol_cv_absu16 = abs(vol_cv) << 1; 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_exp = Interpolate124(lut_linear_to_exp, vol_cv_absu16);
uint16_t vol_cv_log = 65535 - InverseInterpolate124(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(vol_cv_exp, vol_cv_log, log_exp_mix_cv) * 3; uint32_t vol_cv_pre = (Mix(static_cast<uint16_t>(vol_cv_exp >> 1), vol_cv_log >> 1, log_exp_mix_cv) << 3) * 3;
vol += vol_cv > 0 ? vol_cv_pre : -vol_cv_pre; vol += vol_cv > 0 ? vol_cv_pre : -vol_cv_pre;
vol *= !mute; vol *= !mute;
@ -43,11 +43,13 @@ void Processor::Process(int16_t cvs[], uint16_t* outs)
this->previous_vol = vol; this->previous_vol = vol;
int32_t pan = pan_pot + (pan_cv * 3); int32_t pan_cv = (cv_input_pan * static_cast<int32_t>(pan_att)) >> 15; // full attenuate gives 3x amplification :)
pan_cv = Clip16(pan_cv);
int32_t pan = pan_pot + ((pan_cv << 3) * 4);
pan = ClipU16(pan); pan = ClipU16(pan);
value_l = (Interpolate124(lut_left_sin_pan, pan) * vol) >> 16; value_l = (lut_left_sin_pan[pan >> 4] * vol) >> 16;
value_r = (Interpolate124(lut_right_cos_pan, pan) * vol) >> 16; value_r = (lut_right_cos_pan[pan >> 4] * vol) >> 16;
outs[0] = value_r; outs[0] = value_r;
outs[1] = value_l; outs[1] = value_l;

View file

@ -38,6 +38,9 @@ class Processor {
uint16_t previous_vol; uint16_t previous_vol;
uint16_t linear_vol; uint16_t linear_vol;
int16_t cv_input_pan = 0;
int16_t cv_input_vol = 0;
uint16_t vol_offset = 0; uint16_t vol_offset = 0;
int16_t pan_offset = 0; int16_t pan_offset = 0;
int16_t vol_att; int16_t vol_att;

View file

@ -3116,67 +3116,67 @@ const uint16_t lut_led_gamma[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 2, 2, 3, 3,
3, 3, 3, 4,
4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 6, 5, 5, 5, 5,
6, 6, 7, 7, 6, 6, 6, 6,
8, 8, 8, 9, 7, 7, 7, 8,
9, 10, 10, 11, 8, 8, 9, 9,
11, 12, 12, 13, 9, 10, 10, 10,
13, 14, 15, 15, 11, 11, 11, 12,
16, 17, 17, 18, 12, 13, 13, 14,
19, 19, 20, 21, 14, 14, 15, 15,
21, 22, 23, 24, 16, 16, 17, 17,
25, 25, 26, 27, 18, 18, 19, 19,
28, 29, 30, 31, 20, 20, 21, 22,
22, 23, 23, 24,
24, 25, 26, 26,
27, 28, 28, 29,
30, 30, 31, 32,
32, 33, 34, 35, 32, 33, 34, 35,
36, 37, 38, 39, 35, 36, 37, 38,
40, 41, 42, 43, 39, 39, 40, 41,
44, 45, 47, 48, 42, 43, 43, 44,
49, 50, 51, 53, 45, 46, 47, 48,
54, 55, 57, 58, 49, 50, 51, 52,
59, 61, 62, 64, 53, 53, 54, 55,
65, 66, 68, 69, 56, 57, 58, 59,
71, 72, 74, 76, 60, 62, 63, 64,
77, 79, 80, 82, 65, 66, 67, 68,
84, 85, 87, 89, 69, 70, 71, 73,
91, 92, 94, 96, 74, 75, 76, 77,
98, 100, 101, 103, 78, 80, 81, 82,
105, 107, 109, 111, 83, 85, 86, 87,
113, 115, 117, 119, 88, 90, 91, 92,
121, 123, 125, 128, 94, 95, 96, 98,
130, 132, 134, 136, 99, 100, 102, 103,
138, 141, 143, 145, 105, 106, 108, 109,
148, 150, 152, 155, 111, 112, 114, 115,
157, 160, 162, 164, 117, 118, 120, 121,
167, 169, 172, 175, 123, 124, 126, 127,
177, 180, 182, 185, 129, 131, 132, 134,
188, 190, 193, 196, 136, 137, 139, 141,
199, 201, 204, 207, 142, 144, 146, 148,
210, 213, 216, 219, 149, 151, 153, 155,
222, 224, 227, 230, 156, 158, 160, 162,
234, 237, 240, 243, 164, 166, 167, 169,
246, 249, 252, 255, 171, 173, 175, 177,
259, 262, 265, 268, 179, 181, 183, 185,
272, 275, 278, 282, 187, 189, 191, 193,
285, 289, 292, 296, 195, 197, 199, 201,
299, 303, 306, 310, 203, 205, 207, 210,
313, 317, 321, 324, 212, 214, 216, 218,
328, 332, 336, 339, 220, 223, 225, 227,
343, 347, 351, 355, 229, 232, 234, 236,
359, 362, 366, 370, 239, 241, 243, 246,
374, 378, 382, 387, 248, 250, 253, 255,
391, 395, 399, 403,
407, 412, 416, 420,
424, 429, 433, 437,
442, 446, 451, 455,
460, 464, 469, 473,
478, 483, 487, 492,
497, 501, 506, 511,
}; };

View file

@ -20,12 +20,11 @@ fig, ax = plt.subplots()
ax.plot(space, values) ax.plot(space, values)
other_values = OUTPUT_RESOLUTION - np.flip(values) other_values = OUTPUT_RESOLUTION - np.flip(values)
ax.plot(space, OUTPUT_RESOLUTION - (np.flip(values))) ax.plot(space, OUTPUT_RESOLUTION - (np.flip(values)))
ax.plot(space, values / 2 + other_values / 2)
ax.set(xlabel='space', ylabel='values') ax.set(xlabel='space', ylabel='values')
ax.grid() ax.grid()
# plt.show() #plt.show()
# Left pan Lookup table # Left pan Lookup table
@ -55,7 +54,7 @@ print(r_pan.size)
# led gamma correction # led gamma correction
gamma = 2.4 gamma = 2.4
max_in = 255 max_in = 255
max_out = 511 max_out = 255
input_vals = np.linspace(0, max_in, num=max_in + 1) input_vals = np.linspace(0, max_in, num=max_in + 1)
gamma_correction = ((input_vals / max_in) ** gamma) * max_out + 0.5 gamma_correction = ((input_vals / max_in) ** gamma) * max_out + 0.5
lookup_tables_u16.append(('led_gamma', np.floor(gamma_correction))) lookup_tables_u16.append(('led_gamma', np.floor(gamma_correction)))

View file

@ -99,23 +99,23 @@ void UI::TaskDrawLeds()
{ {
for (size_t i = 0; i < kNumChannels; i++) { for (size_t i = 0; i < kNumChannels; i++) {
if (potControllers[i].editing_hidden_parameter()) { if (potControllers[i].editing_hidden_parameter()) {
leds->set_intensity(i, abs(volume_att_pots[i] - 32767) >> 7); leds->set_intensity(i, abs(volume_att_pots[i] - 32767) << 1);
leds->set_blinking(i, volume_att_pots[i] - 32767 < 0); leds->set_blinking(i, volume_att_pots[i] - 32767 < 0);
} else if (potControllers[i + kNumChannels].editing_hidden_parameter()) { } else if (potControllers[i + kNumChannels].editing_hidden_parameter()) {
leds->set_intensity(i, abs(pan_att_pots[i] - 32767) >> 7); leds->set_intensity(i, abs(pan_att_pots[i] - 32767) << 1);
leds->set_blinking(i, pan_att_pots[i] - 32767 < 0); leds->set_blinking(i, pan_att_pots[i] - 32767 < 0);
} else { } else {
if (system_clock.milliseconds() - last_vol_pot_touch[i] < kShowChangedValueMilliseconds) { if (system_clock.milliseconds() - last_vol_pot_touch[i] < kShowChangedValueMilliseconds) {
// show volume // show volume
leds->set_intensity(i, volume_pots[i] >> 8); leds->set_intensity(i, volume_pots[i]);
leds->set_blinking(i, false); leds->set_blinking(i, false);
} else if (system_clock.milliseconds() - last_pan_pot_touch[i] < kShowChangedValueMilliseconds) { } else if (system_clock.milliseconds() - last_pan_pot_touch[i] < kShowChangedValueMilliseconds) {
// show panning // show panning
leds->set_intensity(i, abs(pan_pots[i] - 32767) >> 7); leds->set_intensity(i, abs(pan_pots[i] - 32767) << 1);
leds->set_blinking(i, pan_pots[i] - 32767 < 0); leds->set_blinking(i, pan_pots[i] - 32767 < 0);
} else { } else {
// show volume if not muted // show volume if not muted
leds->set_intensity(i, processors[i].linear_volume() >> (8)); leds->set_intensity(i, processors[i].linear_volume());
leds->set_blinking(i, false); leds->set_blinking(i, false);
} }
} }