Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
a69e97f
Implementationg proposition for:
abscisys Dec 19, 2022
dabe431
Fixing compiling errors on RPI1
abscisys Dec 20, 2022
03a0774
Fixing compiling issue on RPI1
abscisys Dec 20, 2022
aac8391
Revert "Fixing compiling issue on RPI1"
abscisys Dec 20, 2022
11b3885
Revert "Fixing compiling errors on RPI1"
abscisys Dec 20, 2022
5317265
Revert "Implementationg proposition for:"
abscisys Dec 20, 2022
919221d
Implementationg proposition for:
abscisys Dec 19, 2022
d42b8af
Merge branch 'main' of github.com:abscisys/MiniDexed
abscisys Dec 20, 2022
6ca3e3d
Adding first set of FX
abscisys Dec 23, 2022
154cf69
Finalizing the Phase before testing
abscisys Dec 23, 2022
2542be1
Optize existing effect and add the Orbitone effect
abscisys Dec 24, 2022
fd3fd0e
Adding Flanger FX -> 1 point to fix as code is not compiling
abscisys Dec 24, 2022
992f275
Fixing Flanger
abscisys Dec 25, 2022
650db9a
Adding Tube and Chorus and update the way the FXChain is structured
abscisys Dec 27, 2022
d1408c6
Start FXRack parameter integration
abscisys Dec 28, 2022
79882d3
Merging minidexed_ext.cpp into minidexed.cpp
abscisys Dec 28, 2022
63a9460
Finalizing the menu integration and wiring to UI
abscisys Dec 28, 2022
1b33d6b
Multiple fixes - intermediate debugging
abscisys Dec 29, 2022
fe340f2
First step debugging completed
abscisys Dec 31, 2022
17030e8
2nd phase of debugging
abscisys Jan 3, 2023
6da53dc
Fixing the Shimmer Reverb
abscisys Jan 4, 2023
acc96b1
Fixing LFO frequency on the FXEngine
abscisys Jan 4, 2023
a376b41
Fixing the Chorus and enhancing the FXEngine to disable internal LFO
abscisys Jan 4, 2023
dc5165e
Removing the Chorus Feedback parameter that makes no sense
abscisys Jan 4, 2023
8227a3a
Fixing the Orbitone
abscisys Jan 4, 2023
d0fe01f
Tranform TapeDelay into a Delay as Flutter is a noise artifact generator
abscisys Jan 4, 2023
2a2b72a
Forgot 1 important source file for the conversion TapeDelay to Delay
abscisys Jan 4, 2023
ab4f238
Enhance the Buffer class for future use
abscisys Jan 4, 2023
f2006bd
Fixing the Tube effect so it has more presence
abscisys Jan 4, 2023
4fb79f8
Fixing the Phaser
abscisys Jan 5, 2023
e18c0f2
FXRack finalization
abscisys Jan 5, 2023
ffcafd6
A bit of cleanup
abscisys Jan 5, 2023
f14ac0a
Merge branch 'main' into fx
probonopd Jan 7, 2023
49973d1
Merge pull request #3 from probonopd/main
abscisys Jan 8, 2023
9cb9b97
Merge pull request #4 from probonopd/main
abscisys Jan 20, 2023
926ba53
Fixing many FX bugs and change of test framework
abscisys Jan 29, 2023
c19be7f
Alignement with fx2
abscisys Jan 30, 2023
4440ded
Fixing stereo image bug and missing initialization
abscisys Jan 30, 2023
6fb78be
Fix of the Shimmer Reverb
abscisys Feb 4, 2023
a264fdf
Fixes on FX to increase stability and performances
abscisys Feb 5, 2023
4709fc3
Fixes on FX and increase performances
abscisys Feb 5, 2023
20419bb
Reorganizing tests
abscisys Feb 5, 2023
4c502dd
FX fixes + optimizations + prepare for FX2 release
abscisys Feb 11, 2023
b18f4da
Merge pull request #5 from probonopd/main
abscisys Feb 11, 2023
dc15d62
Merge branch 'main' of github.com:probonopd/MiniDexed into probonopd-…
abscisys Feb 11, 2023
d933e05
Merge branch 'probonopd-main' into fx
abscisys Feb 11, 2023
23ab355
Changing the LFO to the new FastLFO2
abscisys Mar 4, 2023
398d11e
fixing unit tests + change default delay flutter to 0
abscisys Mar 4, 2023
73a430b
Merge branch 'main' into fx
abscisys Mar 4, 2023
6d8bb2e
Merge pull request #8 from abscisys/fx
abscisys Mar 4, 2023
3e7d28e
Merge branch 'probonopd:main' into main
abscisys Apr 10, 2023
d2f11cc
Merge pull request #10 from probonopd/main
abscisys May 18, 2023
d83f706
Revert "Merge pull request #10 from probonopd/main"
abscisys May 27, 2023
7f90b5d
reset to origin main branch
abscisys May 27, 2023
2be4e4a
Merge pull request #11 from abscisys/main-fix
abscisys May 27, 2023
3eccb2a
Adding sound-design randomization feature for Performance / FX / Pres…
abscisys Jun 5, 2023
494aaa3
Reverting unnecessarty formatting changes introduced by onsave formatter
abscisys Jun 5, 2023
f994425
Merge branch 'main' into chance
probonopd Apr 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,15 @@ sdcard
*.swp
*.swo

