Files
metabalus/src/ParameterStore.h

96 lines
2.8 KiB
C++

#pragma once
#include <cstdint>
#include <array>
#include <atomic>
enum class ParamId : uint16_t {
Osc1Frequency,
Osc1Gain,
Osc1VolumeEnvA,
Osc1VolumeEnvD,
Osc1VolumeEnvS,
Osc1VolumeEnvR,
FilterCutoffEnvA,
FilterCutoffEnvD,
FilterCutoffEnvS,
FilterCutoffEnvR,
FilterResonanceEnvA,
FilterResonanceEnvD,
FilterResonanceEnvS,
FilterResonanceEnvR,
// ... and so on
// this list could be like 200 long if I really wanted to
Count // for sizing
};
enum class EnvelopeId : uint16_t {
Osc1Volume,
Osc2Volume,
Osc3Volume,
FilterCutoff,
FilterResonance,
Count
};
struct EnvelopeParam {
ParamId a;
ParamId d;
ParamId s;
ParamId r;
};
constexpr std::array<EnvelopeParam, static_cast<size_t>(EnvelopeId::Count)> ENV_PARAMS {{
{ ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc1Volume
{ ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc2Volume (not implemented)
{ ParamId::Osc1VolumeEnvA, ParamId::Osc1VolumeEnvR, ParamId::Osc1VolumeEnvS, ParamId::Osc1VolumeEnvR }, // Osc3Volume (not implemented)
{ ParamId::FilterCutoffEnvA, ParamId::FilterCutoffEnvR, ParamId::FilterCutoffEnvS, ParamId::FilterCutoffEnvR }, // FilterCutoff
{ ParamId::FilterResonanceEnvA, ParamId::FilterResonanceEnvR, ParamId::FilterResonanceEnvS, ParamId::FilterResonanceEnvR }, // FilterResonance
}};
struct ParamDefault {
float def;
float min;
float max;
};
// TODO: make these configurable via yml file too
// later TODO: and then when I have full on profile saving there will be a default profile to load from
constexpr std::array<ParamDefault, static_cast<size_t>(ParamId::Count)> PARAM_DEFS {{
{ 100.0f, 20.0f, 600.0f}, // Osc1Freq
{ 0.8f, 0.0f, 1.0f}, // Osc1Gain
{ 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA,
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD,
{ 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS,
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR,
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvA,
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvD,
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvS,
{ 10.0f, 0.0f, 1000.0f}, // FilterCutoffEnvR,
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvA,
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvD,
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvS,
{ 10.0f, 0.0f, 1000.0f}, // FilterResonanceEnvR,
}};
constexpr size_t PARAM_COUNT = static_cast<size_t>(ParamId::Count);
class ParameterStore {
public:
ParameterStore();
~ParameterStore() = default;
void set(ParamId id, float value);
float get(ParamId id) const;
void resetToDefaults();
private:
std::array<std::atomic<float>, PARAM_COUNT> values_;
};