mirror of
https://github.com/jhbruhn/eurorack.git
synced 2025-03-14 18:55:48 +00:00
Implement support for multiple hidden parameters
This commit is contained in:
parent
8b4f02e919
commit
f741f25f93
3 changed files with 65 additions and 56 deletions
|
@ -39,9 +39,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "stmlib/stmlib.h"
|
||||
#include "stmlib/dsp/dsp.h"
|
||||
|
||||
#include "stmlib/stmlib.h"
|
||||
|
||||
enum PotState {
|
||||
POT_STATE_TRACKING,
|
||||
|
@ -50,42 +49,51 @@ enum PotState {
|
|||
POT_STATE_CATCHING_UP
|
||||
};
|
||||
|
||||
template<size_t hidden_parameter_count>
|
||||
class PotController {
|
||||
public:
|
||||
public:
|
||||
PotController() { }
|
||||
~PotController() { }
|
||||
|
||||
inline void Init(
|
||||
uint16_t* main_parameter,
|
||||
uint16_t* hidden_parameter // this pot controller always works on values between 0 and 65535
|
||||
) {
|
||||
uint16_t* hidden_parameters[hidden_parameter_count]) // this pot controller always works on values between 0 and 65535
|
||||
{
|
||||
state_ = POT_STATE_TRACKING;
|
||||
was_catching_up_ = false;
|
||||
|
||||
main_parameter_ = main_parameter;
|
||||
hidden_parameter_ = hidden_parameter;
|
||||
current_hidden_parameter_ = 0;
|
||||
|
||||
for(size_t i = 0; i < hidden_parameter_count; i++)
|
||||
hidden_parameters_[i] = hidden_parameters[i];
|
||||
|
||||
value_ = 0;
|
||||
stored_value_ = 0;
|
||||
previous_value_ = 0;
|
||||
}
|
||||
|
||||
inline void Lock() {
|
||||
inline void Lock(uint8_t selected_parameter)
|
||||
{
|
||||
if (selected_parameter > hidden_parameter_count)
|
||||
return;
|
||||
if (state_ == POT_STATE_LOCKING || state_ == POT_STATE_HIDDEN_PARAMETER) {
|
||||
return;
|
||||
}
|
||||
if (hidden_parameter_) {
|
||||
if (hidden_parameters_[selected_parameter]) {
|
||||
current_hidden_parameter_ = selected_parameter;
|
||||
was_catching_up_ = state_ == POT_STATE_CATCHING_UP;
|
||||
state_ = POT_STATE_LOCKING;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline bool editing_hidden_parameter() const {
|
||||
inline bool editing_hidden_parameter() const
|
||||
{
|
||||
return state_ == POT_STATE_HIDDEN_PARAMETER;
|
||||
}
|
||||
|
||||
inline void Unlock() {
|
||||
inline void Unlock()
|
||||
{
|
||||
if (state_ == POT_STATE_HIDDEN_PARAMETER || was_catching_up_) {
|
||||
state_ = POT_STATE_CATCHING_UP;
|
||||
} else {
|
||||
|
@ -93,11 +101,13 @@ class PotController {
|
|||
}
|
||||
}
|
||||
|
||||
inline void Realign() {
|
||||
inline void Realign()
|
||||
{
|
||||
state_ = POT_STATE_TRACKING;
|
||||
}
|
||||
|
||||
inline void ProcessControlRate(uint16_t adc_value) {
|
||||
inline void ProcessControlRate(uint16_t adc_value)
|
||||
{
|
||||
value_ += (adc_value - value_) >> 6;
|
||||
CONSTRAIN(value_, 0, 65535);
|
||||
// approximately this:
|
||||
|
@ -108,63 +118,60 @@ class PotController {
|
|||
}
|
||||
}
|
||||
|
||||
inline void ProcessUIRate() {
|
||||
inline void ProcessUIRate()
|
||||
{
|
||||
switch (state_) {
|
||||
case POT_STATE_TRACKING:
|
||||
previous_value_ = value_;
|
||||
break;
|
||||
case POT_STATE_TRACKING:
|
||||
previous_value_ = value_;
|
||||
break;
|
||||
|
||||
case POT_STATE_LOCKING:
|
||||
if (abs(value_ - previous_value_) > 1966) {
|
||||
stored_value_ = previous_value_;
|
||||
CONSTRAIN(value_, 0, 65535);
|
||||
*hidden_parameter_ = value_;
|
||||
state_ = POT_STATE_HIDDEN_PARAMETER;
|
||||
previous_value_ = value_;
|
||||
}
|
||||
break;
|
||||
|
||||
case POT_STATE_HIDDEN_PARAMETER:
|
||||
case POT_STATE_LOCKING:
|
||||
if (abs(value_ - previous_value_) > 1966) {
|
||||
stored_value_ = previous_value_;
|
||||
CONSTRAIN(value_, 0, 65535);
|
||||
*hidden_parameter_ = value_;
|
||||
*hidden_parameters_[current_hidden_parameter_] = value_;
|
||||
state_ = POT_STATE_HIDDEN_PARAMETER;
|
||||
previous_value_ = value_;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case POT_STATE_CATCHING_UP:
|
||||
{
|
||||
if (abs(value_ - previous_value_) > 327) {
|
||||
int32_t delta = value_ - previous_value_;
|
||||
case POT_STATE_HIDDEN_PARAMETER:
|
||||
CONSTRAIN(value_, 0, 65535);
|
||||
*hidden_parameters_[current_hidden_parameter_] = value_;
|
||||
previous_value_ = value_;
|
||||
break;
|
||||
|
||||
int32_t skew_ratio = delta > 0
|
||||
? (65600 - stored_value_) / (65600 - previous_value_)
|
||||
: (66 + stored_value_) / (66 + previous_value_);
|
||||
CONSTRAIN(skew_ratio, 6553, 655350);
|
||||
case POT_STATE_CATCHING_UP: {
|
||||
if (abs(value_ - previous_value_) > 327) {
|
||||
int32_t delta = value_ - previous_value_;
|
||||
|
||||
stored_value_ += (skew_ratio * delta) >> 11;
|
||||
CONSTRAIN(stored_value_, 0, 65535);
|
||||
int32_t skew_ratio = delta > 0
|
||||
? (65600 - stored_value_) / (65600 - previous_value_)
|
||||
: (66 + stored_value_) / (66 + previous_value_);
|
||||
CONSTRAIN(skew_ratio, 6553, 655350);
|
||||
|
||||
if (abs(stored_value_ - value_) < 327) {
|
||||
state_ = POT_STATE_TRACKING;
|
||||
}
|
||||
previous_value_ = value_;
|
||||
*main_parameter_ = stored_value_;
|
||||
}
|
||||
stored_value_ += (skew_ratio * delta) >> 11;
|
||||
CONSTRAIN(stored_value_, 0, 65535);
|
||||
|
||||
if (abs(stored_value_ - value_) < 327) {
|
||||
state_ = POT_STATE_TRACKING;
|
||||
}
|
||||
break;
|
||||
previous_value_ = value_;
|
||||
*main_parameter_ = stored_value_;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
PotState state_;
|
||||
bool was_catching_up_;
|
||||
|
||||
uint16_t* main_parameter_;
|
||||
uint16_t* hidden_parameter_;
|
||||
uint16_t* hidden_parameters_[hidden_parameter_count];
|
||||
uint8_t current_hidden_parameter_;
|
||||
int32_t value_;
|
||||
int32_t stored_value_;
|
||||
int32_t previous_value_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(PotController);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ void UI::Poll()
|
|||
press_time[i] = HAL_GetTick();
|
||||
ignore_release[i] = false;
|
||||
for (size_t j = 0; j < kNumChannels * 2; j++)
|
||||
potControllers[j].Lock();
|
||||
potControllers[j].Lock(i);
|
||||
}
|
||||
if (switches->pressed(Switch(i)) && !ignore_release[i]) {
|
||||
bool suppress_release_hidden_parameters = false;
|
||||
|
|
|
@ -22,8 +22,10 @@ class UI {
|
|||
queue.Init();
|
||||
|
||||
for (size_t i = 0; i < kNumChannels; i++) {
|
||||
potControllers[i].Init(&volume_pots[i], &volume_att_pots[i]);
|
||||
potControllers[i + kNumChannels].Init(&pan_pots[i], &pan_att_pots[i]);
|
||||
uint16_t* volume_hidden_params[kNumChannels] = {&volume_att_pots[i], &volume_att_pots[i], &volume_att_pots[i], &volume_att_pots[i]};
|
||||
potControllers[i].Init(&volume_pots[i], volume_hidden_params);
|
||||
uint16_t* pan_hidden_params[kNumChannels] = {&pan_att_pots[i], &pan_att_pots[i], &pan_att_pots[i], &pan_att_pots[i]};
|
||||
potControllers[i + kNumChannels].Init(&pan_pots[i], pan_hidden_params);
|
||||
|
||||
volume_att_pots[i] = pan_att_pots[i] = 65535;
|
||||
}
|
||||
|
@ -62,5 +64,5 @@ class UI {
|
|||
uint32_t last_pan_pot_touch[kNumChannels];
|
||||
uint32_t last_vol_pot_touch[kNumChannels];
|
||||
|
||||
PotController potControllers[kNumChannels * 2]; // todo: count
|
||||
PotController<kNumChannels> potControllers[kNumChannels * 2]; // todo: count
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue