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
#include "../resources.h"
#include "stmlib/utils/dsp.h"
#include "stm32f0xx_hal_gpio.h"
#include <stm32f0xx_hal.h>
using namespace stereo_mix;
using namespace stmlib;
const uint8_t kNumChannels = 4;
@ -31,10 +33,6 @@ class Leds {
}
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
for (size_t i = 0; i < kNumChannels - 1; i++) {
#else
@ -42,17 +40,23 @@ class Leds {
#endif
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];
} else {
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)
return;
intensities[channel] = intensity;
}
void set_blinking(uint8_t channel, bool blink)
@ -63,8 +67,8 @@ class Leds {
}
private:
uint16_t pwm_counter;
uint8_t pwm_counter;
uint16_t blink_counter;
uint8_t intensities[kNumChannels];
uint16_t intensities[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_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 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);
int32_t vol_cv = (cv_input_vol * static_cast<int32_t>(vol_att)) >> 15;
vol_cv = Clip16(vol_cv);
// 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 *= !mute;
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_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 = vol_pot;
int32_t vol = Mix(static_cast<uint16_t>(vol_pot_exp >> 1), vol_pot_log >> 1, log_exp_mix_pot) << 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_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 *= !mute;
@ -43,11 +43,13 @@ void Processor::Process(int16_t cvs[], uint16_t* outs)
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);
value_l = (Interpolate124(lut_left_sin_pan, pan) * vol) >> 16;
value_r = (Interpolate124(lut_right_cos_pan, pan) * vol) >> 16;
value_l = (lut_left_sin_pan[pan >> 4] * vol) >> 16;
value_r = (lut_right_cos_pan[pan >> 4] * vol) >> 16;
outs[0] = value_r;
outs[1] = value_l;

View file

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

View file

@ -20,12 +20,11 @@ fig, ax = plt.subplots()
ax.plot(space, values)
other_values = 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.grid()
# plt.show()
#plt.show()
# Left pan Lookup table
@ -55,7 +54,7 @@ print(r_pan.size)
# led gamma correction
gamma = 2.4
max_in = 255
max_out = 511
max_out = 255
input_vals = np.linspace(0, max_in, num=max_in + 1)
gamma_correction = ((input_vals / max_in) ** gamma) * max_out + 0.5
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++) {
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);
} 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);
} else {
if (system_clock.milliseconds() - last_vol_pot_touch[i] < kShowChangedValueMilliseconds) {
// show volume
leds->set_intensity(i, volume_pots[i] >> 8);
leds->set_intensity(i, volume_pots[i]);
leds->set_blinking(i, false);
} else if (system_clock.milliseconds() - last_pan_pot_touch[i] < kShowChangedValueMilliseconds) {
// 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);
} else {
// 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);
}
}