Add volume control to MIDI CC and UI

pull/47/head
Rene Stange 3 years ago
parent b408b26870
commit 2b1c7c4562
  1. 5
      src/mididevice.cpp
  2. 13
      src/minidexed.cpp
  3. 1
      src/minidexed.h
  4. 85
      src/userinterface.cpp
  5. 11
      src/userinterface.h

@ -31,6 +31,7 @@
#define MIDI_AFTERTOUCH 0b1010 // TODO
#define MIDI_CONTROL_CHANGE 0b1011
#define MIDI_CC_BANK_SELECT_MSB 0 // TODO
#define MIDI_CC_VOLUME 7
#define MIDI_CC_BANK_SELECT_LSB 32
#define MIDI_PROGRAM_CHANGE 0b1100
#define MIDI_PITCH_BEND 0b1110
@ -130,6 +131,10 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
switch (pMessage[1])
{
case MIDI_CC_VOLUME:
m_pSynthesizer->SetVolume (pMessage[2]);
break;
case MIDI_CC_BANK_SELECT_LSB:
m_pSynthesizer->BankSelectLSB (pMessage[2]);
break;

@ -98,6 +98,7 @@ bool CMiniDexed::Initialize (void)
activate ();
SetVolume (100);
ProgramChange (0);
setTranspose (24);
@ -199,6 +200,18 @@ void CMiniDexed::ProgramChange (unsigned nProgram)
m_UI.ProgramChanged (nProgram);
}
void CMiniDexed::SetVolume (unsigned nVolume)
{
if (nVolume > 127)
{
return;
}
setGain (nVolume / 127.0);
m_UI.VolumeChanged (nVolume);
}
void CMiniDexed::ProcessSound (void)
{
assert (m_pSoundDevice);

@ -57,6 +57,7 @@ public:
void BankSelectLSB (unsigned nBankLSB);
void ProgramChange (unsigned nProgram);
void SetVolume (unsigned nVolume);
private:
void ProcessSound (void);

@ -38,7 +38,8 @@ CUserInterface::CUserInterface (CMiniDexed *pMiniDexed, CGPIOManager *pGPIOManag
m_pRotaryEncoder (0),
m_UIMode (UIModeVoiceSelect),
m_nBank (0),
m_nProgram (0)
m_nProgram (0),
m_nVolume (0)
{
}
@ -73,7 +74,7 @@ bool CUserInterface::Initialize (void)
m_pLCDBuffered = new CWriteBufferDevice (m_pLCD);
assert (m_pLCDBuffered);
LCDWrite ("\x1B[?25l"); // cursor off
LCDWrite ("\x1B[?25l\x1B""d+"); // cursor off, autopage mode
LOGDBG ("LCD initialized");
}
@ -121,9 +122,9 @@ void CUserInterface::BankSelected (unsigned nBankLSB)
if (m_UIMode == UIModeBankSelect)
{
CString String;
String.Format ("\n\r%-12uBANK%s", nBankLSB+1, BankName.c_str ());
String.Format ("%u", nBankLSB+1);
LCDWrite (String);
DisplayWrite (String, "BANK", BankName.c_str ());
}
}
@ -145,12 +146,68 @@ void CUserInterface::ProgramChanged (unsigned nProgram)
if (m_UIMode == UIModeVoiceSelect)
{
CString String;
String.Format ("\n\r%-11uVOICE%s", nProgram, ProgramName);
String.Format ("%u", nProgram);
LCDWrite (String);
DisplayWrite (String, "VOICE", ProgramName);
}
}
void CUserInterface::VolumeChanged (unsigned nVolume)
{
assert (nVolume < 128);
m_nVolume = nVolume;
if (m_UIMode == UIModeVolume)
{
char VolumeBar[CConfig::LCDColumns+1];
memset (VolumeBar, 0xFF, sizeof VolumeBar); // 0xFF is the block character
VolumeBar[nVolume * CConfig::LCDColumns / 127] = '\0';
DisplayWrite ("", "VOLUME", VolumeBar);
}
}
void CUserInterface::DisplayWrite (const char *pInstance, const char *pMenu,
const char *pParam, const char *pValue)
{
assert (pInstance);
assert (pMenu);
assert (pParam);
CString Msg ("\x1B[H"); // cursor home
// first line
Msg.Append (pInstance);
size_t nLen = strlen (pInstance) + strlen (pMenu);
if (nLen < CConfig::LCDColumns)
{
for (unsigned i = CConfig::LCDColumns-nLen; i > 0; i--)
{
Msg.Append (" ");
}
}
Msg.Append (pMenu);
// second line
CString ParamValue (pParam);
if (pValue)
{
ParamValue.Append ("=");
ParamValue.Append (pValue);
}
Msg.Append (ParamValue);
if (ParamValue.GetLength () < CConfig::LCDColumns)
{
Msg.Append ("\x1B[K"); // clear end of line
}
LCDWrite (Msg);
}
void CUserInterface::LCDWrite (const char *pString)
{
if (m_pLCDBuffered)
@ -210,6 +267,22 @@ void CUserInterface::EncoderEventHandler (CKY040::TEvent Event)
}
break;
case UIModeVolume: {
const int Increment = 128 / CConfig::LCDColumns;
int nVolume = m_nVolume + nStep*Increment;
if (nVolume < 0)
{
nVolume = 0;
}
else if (nVolume > 127)
{
nVolume = 127;
}
m_pMiniDexed->SetVolume (nVolume);
} break;
default:
break;
}

@ -40,8 +40,17 @@ public:
void BankSelected (unsigned nBankLSB); // 0 .. 127
void ProgramChanged (unsigned nProgram); // 0 .. 127
void VolumeChanged (unsigned nVolume); // 0 .. 127
private:
// Print to display in this format:
// +----------------+
// |INSTANCE MENU|
// |PARAM[=VALUE] |
// +----------------+
void DisplayWrite (const char *pInstance, const char *pMenu,
const char *pParam, const char *pValue = nullptr);
void LCDWrite (const char *pString); // Print to optional HD44780 display
void EncoderEventHandler (CKY040::TEvent Event);
@ -53,6 +62,7 @@ private:
UIModeStart,
UIModeVoiceSelect = UIModeStart,
UIModeBankSelect,
UIModeVolume,
UIModeUnknown
};
@ -70,6 +80,7 @@ private:
unsigned m_nBank;
unsigned m_nProgram;
unsigned m_nVolume;
};
#endif

Loading…
Cancel
Save