.vscode/

# temporary tests
src/test/*.bin
src/test/bin
src/test/results
src/test/objects

CMSIS_5/
Synth_Dexed/
circle-stdlib/
minidexed_*
minidexed_*
169 changes: 143 additions & 26 deletions src/uimenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
#include <cmath>
#include <circle/sysconfig.h>
#include <assert.h>
#include <chrono>
#include <random>

#include <dexed.h>

using namespace std;
LOGMODULE ("uimenu");
Expand Down Expand Up @@ -85,6 +89,7 @@ const CUIMenu::TMenuItem CUIMenu::s_TGMenu[] =
{"Modulation", MenuHandler, s_ModulationMenu},
{"Channel", EditTGParameter, 0, CMiniDexed::TGParameterMIDIChannel},
{"Edit Voice", MenuHandler, s_EditVoiceMenu},
{"Random", CUIMenu::GenerateRandomPreset, nullptr, 0},
{0}
};

Expand Down Expand Up @@ -141,6 +146,7 @@ const CUIMenu::TMenuItem CUIMenu::s_ReverbMenu[] =
{"Low pass", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLowPass},
{"Diffusion", EditGlobalParameter, 0, CMiniDexed::ParameterReverbDiffusion},
{"Level", EditGlobalParameter, 0, CMiniDexed::ParameterReverbLevel},
{"Random", CUIMenu::GenerateRandomFX, nullptr, 0},
{0}
};

Expand Down Expand Up @@ -179,31 +185,31 @@ const CUIMenu::TMenuItem CUIMenu::s_EditVoiceMenu[] =
};

const CUIMenu::TMenuItem CUIMenu::s_OperatorMenu[] =
{
{"Output Level",EditOPParameter, 0, DEXED_OP_OUTPUT_LEV},
{"Freq Coarse", EditOPParameter, 0, DEXED_OP_FREQ_COARSE},
{"Freq Fine", EditOPParameter, 0, DEXED_OP_FREQ_FINE},
{"Osc Detune", EditOPParameter, 0, DEXED_OP_OSC_DETUNE},
{"Osc Mode", EditOPParameter, 0, DEXED_OP_OSC_MODE},
{"EG Rate 1", EditOPParameter, 0, DEXED_OP_EG_R1},
{"EG Rate 2", EditOPParameter, 0, DEXED_OP_EG_R2},
{"EG Rate 3", EditOPParameter, 0, DEXED_OP_EG_R3},
{"EG Rate 4", EditOPParameter, 0, DEXED_OP_EG_R4},
{"EG Level 1", EditOPParameter, 0, DEXED_OP_EG_L1},
{"EG Level 2", EditOPParameter, 0, DEXED_OP_EG_L2},
{"EG Level 3", EditOPParameter, 0, DEXED_OP_EG_L3},
{"EG Level 4", EditOPParameter, 0, DEXED_OP_EG_L4},
{"Break Point", EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT},
{"L Key Depth", EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH},
{"R Key Depth", EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH},
{"L Key Scale", EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE},
{"R Key Scale", EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE},
{"Rate Scaling",EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE},
{"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS},
{"K Vel. Sens.",EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS},
{"Enable", EditOPParameter, 0, DEXED_OP_ENABLE},
{0}
};
{
{"Output Level", EditOPParameter, 0, DEXED_OP_OUTPUT_LEV},
{"Freq Coarse", EditOPParameter, 0, DEXED_OP_FREQ_COARSE},
{"Freq Fine", EditOPParameter, 0, DEXED_OP_FREQ_FINE},
{"Osc Detune", EditOPParameter, 0, DEXED_OP_OSC_DETUNE},
{"Osc Mode", EditOPParameter, 0, DEXED_OP_OSC_MODE},
{"EG Rate 1", EditOPParameter, 0, DEXED_OP_EG_R1},
{"EG Rate 2", EditOPParameter, 0, DEXED_OP_EG_R2},
{"EG Rate 3", EditOPParameter, 0, DEXED_OP_EG_R3},
{"EG Rate 4", EditOPParameter, 0, DEXED_OP_EG_R4},
{"EG Level 1", EditOPParameter, 0, DEXED_OP_EG_L1},
{"EG Level 2", EditOPParameter, 0, DEXED_OP_EG_L2},
{"EG Level 3", EditOPParameter, 0, DEXED_OP_EG_L3},
{"EG Level 4", EditOPParameter, 0, DEXED_OP_EG_L4},
{"Break Point", EditOPParameter, 0, DEXED_OP_LEV_SCL_BRK_PT},
{"L Key Depth", EditOPParameter, 0, DEXED_OP_SCL_LEFT_DEPTH},
{"R Key Depth", EditOPParameter, 0, DEXED_OP_SCL_RGHT_DEPTH},
{"L Key Scale", EditOPParameter, 0, DEXED_OP_SCL_LEFT_CURVE},
{"R Key Scale", EditOPParameter, 0, DEXED_OP_SCL_RGHT_CURVE},
{"Rate Scaling", EditOPParameter, 0, DEXED_OP_OSC_RATE_SCALE},
{"A Mod Sens.", EditOPParameter, 0, DEXED_OP_AMP_MOD_SENS},
{"K Vel. Sens.", EditOPParameter, 0, DEXED_OP_KEY_VEL_SENS},
{"Enable", EditOPParameter, 0, DEXED_OP_ENABLE},
{"Random", CUIMenu::GenerateRandomOperator, nullptr, 0},
{0}};

const CUIMenu::TMenuItem CUIMenu::s_SaveMenu[] =
{
Expand Down Expand Up @@ -337,7 +343,8 @@ const CUIMenu::TMenuItem CUIMenu::s_PerformanceMenu[] =
{
{"Load", PerformanceMenu, 0, 0},
{"Save", MenuHandler, s_SaveMenu},
{"Delete", PerformanceMenu, 0, 1},
{"Delete", PerformanceMenu, 0, 1},
{"Random", CUIMenu::GenerateRandomPerformance, nullptr, 0},
{"Bank", EditPerformanceBankNumber, 0, 0},
{"PCCH", EditGlobalParameter, 0, CMiniDexed::ParameterPerformanceSelectChannel},
{0}
Expand Down Expand Up @@ -2007,5 +2014,115 @@ void CUIMenu::EditTGParameterModulation (CUIMenu *pUIMenu, TMenuEvent Event)
pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name,
Value.c_str (),
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);
}
9 changes: 9 additions & 0 deletions src/uimenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,15 @@ class CUIMenu

static void InputTxt (CUIMenu *pUIMenu, TMenuEvent Event);
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:
CUserInterface *m_pUI;
Expand Down
Loading