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

@ -98,6 +98,7 @@ bool CMiniDexed::Initialize (void)
activate (); activate ();
SetVolume (100);
ProgramChange (0); ProgramChange (0);
setTranspose (24); setTranspose (24);
@ -199,6 +200,18 @@ void CMiniDexed::ProgramChange (unsigned nProgram)
m_UI.ProgramChanged (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) void CMiniDexed::ProcessSound (void)
{ {
assert (m_pSoundDevice); assert (m_pSoundDevice);

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

@ -38,7 +38,8 @@ CUserInterface::CUserInterface (CMiniDexed *pMiniDexed, CGPIOManager *pGPIOManag
m_pRotaryEncoder (0), m_pRotaryEncoder (0),
m_UIMode (UIModeVoiceSelect), m_UIMode (UIModeVoiceSelect),
m_nBank (0), 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); m_pLCDBuffered = new CWriteBufferDevice (m_pLCD);
assert (m_pLCDBuffered); assert (m_pLCDBuffered);
LCDWrite ("\x1B[?25l"); // cursor off LCDWrite ("\x1B[?25l\x1B""d+"); // cursor off, autopage mode
LOGDBG ("LCD initialized"); LOGDBG ("LCD initialized");
} }
@ -121,9 +122,9 @@ void CUserInterface::BankSelected (unsigned nBankLSB)
if (m_UIMode == UIModeBankSelect) if (m_UIMode == UIModeBankSelect)
{ {
CString String; 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) if (m_UIMode == UIModeVoiceSelect)
{ {
CString String; 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) void CUserInterface::LCDWrite (const char *pString)
{ {
if (m_pLCDBuffered) if (m_pLCDBuffered)
@ -210,6 +267,22 @@ void CUserInterface::EncoderEventHandler (CKY040::TEvent Event)
} }
break; 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: default:
break; break;
} }

@ -40,8 +40,17 @@ public:
void BankSelected (unsigned nBankLSB); // 0 .. 127 void BankSelected (unsigned nBankLSB); // 0 .. 127
void ProgramChanged (unsigned nProgram); // 0 .. 127 void ProgramChanged (unsigned nProgram); // 0 .. 127
void VolumeChanged (unsigned nVolume); // 0 .. 127
private: 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 LCDWrite (const char *pString); // Print to optional HD44780 display
void EncoderEventHandler (CKY040::TEvent Event); void EncoderEventHandler (CKY040::TEvent Event);
@ -53,6 +62,7 @@ private:
UIModeStart, UIModeStart,
UIModeVoiceSelect = UIModeStart, UIModeVoiceSelect = UIModeStart,
UIModeBankSelect, UIModeBankSelect,
UIModeVolume,
UIModeUnknown UIModeUnknown
}; };
@ -70,6 +80,7 @@ private:
unsigned m_nBank; unsigned m_nBank;
unsigned m_nProgram; unsigned m_nProgram;
unsigned m_nVolume;
}; };
#endif #endif

Loading…
Cancel
Save