pull/508/merge
Vincent Gauché 2 months ago committed by GitHub
commit c345dbf211
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 10
      .gitignore
  2. 169
      src/uimenu.cpp
  3. 9
      src/uimenu.h

10
.gitignore vendored

@ -46,7 +46,15 @@ sdcard
*.swp *.swp
*.swo *.swo
.vscode/
# temporary tests
src/test/*.bin
src/test/bin
src/test/results
src/test/objects
CMSIS_5/ CMSIS_5/
Synth_Dexed/ Synth_Dexed/
circle-stdlib/ circle-stdlib/
minidexed_* minidexed_*

@ -29,6 +29,10 @@
#include <cmath> #include <cmath>
#include <circle/sysconfig.h> #include <circle/sysconfig.h>
#include <assert.h> #include <assert.h>
#include <chrono>
#include <random>
#include <dexed.h>
using namespace std; using namespace std;
LOGMODULE ("uimenu"); LOGMODULE ("uimenu");
@ -85,6 +89,7 @@ const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] =
{"Modulation", MenuHandler, s_ModulationMenu}, {"Modulation", MenuHandler, s_ModulationMenu},
{"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel}, {"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel},
{"Edit Voice", MenuHandler, s_EditVoiceMenu}, {"Edit Voice", MenuHandler, s_EditVoiceMenu},
{"Random", CUIMenu::GenerateRandomPreset, nullptr, 0},
{0} {0}
}; };
@ -141,6 +146,7 @@ const CUIMenu::TMenuItem CUIMenu::s_ReverbMenu[] =
{"Low pass", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLowPass}, {"Low pass", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLowPass},
{"Diffusion", EditGlobalParameter, 0, CMiniDexed::ParameterReverbDiffusion}, {"Diffusion", EditGlobalParameter, 0, CMiniDexed::ParameterReverbDiffusion},
{"Level", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLevel}, {"Level", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLevel},
{"Random", CUIMenu::GenerateRandomFX, nullptr, 0},
{0} {0}
}; };
@ -179,31 +185,31 @@ const CUIMenu::TMenuItem CUIMenu::s_EditVoiceMenu[] =
}; };
const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] = const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] =
{ {
{"Output Level",EditOPParameter, 0, DEXED_OP_OUTPUT_LEV}, {"Output Level", EditOPParameter, 0, DEXED_OP_OUTPUT_LEV},
{"Freq Coarse", EditOPParameter, 0, DEXED_OP_FREQ_COARSE}, {"Freq Coarse", EditOPParameter, 0, DEXED_OP_FREQ_COARSE},
{"Freq Fine", EditOPParameter, 0, DEXED_OP_FREQ_FINE}, {"Freq Fine", EditOPParameter, 0, DEXED_OP_FREQ_FINE},
{"Osc Detune", EditOPParameter, 0, DEXED_OP_OSC_DETUNE}, {"Osc Detune", EditOPParameter, 0, DEXED_OP_OSC_DETUNE},
{"Osc Mode", EditOPParameter, 0, DEXED_OP_OSC_MODE}, {"Osc Mode", EditOPParameter, 0, DEXED_OP_OSC_MODE},
{"EG Rate 1", EditOPParameter, 0, DEXED_OP_EG_R1}, {"EG Rate 1", EditOPParameter, 0, DEXED_OP_EG_R1},
{"EG Rate 2", EditOPParameter, 0, DEXED_OP_EG_R2}, {"EG Rate 2", EditOPParameter, 0, DEXED_OP_EG_R2},
{"EG Rate 3", EditOPParameter, 0, DEXED_OP_EG_R3}, {"EG Rate 3", EditOPParameter, 0, DEXED_OP_EG_R3},
{"EG Rate 4", EditOPParameter, 0, DEXED_OP_EG_R4}, {"EG Rate 4", EditOPParameter, 0, DEXED_OP_EG_R4},
{"EG Level 1", EditOPParameter, 0, DEXED_OP_EG_L1}, {"EG Level 1", EditOPParameter, 0, DEXED_OP_EG_L1},
{"EG Level 2", EditOPParameter, 0, DEXED_OP_EG_L2}, {"EG Level 2", EditOPParameter, 0, DEXED_OP_EG_L2},
{"EG Level 3", EditOPParameter, 0, DEXED_OP_EG_L3}, {"EG Level 3", EditOPParameter, 0, DEXED_OP_EG_L3},
{"EG Level 4", EditOPParameter, 0, DEXED_OP_EG_L4}, {"EG Level 4", EditOPParameter, 0, DEXED_OP_EG_L4},
{"Break Point", EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT}, {"Break Point", EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT},
{"L Key Depth", EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH}, {"L Key Depth", EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH},
{"R Key Depth", EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH}, {"R Key Depth", EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH},
{"L Key Scale", EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE}, {"L Key Scale", EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE},
{"R Key Scale", EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE}, {"R Key Scale", EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE},
{"Rate Scaling",EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE}, {"Rate Scaling", EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE},
{"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS}, {"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS},
{"K Vel. Sens.",EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS}, {"K Vel. Sens.", EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS},
{"Enable", EditOPParameter, 0, DEXED_OP_ENABLE}, {"Enable", EditOPParameter, 0, DEXED_OP_ENABLE},
{0} {"Random", CUIMenu::GenerateRandomOperator, nullptr, 0},
}; {0}};
const CUIMenu::TMenuItem CUIMenu::s_SaveMenu[] = const CUIMenu::TMenuItem CUIMenu::s_SaveMenu[] =
{ {
@ -337,7 +343,8 @@ const CUIMenu::TMenuItem CUIMenu::s_PerformanceMenu[] =
{ {
{"Load", PerformanceMenu, 0, 0}, {"Load", PerformanceMenu, 0, 0},
{"Save", MenuHandler, s_SaveMenu}, {"Save", MenuHandler, s_SaveMenu},
{"Delete", PerformanceMenu, 0, 1}, {"Delete", PerformanceMenu, 0, 1},
{"Random", CUIMenu::GenerateRandomPerformance, nullptr, 0},
{"Bank", EditPerformanceBankNumber, 0, 0}, {"Bank", EditPerformanceBankNumber, 0, 0},
{"PCCH", EditGlobalParameter, 0, CMiniDexed::ParameterPerformanceSelectChannel}, {"PCCH", EditGlobalParameter, 0, CMiniDexed::ParameterPerformanceSelectChannel},
{0} {0}
@ -2014,5 +2021,115 @@ void CUIMenu::EditTGParameterModulation (CUIMenu *pUIMenu, TMenuEvent Event)
pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name, pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name,
Value.c_str (), Value.c_str (),
nValue > rParam.Minimum, nValue < rParam.Maximum); nValue > rParam.Minimum, nValue < rParam.Maximum);
}
// RANDOMIZATION
int CUIMenu::GetRandomValue(int min, int max)
{
static std::mt19937 gen(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());
std::uniform_int_distribution<int> dice(min, max);
return dice(gen);
}
void CUIMenu::GenerateRandomOperator(CUIMenu *pUIMenu, TMenuEvent Event)
{
if (Event != TMenuEvent::MenuEventSelect)
{
return;
}
size_t nTG = pUIMenu->m_nMenuStackParameter[pUIMenu->m_nCurrentMenuDepth - 3];
size_t nOP = pUIMenu->m_nMenuStackParameter[pUIMenu->m_nCurrentMenuDepth - 1];
CUIMenu::GenerateRandomOperatorTG(pUIMenu, nTG, nOP);
}
void CUIMenu::GenerateRandomOperatorTG(CUIMenu *pUIMenu, size_t nTG, size_t nOP)
{
assert(nTG < CConfig::ToneGenerators);
assert(nOP <= OPERATORS::OP6);
for (int nParam = DexedVoiceOPParameters::DEXED_OP_EG_R1; nParam <= DexedVoiceOPParameters::DEXED_OP_OSC_DETUNE; ++nParam)
{
TParameter param = CUIMenu::s_OPParameter[nParam];
uint8_t value = (uint8_t)CUIMenu::GetRandomValue(param.Minimum, param.Maximum);
pUIMenu->m_pMiniDexed->SetVoiceParameter(nParam, value, nOP, nTG);
}
}
void CUIMenu::GenerateRandomVoice(CUIMenu *pUIMenu, size_t nTG)
{
assert(nTG < CConfig::ToneGenerators);
for (size_t nOP = OPERATORS::OP1; nOP <= OPERATORS::OP6; ++nOP)
{
CUIMenu::GenerateRandomOperatorTG(pUIMenu, nTG, nOP);
}
for (int nParam = DexedVoiceParameters::DEXED_PITCH_EG_R1; nParam < DexedVoiceParameters::DEXED_NAME; ++nParam)
{
TParameter param = CUIMenu::s_VoiceParameter[nParam];
uint8_t value = (uint8_t)CUIMenu::GetRandomValue(param.Minimum, param.Maximum);
pUIMenu->m_pMiniDexed->SetVoiceParameter(nParam, value, CMiniDexed::NoOP, nTG);
}
}
void CUIMenu::GenerateRandomPreset(CUIMenu *pUIMenu, TMenuEvent Event)
{
if (Event != TMenuEvent::MenuEventSelect)
{
return;
}
size_t nTG = pUIMenu->m_nMenuStackParameter[pUIMenu->m_nCurrentMenuDepth - 1];
CUIMenu::GenerateRandomPresetTG(pUIMenu, nTG);
}
void CUIMenu::GenerateRandomPresetTG(CUIMenu *pUIMenu, size_t nTG)
{
assert(nTG < CConfig::ToneGenerators);
CUIMenu::GenerateRandomVoice(pUIMenu, nTG);
for (int nParam = CMiniDexed::TTGParameter::TGParameterVolume; nParam < CMiniDexed::TTGParameter::TGParameterUnknown; ++nParam)
{
TParameter param = CUIMenu::s_TGParameter[nParam];
uint8_t value = (uint8_t)CUIMenu::GetRandomValue(param.Minimum, param.Maximum);
pUIMenu->m_pMiniDexed->SetTGParameter(static_cast<CMiniDexed::TTGParameter>(nParam), value, nTG);
}
pUIMenu->m_pMiniDexed->SetTGParameter(CMiniDexed::TTGParameter::TGParameterMIDIChannel, CMIDIDevice::OmniMode, nTG);
}
void CUIMenu::GenerateRandomFX(CUIMenu *pUIMenu, TMenuEvent Event)
{
if (Event != TMenuEvent::MenuEventSelect)
{
return;
}
for (int nParam = CMiniDexed::TParameter::ParameterCompressorEnable; nParam < CMiniDexed::TParameter::ParameterUnknown; ++nParam)
{
TParameter param = CUIMenu::s_GlobalParameter[nParam];
uint8_t value = (uint8_t)CUIMenu::GetRandomValue(param.Minimum, param.Maximum);
pUIMenu->m_pMiniDexed->SetParameter(static_cast<CMiniDexed::TParameter>(nParam), value);
}
}
void CUIMenu::GenerateRandomPerformance(CUIMenu *pUIMenu, TMenuEvent Event)
{
if (Event != TMenuEvent::MenuEventSelect)
{
return;
}
for (size_t nTG = 0; nTG < CConfig::ToneGenerators; ++nTG)
{
CUIMenu::GenerateRandomPresetTG(pUIMenu, nTG);
}
CUIMenu::GenerateRandomFX(pUIMenu, Event);
} }

@ -129,6 +129,15 @@ private:
static void InputTxt (CUIMenu *pUIMenu, TMenuEvent Event); static void InputTxt (CUIMenu *pUIMenu, TMenuEvent Event);
static void TimerHandlerNoBack (TKernelTimerHandle hTimer, void *pParam, void *pContext); static void TimerHandlerNoBack (TKernelTimerHandle hTimer, void *pParam, void *pContext);
static int GetRandomValue(int min, int max);
static void GenerateRandomOperator(CUIMenu *pUIMenu, TMenuEvent Event);
static void GenerateRandomOperatorTG(CUIMenu *pUIMenu, size_t nTG, size_t nOp);
static void GenerateRandomVoice(CUIMenu *pUIMenu, size_t nTG);
static void GenerateRandomPreset(CUIMenu *pUIMenu, TMenuEvent Event);
static void GenerateRandomPresetTG(CUIMenu *pUIMenu, size_t nTG);
static void GenerateRandomFX(CUIMenu *pUIMenu, TMenuEvent Event);
static void GenerateRandomPerformance(CUIMenu *pUIMenu, TMenuEvent Event);
private: private:
CUserInterface *m_pUI; CUserInterface *m_pUI;

Loading…
Cancel
Save