Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance file handling #581

Merged
merged 19 commits into from
Jan 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
4940051
Initial update in performance file handling. This change makes the 6…
diyelectromusic Dec 4, 2023
a025153
Start of subdirectory implementation for performance banks.
diyelectromusic Dec 9, 2023
36d138f
Initial version with performance banks, selectable over MIDI only.
diyelectromusic Dec 16, 2023
2109b57
Initial implementation of performance bank switching in the UI menu.
diyelectromusic Dec 20, 2023
f10421b
Merge branch 'main' into PerformanceUpdates
diyelectromusic Dec 30, 2023
d581960
Remove debug information, fix few bugs, including PgmUpDown handling …
diyelectromusic Dec 30, 2023
f06a125
Merge branch 'PerformanceUpdates' of github.com:diyelectromusic/MiniD…
diyelectromusic Dec 30, 2023
5e910a5
Bugfixes for legacy cases when no performance directory exists plus s…
diyelectromusic Dec 30, 2023
7a9dd25
Remove verbose debug options (doh!)
diyelectromusic Dec 30, 2023
e49a410
Fix a minor off-by-one error found in review.
diyelectromusic Dec 30, 2023
692f57a
Bugfix - removed redundant legacy check that results in out of order …
diyelectromusic Dec 31, 2023
2871901
Merge branch 'main' into PerformanceUpdates
diyelectromusic Dec 31, 2023
7c6d544
Fix bug in MIDI button handling commands.
diyelectromusic Jan 3, 2024
726470a
Fix for issue where wrong performance is selected [L] on new save.
diyelectromusic Jan 8, 2024
66409c6
Suggested update to UI to show bank/performance numbers.
diyelectromusic Jan 8, 2024
07cdafc
Make performance bank select asynchronous to MIDI and UI to stop corr…
diyelectromusic Jan 14, 2024
7d18461
Fix an assert that should be a run-time test.
diyelectromusic Jan 15, 2024
aeac944
Ensure bank selection works when PCCH is not enabled, and that UI rem…
diyelectromusic Jan 23, 2024
5f6660f
Merge branch 'main' into PerformanceUpdates
diyelectromusic Jan 24, 2024
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
28 changes: 27 additions & 1 deletion src/mididevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,35 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
else
{
// Perform any MiniDexed level MIDI handling before specific Tone Generators
unsigned nPerfCh = m_pSynthesizer->GetPerformanceSelectChannel();
switch (ucType)
{
case MIDI_CONTROL_CHANGE:
// Check for performance PC messages
if (nPerfCh != Disabled)
{
if ((ucChannel == nPerfCh) || (nPerfCh == OmniMode))
{
if (pMessage[1] == MIDI_CC_BANK_SELECT_MSB)
{
m_pSynthesizer->BankSelectMSBPerformance (pMessage[2]);
}
else if (pMessage[1] == MIDI_CC_BANK_SELECT_LSB)
{
m_pSynthesizer->BankSelectLSBPerformance (pMessage[2]);
}
else
{
// Ignore any other CC messages at this time
}
}
}
if (nLength == 3)
{
m_pUI->UIMIDICmdHandler (ucChannel, ucStatus & 0xF0, pMessage[1], pMessage[2]);
}
break;

case MIDI_NOTE_OFF:
case MIDI_NOTE_ON:
if (nLength < 3)
Expand All @@ -195,11 +221,11 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
}
m_pUI->UIMIDICmdHandler (ucChannel, ucStatus & 0xF0, pMessage[1], pMessage[2]);
break;

case MIDI_PROGRAM_CHANGE:
// Check for performance PC messages
if( m_pConfig->GetMIDIRXProgramChange() )
{
unsigned nPerfCh = m_pSynthesizer->GetPerformanceSelectChannel();
if( nPerfCh != Disabled)
{
if ((ucChannel == nPerfCh) || (nPerfCh == OmniMode))
Expand Down
169 changes: 150 additions & 19 deletions src/minidexed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,11 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_bSavePerformance (false),
m_bSavePerformanceNewFile (false),
m_bSetNewPerformance (false),
m_bSetNewPerformanceBank (false),
m_bSetFirstPerformance (false),
m_bDeletePerformance (false),
m_bLoadPerformanceBusy(false)
m_bLoadPerformanceBusy(false),
m_bLoadPerformanceBankBusy(false)
{
assert (m_pConfig);

Expand Down Expand Up @@ -170,6 +173,8 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
SetParameter (ParameterCompressorEnable, 1);

SetPerformanceSelectChannel(m_pConfig->GetPerformanceSelectChannel());

SetParameter (ParameterPerformanceBank, 0);
};

bool CMiniDexed::Initialize (void)
Expand Down Expand Up @@ -227,6 +232,7 @@ bool CMiniDexed::Initialize (void)
reverb_send_mixer->gain(i,mapfloat(m_nReverbSend[i],0,99,0.0f,1.0f));
}

m_PerformanceConfig.Init();
if (m_PerformanceConfig.Load ())
{
LoadPerformanceParameters();
Expand All @@ -236,12 +242,6 @@ bool CMiniDexed::Initialize (void)
SetMIDIChannel (CMIDIDevice::OmniMode, 0);
}

// load performances file list, and attempt to create the performance folder
if (!m_PerformanceConfig.ListPerformances())
{
LOGERR ("Cannot create internal Performance folder, new performances can't be created");
}

// setup and start the sound device
if (!m_pSoundDevice->AllocateQueueFrames (m_pConfig->GetChunkSize ()))
{
Expand Down Expand Up @@ -305,14 +305,30 @@ void CMiniDexed::Process (bool bPlugAndPlayUpdated)
m_bSavePerformanceNewFile = false;
}

if (m_bSetNewPerformance && !m_bLoadPerformanceBusy)
if (m_bSetNewPerformanceBank && !m_bLoadPerformanceBusy && !m_bLoadPerformanceBankBusy)
{
DoSetNewPerformanceBank ();
if (m_nSetNewPerformanceBankID == GetActualPerformanceBankID())
{
m_bSetNewPerformanceBank = false;
}

// If there is no pending SetNewPerformance already, then see if we need to find the first performance to load
// NB: If called from the UI, then there will not be a SetNewPerformance, so load the first existing one.
// If called from MIDI, there will probably be a SetNewPerformance alongside the Bank select.
if (!m_bSetNewPerformance && m_bSetFirstPerformance)
{
DoSetFirstPerformance();
}
}

if (m_bSetNewPerformance && !m_bSetNewPerformanceBank && !m_bLoadPerformanceBusy && !m_bLoadPerformanceBankBusy)
{
DoSetNewPerformance ();
if (m_nSetNewPerformanceID == GetActualPerformanceID())
{
m_bSetNewPerformance = false;
}

}

if(m_bDeletePerformance)
Expand Down Expand Up @@ -392,6 +408,11 @@ CSysExFileLoader *CMiniDexed::GetSysExFileLoader (void)
return &m_SysExFileLoader;
}

CPerformanceConfig *CMiniDexed::GetPerformanceConfig (void)
{
return &m_PerformanceConfig;
}

void CMiniDexed::BankSelect (unsigned nBank, unsigned nTG)
{
nBank=constrain((int)nBank,0,16383);
Expand All @@ -407,6 +428,20 @@ void CMiniDexed::BankSelect (unsigned nBank, unsigned nTG)
}
}

void CMiniDexed::BankSelectPerformance (unsigned nBank)
{
nBank=constrain((int)nBank,0,16383);

if (GetPerformanceConfig ()->IsValidPerformanceBank(nBank))
{
// Only change if we have the bank loaded
m_nVoiceBankIDPerformance = nBank;
SetNewPerformanceBank (nBank);

m_UI.ParameterChanged ();
}
}

void CMiniDexed::BankSelectMSB (unsigned nBankMSB, unsigned nTG)
{
nBankMSB=constrain((int)nBankMSB,0,127);
Expand All @@ -422,6 +457,12 @@ void CMiniDexed::BankSelectMSB (unsigned nBankMSB, unsigned nTG)
m_nVoiceBankIDMSB[nTG] = nBankMSB;
}

void CMiniDexed::BankSelectMSBPerformance (unsigned nBankMSB)
{
nBankMSB=constrain((int)nBankMSB,0,127);
m_nVoiceBankIDMSBPerformance = nBankMSB;
}

void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
{
nBankLSB=constrain((int)nBankLSB,0,127);
Expand All @@ -435,6 +476,18 @@ void CMiniDexed::BankSelectLSB (unsigned nBankLSB, unsigned nTG)
BankSelect(nBank, nTG);
}

void CMiniDexed::BankSelectLSBPerformance (unsigned nBankLSB)
{
nBankLSB=constrain((int)nBankLSB,0,127);

unsigned nBank = m_nVoiceBankIDPerformance;
unsigned nBankMSB = m_nVoiceBankIDMSBPerformance;
nBank = (nBankMSB << 7) + nBankLSB;

// Now should have both MSB and LSB so enable the BankSelect
BankSelectPerformance(nBank);
}

