mirror of
https://github.com/jhbruhn/eurorack.git
synced 2025-03-15 02:55:49 +00:00
Fixes in processing and attenuverter operation
This commit is contained in:
parent
6d54dc0a7b
commit
76175accf3
6 changed files with 90 additions and 82 deletions
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue