From 4981f28625cb7b51ae54e8d7946e24d011633b5a Mon Sep 17 00:00:00 2001
From: arsamus <arsamus.web@gmail.com>
Date: Fri, 26 Aug 2022 23:35:18 -0300
Subject: [PATCH] Update uimenu.cpp

---
 src/uimenu.cpp | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/uimenu.cpp b/src/uimenu.cpp
index 6013029..d2f71b0 100644
--- a/src/uimenu.cpp
+++ b/src/uimenu.cpp
@@ -538,7 +538,10 @@ void CUIMenu::EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event)
 	unsigned nTG = pUIMenu->m_nMenuStackParameter[pUIMenu->m_nCurrentMenuDepth-1];
 
 	int nValue = pUIMenu->m_pMiniDexed->GetTGParameter (CMiniDexed::TGParameterProgram, nTG);
-
+	
+	bool bAutoBankSkip=true; 
+	int nBankNumber = pUIMenu->m_pMiniDexed->GetTGParameter (CMiniDexed::TGParameterVoiceBank, nTG);
+	
 	switch (Event)
 	{
 	case MenuEventUpdate:
@@ -547,7 +550,15 @@ void CUIMenu::EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event)
 	case MenuEventStepDown:
 		if (--nValue < 0)
 		{
-			nValue = 0;
+			if(bAutoBankSkip && nBankNumber > 0)
+			{
+				pUIMenu->m_pMiniDexed->SetTGParameter (CMiniDexed::TGParameterVoiceBank, nBankNumber-1, nTG);
+				nValue=(int) CSysExFileLoader::VoicesPerBank-1;
+			}
+			else
+			{
+				nValue = 0;
+			}
 		}
 		pUIMenu->m_pMiniDexed->SetTGParameter (CMiniDexed::TGParameterProgram, nValue, nTG);
 		break;
@@ -555,7 +566,15 @@ void CUIMenu::EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event)
 	case MenuEventStepUp:
 		if (++nValue > (int) CSysExFileLoader::VoicesPerBank-1)
 		{
-			nValue = CSysExFileLoader::VoicesPerBank-1;
+			if(bAutoBankSkip && nBankNumber < (int) CSysExFileLoader::MaxVoiceBankID)
+			{
+				pUIMenu->m_pMiniDexed->SetTGParameter (CMiniDexed::TGParameterVoiceBank, nBankNumber+1, nTG);
+				nValue=(int) CSysExFileLoader::VoicesPerBank-1;	
+			}
+			else
+			{
+				nValue = CSysExFileLoader::VoicesPerBank-1;
+			}
 		}
 		pUIMenu->m_pMiniDexed->SetTGParameter (CMiniDexed::TGParameterProgram, nValue, nTG);
 		break;
@@ -574,10 +593,23 @@ void CUIMenu::EditProgramNumber (CUIMenu *pUIMenu, TMenuEvent Event)
 
 	string Value = to_string (nValue+1) + "=" + pUIMenu->m_pMiniDexed->GetVoiceName (nTG);
 
+	if(bAutoBankSkip)
+	{
+	string uchBankName = pUIMenu->m_pMiniDexed->GetSysExFileLoader ()->GetBankName (nBankNumber);
+	uchBankName = uchBankName.substr(0,11);
+	
+	pUIMenu->m_pUI->DisplayWrite (TG.c_str (),
+				      uchBankName,
+				      Value.c_str (),
+				      nValue > 0, nValue < (int) CSysExFileLoader::VoicesPerBank-1) && nBankNumber < (int) CSysExFileLoader::MaxVoiceBankID);	
+	}
+	else
+	{
 	pUIMenu->m_pUI->DisplayWrite (TG.c_str (),
 				      pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name,
 				      Value.c_str (),
 				      nValue > 0, nValue < (int) CSysExFileLoader::VoicesPerBank-1);
+	}
 }
 
 void CUIMenu::EditTGParameter (CUIMenu *pUIMenu, TMenuEvent Event)