void CMiniDexed::ProgramChange (unsigned nProgram, unsigned nTG)
{
assert (m_pConfig);
Expand Down Expand Up @@ -489,10 +542,7 @@ void CMiniDexed::ProgramChangePerformance (unsigned nProgram)
if (m_nParameter[ParameterPerformanceSelectChannel] != CMIDIDevice::Disabled)
{
// Program Change messages change Performances.
unsigned nLastPerformance = m_PerformanceConfig.GetLastPerformance();

// GetLastPerformance actually returns 1-indexed, number of performances
if (nProgram < nLastPerformance - 1)
if (m_PerformanceConfig.IsValidPerformance(nProgram))
{
SetNewPerformance(nProgram);
}
Expand Down Expand Up @@ -800,6 +850,10 @@ void CMiniDexed::SetParameter (TParameter Parameter, int nValue)
// Nothing more to do
break;

case ParameterPerformanceBank:
BankSelectPerformance(nValue);
break;

default:
assert (0);
break;
Expand Down Expand Up @@ -1181,10 +1235,17 @@ void CMiniDexed::SetPerformanceSelectChannel (unsigned uCh)

bool CMiniDexed::SavePerformance (bool bSaveAsDeault)
{
m_bSavePerformance = true;
m_bSaveAsDeault=bSaveAsDeault;
if (m_PerformanceConfig.GetInternalFolderOk())
{
m_bSavePerformance = true;
m_bSaveAsDeault=bSaveAsDeault;

return true;
return true;
}
else
{
return false;
}
}

bool CMiniDexed::DoSavePerformance (void)
Expand Down Expand Up @@ -1501,6 +1562,16 @@ unsigned CMiniDexed::GetLastPerformance()
return m_PerformanceConfig.GetLastPerformance();
}

unsigned CMiniDexed::GetPerformanceBank()
{
return m_PerformanceConfig.GetPerformanceBank();
}

unsigned CMiniDexed::GetLastPerformanceBank()
{
return m_PerformanceConfig.GetLastPerformanceBank();
}

unsigned CMiniDexed::GetActualPerformanceID()
{
return m_PerformanceConfig.GetActualPerformanceID();
Expand All @@ -1511,6 +1582,16 @@ void CMiniDexed::SetActualPerformanceID(unsigned nID)
m_PerformanceConfig.SetActualPerformanceID(nID);
}

unsigned CMiniDexed::GetActualPerformanceBankID()
{
return m_PerformanceConfig.GetActualPerformanceBankID();
}

void CMiniDexed::SetActualPerformanceBankID(unsigned nBankID)
{
m_PerformanceConfig.SetActualPerformanceBankID(nBankID);
}

bool CMiniDexed::SetNewPerformance(unsigned nID)
{
m_bSetNewPerformance = true;
Expand All @@ -1519,6 +1600,20 @@ bool CMiniDexed::SetNewPerformance(unsigned nID)
return true;
}

bool CMiniDexed::SetNewPerformanceBank(unsigned nBankID)
{
m_bSetNewPerformanceBank = true;
m_nSetNewPerformanceBankID = nBankID;

return true;
}

void CMiniDexed::SetFirstPerformance(void)
{
m_bSetFirstPerformance = true;
return;
}

bool CMiniDexed::DoSetNewPerformance (void)
{
m_bLoadPerformanceBusy = true;
Expand All @@ -1540,6 +1635,25 @@ bool CMiniDexed::DoSetNewPerformance (void)
}
}

bool CMiniDexed::DoSetNewPerformanceBank (void)
{
m_bLoadPerformanceBankBusy = true;

unsigned nBankID = m_nSetNewPerformanceBankID;
m_PerformanceConfig.SetNewPerformanceBank(nBankID);

m_bLoadPerformanceBankBusy = false;
return true;
}

void CMiniDexed::DoSetFirstPerformance(void)
{
unsigned nID = m_PerformanceConfig.FindFirstPerformance();
SetNewPerformance(nID);
m_bSetFirstPerformance = false;
return;
}

bool CMiniDexed::SavePerformanceNewFile ()
{
m_bSavePerformanceNewFile = m_PerformanceConfig.GetInternalFolderOk() && m_PerformanceConfig.CheckFreePerformanceSlot();
Expand Down Expand Up @@ -1631,6 +1745,16 @@ void CMiniDexed::SetNewPerformanceName(std::string nName)
m_PerformanceConfig.SetNewPerformanceName(nName);
}

bool CMiniDexed::IsValidPerformance(unsigned nID)
{
return m_PerformanceConfig.IsValidPerformance(nID);
}

bool CMiniDexed::IsValidPerformanceBank(unsigned nBankID)
{
return m_PerformanceConfig.IsValidPerformanceBank(nBankID);
}

void CMiniDexed::SetVoiceName (std::string VoiceName, unsigned nTG)
{
assert (nTG < CConfig::ToneGenerators);
Expand All @@ -1642,10 +1766,17 @@ void CMiniDexed::SetVoiceName (std::string VoiceName, unsigned nTG)

bool CMiniDexed::DeletePerformance(unsigned nID)
{
m_bDeletePerformance = true;
m_nDeletePerformanceID = nID;
if (m_PerformanceConfig.IsValidPerformance(nID) && m_PerformanceConfig.GetInternalFolderOk())
{
m_bDeletePerformance = true;
m_nDeletePerformanceID = nID;

return true;
return true;
}
else
{
return false;
}
}

bool CMiniDexed::DoDeletePerformance(void)
Expand Down
Loading
Loading