mirror of
https://github.com/jhbruhn/eurorack.git
synced 2025-03-15 02:55:49 +00:00
Move menu item values to pointers pointing to the variable to be changed
This commit is contained in:
parent
8315de5d05
commit
5182a9b495
6 changed files with 80 additions and 65 deletions
|
@ -16,25 +16,25 @@ template <class T>
|
||||||
class MenuItem : public AbstractMenuItem {
|
class MenuItem : public AbstractMenuItem {
|
||||||
private:
|
private:
|
||||||
const char* label;
|
const char* label;
|
||||||
T value;
|
T* value;
|
||||||
T step;
|
T step;
|
||||||
char stringRepresentation[24];
|
char stringRepresentation[24];
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MenuItem(const char* _label, T _initialValue)
|
MenuItem(const char* _label, T* _value)
|
||||||
: label(_label)
|
: label(_label)
|
||||||
, value(_initialValue) {};
|
, value(_value) {};
|
||||||
|
|
||||||
virtual void to_string(char* buf) = 0;
|
virtual void to_string(char* buf) = 0;
|
||||||
|
|
||||||
void set_value(T value)
|
void set_value(T value)
|
||||||
{
|
{
|
||||||
this->value = value;
|
*this->value = value;
|
||||||
this->to_string(stringRepresentation);
|
this->to_string(stringRepresentation);
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
T get_value()
|
T* get_value_ptr()
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -60,8 +60,8 @@ class NumberMenuItem : public MenuItem<T> {
|
||||||
T step;
|
T step;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NumberMenuItem(const char* _label, T _initialValue, T _minimumValue, T _maximumValue, T _step)
|
NumberMenuItem(const char* _label, T* _value, T _minimumValue, T _maximumValue, T _step)
|
||||||
: MenuItem<T>(_label, _initialValue)
|
: MenuItem<T>(_label, _value)
|
||||||
, minimumValue(_minimumValue)
|
, minimumValue(_minimumValue)
|
||||||
, maximumValue(_maximumValue)
|
, maximumValue(_maximumValue)
|
||||||
, step(_step) {};
|
, step(_step) {};
|
||||||
|
@ -70,24 +70,24 @@ class NumberMenuItem : public MenuItem<T> {
|
||||||
|
|
||||||
void to_string(char* buf)
|
void to_string(char* buf)
|
||||||
{
|
{
|
||||||
sprintf(buf, this->get_format_string(), this->get_value());
|
sprintf(buf, this->get_format_string(), *this->get_value_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void increase()
|
void increase()
|
||||||
{
|
{
|
||||||
if (this->get_value() + step <= maximumValue && this->get_value() + step >= minimumValue)
|
if (*this->get_value_ptr() + step <= maximumValue && *this->get_value_ptr() + step >= minimumValue)
|
||||||
this->set_value(this->get_value() + step);
|
this->set_value(*this->get_value_ptr() + step);
|
||||||
};
|
};
|
||||||
|
|
||||||
void decrease()
|
void decrease()
|
||||||
{
|
{
|
||||||
if (this->get_value() - step >= minimumValue && this->get_value() - step <= maximumValue)
|
if (*this->get_value_ptr() - step >= minimumValue && *this->get_value_ptr() - step <= maximumValue)
|
||||||
this->set_value(this->get_value() - step);
|
this->set_value(*this->get_value_ptr() - step);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class UIntMenuItem : public NumberMenuItem<uint32_t> {
|
class UInt32MenuItem : public NumberMenuItem<uint32_t> {
|
||||||
private:
|
private:
|
||||||
protected:
|
protected:
|
||||||
const char* get_format_string()
|
const char* get_format_string()
|
||||||
|
@ -96,11 +96,11 @@ class UIntMenuItem : public NumberMenuItem<uint32_t> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UIntMenuItem(const char* _label, uint32_t _initialValue, uint32_t _minimumValue, uint32_t _maximumValue, uint32_t _step)
|
UInt32MenuItem(const char* _label, uint32_t* _value, uint32_t _minimumValue, uint32_t _maximumValue, uint32_t _step)
|
||||||
: NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {};
|
: NumberMenuItem(_label, _value, _minimumValue, _maximumValue, _step) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
class IntMenuItem : public NumberMenuItem<int32_t> {
|
class Int32MenuItem : public NumberMenuItem<int32_t> {
|
||||||
private:
|
private:
|
||||||
protected:
|
protected:
|
||||||
const char* get_format_string()
|
const char* get_format_string()
|
||||||
|
@ -109,8 +109,8 @@ class IntMenuItem : public NumberMenuItem<int32_t> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IntMenuItem(const char* _label, int32_t _initialValue, int32_t _minimumValue, int32_t _maximumValue, int32_t _step)
|
Int32MenuItem(const char* _label, int32_t* _value, int32_t _minimumValue, int32_t _maximumValue, int32_t _step)
|
||||||
: NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {};
|
: NumberMenuItem(_label, _value, _minimumValue, _maximumValue, _step) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
class FloatMenuItem : public NumberMenuItem<float> {
|
class FloatMenuItem : public NumberMenuItem<float> {
|
||||||
|
@ -122,8 +122,8 @@ class FloatMenuItem : public NumberMenuItem<float> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FloatMenuItem(const char* _label, float _initialValue, float _minimumValue, float _maximumValue, float _step)
|
FloatMenuItem(const char* _label, float* _value, float _minimumValue, float _maximumValue, float _step)
|
||||||
: NumberMenuItem(_label, _initialValue, _minimumValue, _maximumValue, _step) {};
|
: NumberMenuItem(_label, _value, _minimumValue, _maximumValue, _step) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
class BoolMenuItem : public NumberMenuItem<bool> {
|
class BoolMenuItem : public NumberMenuItem<bool> {
|
||||||
|
@ -135,7 +135,7 @@ class BoolMenuItem : public NumberMenuItem<bool> {
|
||||||
protected:
|
protected:
|
||||||
const char* get_format_string()
|
const char* get_format_string()
|
||||||
{
|
{
|
||||||
bool value = this->get_value();
|
bool value = *this->get_value_ptr();
|
||||||
|
|
||||||
if (value)
|
if (value)
|
||||||
return this->on_string;
|
return this->on_string;
|
||||||
|
@ -144,25 +144,25 @@ class BoolMenuItem : public NumberMenuItem<bool> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BoolMenuItem(const char* _label, bool _initialValue, const char* _on_string, const char* _off_string)
|
BoolMenuItem(const char* _label, bool* _value, const char* _on_string, const char* _off_string)
|
||||||
: NumberMenuItem(_label, _initialValue, 0, 1, 1)
|
: NumberMenuItem(_label, _value, 0, 1, 1)
|
||||||
, on_string(_on_string)
|
, on_string(_on_string)
|
||||||
, off_string(_off_string) {};
|
, off_string(_off_string) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
class StringListMenuItem : public NumberMenuItem<uint32_t> {
|
class StringListMenuItem : public NumberMenuItem<uint8_t> {
|
||||||
private:
|
private:
|
||||||
const char** string_labels;
|
const char** string_labels;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const char* get_format_string()
|
const char* get_format_string()
|
||||||
{
|
{
|
||||||
return this->string_labels[this->get_value()];
|
return this->string_labels[*this->get_value_ptr()];
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StringListMenuItem(const char* _label, uint32_t _initialValue, const char** _stringLabels, size_t _itemCount)
|
StringListMenuItem(const char* _label, uint8_t* _value, const char** _stringLabels, size_t _itemCount)
|
||||||
: NumberMenuItem(_label, _initialValue, 0, _itemCount - 1, 1)
|
: NumberMenuItem(_label, _value, 0, _itemCount - 1, 1)
|
||||||
, string_labels(_stringLabels) {};
|
, string_labels(_stringLabels) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ class MidiNoteMenuItem : public NumberMenuItem<uint8_t> {
|
||||||
public:
|
public:
|
||||||
char* get_string_representation()
|
char* get_string_representation()
|
||||||
{
|
{
|
||||||
uint8_t currentNote = this->get_value();
|
uint8_t currentNote = *this->get_value_ptr();
|
||||||
int note = currentNote % 12;
|
int note = currentNote % 12;
|
||||||
int octave = (currentNote / 12) - 1;
|
int octave = (currentNote / 12) - 1;
|
||||||
|
|
||||||
|
@ -186,8 +186,8 @@ class MidiNoteMenuItem : public NumberMenuItem<uint8_t> {
|
||||||
return this->string_buffer;
|
return this->string_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
MidiNoteMenuItem(const char* _label, uint8_t _initialValue)
|
MidiNoteMenuItem(const char* _label, uint8_t* _value)
|
||||||
: NumberMenuItem(_label, _initialValue, 0, 127, 1)
|
: NumberMenuItem(_label, _value, 0, 127, 1)
|
||||||
{
|
{
|
||||||
note_strings[0] = "C";
|
note_strings[0] = "C";
|
||||||
note_strings[1] = "C#";
|
note_strings[1] = "C#";
|
||||||
|
|
|
@ -5,41 +5,49 @@
|
||||||
|
|
||||||
#define TOTAL_COLUMN_COUNT 4
|
#define TOTAL_COLUMN_COUNT 4
|
||||||
|
|
||||||
typedef enum { MIDI_THRU_OFF = 0,
|
typedef enum : uint8_t {
|
||||||
|
MIDI_THRU_OFF = 0,
|
||||||
MIDI_THRU_ON = 1,
|
MIDI_THRU_ON = 1,
|
||||||
MIDI_THRU_POLYCHAIN = 2 } MIDIThruMode_t;
|
MIDI_THRU_POLYCHAIN = 2
|
||||||
|
} MIDIThruMode_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : uint8_t {
|
||||||
|
MIDI_INPUT_OMNI = 0,
|
||||||
|
MIDI_INPUT_MIDI = 1,
|
||||||
|
MIDI_INPUT_USB = 2
|
||||||
|
} MIDIInput_t;
|
||||||
|
|
||||||
|
typedef enum : uint32_t {
|
||||||
BI_OFF = 0,
|
BI_OFF = 0,
|
||||||
BI_PITCH_UNI,
|
BI_PITCH_UNI = 1,
|
||||||
BI_PITCH_BI
|
BI_PITCH_BI = 2
|
||||||
} BiOutputType_t;
|
} BiOutputType_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : uint32_t {
|
||||||
UNI_OFF = 0,
|
UNI_OFF = 0,
|
||||||
UNI_PITCH,
|
UNI_PITCH = 1,
|
||||||
UNI_VELOCITY,
|
UNI_VELOCITY = 2,
|
||||||
UNI_MODULATION,
|
UNI_MODULATION = 3,
|
||||||
UNI_AFTERTOUCH,
|
UNI_AFTERTOUCH = 4,
|
||||||
UNI_BREATH,
|
UNI_BREATH = 5,
|
||||||
UNI_EXP,
|
UNI_EXP = 6,
|
||||||
UNI_GATE
|
UNI_GATE = 7
|
||||||
} UniOutputType_t;
|
} UniOutputType_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : uint32_t {
|
||||||
GATE_OFF = 0,
|
GATE_OFF = 0,
|
||||||
GATE_GATE,
|
GATE_GATE = 2,
|
||||||
GATE_TRIGGER
|
GATE_TRIGGER = 3
|
||||||
} GateOutputType_t;
|
} GateOutputType_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : uint32_t {
|
||||||
VOICE_COUNT_1 = 1,
|
VOICE_COUNT_1 = 1,
|
||||||
VOICE_COUNT_2 = 2,
|
VOICE_COUNT_2 = 2,
|
||||||
VOICE_COUNT_3 = 3,
|
VOICE_COUNT_3 = 3,
|
||||||
VOICE_COUNT_4 = 4
|
VOICE_COUNT_4 = 4
|
||||||
} PartVoiceCount_t;
|
} PartVoiceCount_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : uint32_t {
|
||||||
VOICE_DETAIL_S = 0,
|
VOICE_DETAIL_S = 0,
|
||||||
VOICE_DETAIL_M = 1,
|
VOICE_DETAIL_M = 1,
|
||||||
VOICE_DETAIL_L = 2,
|
VOICE_DETAIL_L = 2,
|
||||||
|
@ -68,13 +76,13 @@ class Part {
|
||||||
|
|
||||||
uint8_t RequiredColumns();
|
uint8_t RequiredColumns();
|
||||||
|
|
||||||
private:
|
|
||||||
PartVoiceCount_t part_voice_count;
|
PartVoiceCount_t part_voice_count;
|
||||||
PartVoiceDetail_t part_voice_detail;
|
PartVoiceDetail_t part_voice_detail;
|
||||||
bool midi_filter_channel_enabled;
|
bool midi_filter_channel_enabled;
|
||||||
uint8_t midi_filter_channel;
|
uint8_t midi_filter_channel;
|
||||||
uint8_t midi_filter_lowest_note;
|
uint8_t midi_filter_lowest_note;
|
||||||
uint8_t midi_filter_highest_note;
|
uint8_t midi_filter_highest_note;
|
||||||
|
MIDIInput_t midi_filter_input;
|
||||||
MIDIThruMode_t midi_thru_mode;
|
MIDIThruMode_t midi_thru_mode;
|
||||||
BiOutputType_t output_type_row_0[TOTAL_COLUMN_COUNT];
|
BiOutputType_t output_type_row_0[TOTAL_COLUMN_COUNT];
|
||||||
UniOutputType_t output_type_row_1[TOTAL_COLUMN_COUNT];
|
UniOutputType_t output_type_row_1[TOTAL_COLUMN_COUNT];
|
||||||
|
|
|
@ -13,7 +13,9 @@ using namespace stmlib;
|
||||||
#define HEADER_HEIGHT 14
|
#define HEADER_HEIGHT 14
|
||||||
const uint32_t kEncoderLongPressTime = 600;
|
const uint32_t kEncoderLongPressTime = 600;
|
||||||
|
|
||||||
MainMenu mainMenu;
|
Part parts[4];
|
||||||
|
Part* part_pointers[4] = {&parts[0], &parts[1], &parts[2], &parts[3]};
|
||||||
|
MainMenu mainMenu(part_pointers);
|
||||||
|
|
||||||
void UI::Init()
|
void UI::Init()
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,8 +13,9 @@ class MainMenu {
|
||||||
|
|
||||||
void render(U8G2* u8g2, int x, int y, int width, int height);
|
void render(U8G2* u8g2, int x, int y, int width, int height);
|
||||||
|
|
||||||
MainMenu()
|
MainMenu(Part** parts)
|
||||||
: activePartMenu(0)
|
: partMenus({ parts[0], parts[1], parts[2], parts[3] })
|
||||||
|
, activePartMenu(0)
|
||||||
, selectedPart(0) {};
|
, selectedPart(0) {};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -7,18 +7,19 @@ static const char* kVoiceDetailStrings[] = { "S", "M", "L", "XL" };
|
||||||
static const char* kMidiChannelStrings[] = { "omni", "1", "2", "3", "4", "5", "6",
|
static const char* kMidiChannelStrings[] = { "omni", "1", "2", "3", "4", "5", "6",
|
||||||
"7", "8", "9", "10", "11", "12", "13",
|
"7", "8", "9", "10", "11", "12", "13",
|
||||||
"14", "15", "16" };
|
"14", "15", "16" };
|
||||||
static const char* kMidiInputStrings[] = { "omni", "usb", "midi" };
|
static const char* kMidiInputStrings[] = { "omni", "midi", "usb" };
|
||||||
static const char* kMidiThruStrings[] = {"off", "on", "polychain"};
|
static const char* kMidiThruStrings[] = { "off", "on", "polychain" };
|
||||||
|
|
||||||
PartMenu::PartMenu()
|
PartMenu::PartMenu(Part* _part)
|
||||||
: item_voice_count("voice count", 1, 1, 4, 1)
|
: part(_part)
|
||||||
, item_voice_detail("voice detail", 0, kVoiceDetailStrings, 4)
|
, item_voice_count("voice count", (uint32_t*)&_part->part_voice_count, 1, 4, 1)
|
||||||
, item_midi_filter_enabled("MIDI filter", 1, "on", "off")
|
, item_voice_detail("voice detail", (uint8_t*)&_part->part_voice_detail, kVoiceDetailStrings, 4)
|
||||||
, item_midi_channel("MIDI channel", 0, kMidiChannelStrings, 17)
|
, item_midi_filter_enabled("MIDI filter", &_part->midi_filter_channel_enabled, "on", "off")
|
||||||
, item_midi_input("MIDI input", 0, kMidiInputStrings, 3)
|
, item_midi_channel("MIDI channel", (uint8_t*)&_part->midi_filter_channel, kMidiChannelStrings, 17)
|
||||||
, item_midi_lowest_note("MIDI lowest", 0)
|
, item_midi_input("MIDI input", (uint8_t*)&_part->midi_filter_input, kMidiInputStrings, 3)
|
||||||
, item_midi_highest_note("MIDI highest", 127)
|
, item_midi_lowest_note("MIDI lowest", (uint8_t*)&_part->midi_filter_lowest_note)
|
||||||
, item_midi_thru_mode("MIDI thru", 0, kMidiThruStrings, 3)
|
, item_midi_highest_note("MIDI highest", (uint8_t*)&_part->midi_filter_highest_note)
|
||||||
|
, item_midi_thru_mode("MIDI thru", (uint8_t*)&_part->midi_thru_mode, kMidiThruStrings, 3)
|
||||||
{
|
{
|
||||||
this->menu.add_item(&this->item_voice_count);
|
this->menu.add_item(&this->item_voice_count);
|
||||||
this->menu.add_item(&this->item_voice_detail);
|
this->menu.add_item(&this->item_voice_detail);
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
|
|
||||||
#include "../menu/menu.h"
|
#include "../menu/menu.h"
|
||||||
#include "../menu/menu_items.h"
|
#include "../menu/menu_items.h"
|
||||||
|
#include "../part.h"
|
||||||
#include <U8g2lib.h>
|
#include <U8g2lib.h>
|
||||||
|
|
||||||
class PartMenu {
|
class PartMenu {
|
||||||
public:
|
public:
|
||||||
PartMenu();
|
PartMenu(Part* _part);
|
||||||
|
|
||||||
bool enter();
|
bool enter();
|
||||||
bool back();
|
bool back();
|
||||||
|
@ -16,8 +17,10 @@ class PartMenu {
|
||||||
void render(U8G2* u8g2, int x, int y, int width, int height);
|
void render(U8G2* u8g2, int x, int y, int width, int height);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Part* part;
|
||||||
|
|
||||||
Menu menu;
|
Menu menu;
|
||||||
UIntMenuItem item_voice_count;
|
UInt32MenuItem item_voice_count;
|
||||||
StringListMenuItem item_voice_detail;
|
StringListMenuItem item_voice_detail;
|
||||||
BoolMenuItem item_midi_filter_enabled;
|
BoolMenuItem item_midi_filter_enabled;
|
||||||
StringListMenuItem item_midi_channel;
|
StringListMenuItem item_midi_channel;
|
||||||
|
|
Loading…
Reference in a new issue