Handle Midi clock and resolve BPM

pull/764/head
jnonis 7 months ago
parent cd785aa046
commit 0a68eb577f
  1. 8
      src/mididevice.cpp
  2. 34
      src/minidexed.cpp
  3. 7
      src/minidexed.h
  4. 17
      src/uimenu.cpp

@ -162,11 +162,11 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
} }
} }
if (nLength < 2) /*if (nLength < 2)
{ {
// LOGERR("MIDI message is shorter than 2 bytes!"); // LOGERR("MIDI message is shorter than 2 bytes!");
return; return;
} }*/
m_MIDISpinLock.Acquire (); m_MIDISpinLock.Acquire ();
@ -181,6 +181,10 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign
LOGNOTE("Master volume: %f",nMasterVolume); LOGNOTE("Master volume: %f",nMasterVolume);
m_pSynthesizer->setMasterVolume(nMasterVolume); m_pSynthesizer->setMasterVolume(nMasterVolume);
} }
else if (pMessage[0] == MIDI_TIMING_CLOCK)
{
m_pSynthesizer->handleClock();
}
else else
{ {
// Perform any MiniDexed level MIDI handling before specific Tone Generators // Perform any MiniDexed level MIDI handling before specific Tone Generators

@ -27,6 +27,7 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include <chrono>
LOGMODULE ("minidexed"); LOGMODULE ("minidexed");
@ -61,6 +62,10 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
{ {
assert (m_pConfig); assert (m_pConfig);
m_nClockCounter = 0;
m_mClockTime = 0;
m_nBPM = 120;
for (unsigned i = 0; i < CConfig::ToneGenerators; i++) for (unsigned i = 0; i < CConfig::ToneGenerators; i++)
{ {
m_nVoiceBankID[i] = 0; m_nVoiceBankID[i] = 0;
@ -721,6 +726,35 @@ void CMiniDexed::SetMIDIChannel (uint8_t uchChannel, unsigned nTG)
m_UI.ParameterChanged (); m_UI.ParameterChanged ();
} }
unsigned CMiniDexed::getTempo (void)
{
return this->m_nBPM;
}
void CMiniDexed::handleClock (void)
{
if (m_nClockCounter == 0)
{
// Set milis
auto now = std::chrono::high_resolution_clock::now();
m_mClockTime = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
}
m_nClockCounter++;
if (m_nClockCounter > 23) {
m_nClockCounter = 0;
// Calculate BPM
auto now = std::chrono::high_resolution_clock::now();
unsigned timeDelta = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count() - m_mClockTime;
m_nBPM = roundf(60000 / timeDelta);
// Set BPM to FXs
m_UI.ParameterChanged();
}
}
void CMiniDexed::keyup (int16_t pitch, unsigned nTG) void CMiniDexed::keyup (int16_t pitch, unsigned nTG)
{ {
assert (nTG < CConfig::ToneGenerators); assert (nTG < CConfig::ToneGenerators);

@ -81,6 +81,9 @@ public:
void SetResonance (int nResonance, unsigned nTG); // 0 .. 99 void SetResonance (int nResonance, unsigned nTG); // 0 .. 99
void SetMIDIChannel (uint8_t uchChannel, unsigned nTG); void SetMIDIChannel (uint8_t uchChannel, unsigned nTG);
unsigned getTempo(void);
void handleClock(void);
void keyup (int16_t pitch, unsigned nTG); void keyup (int16_t pitch, unsigned nTG);
void keydown (int16_t pitch, uint8_t velocity, unsigned nTG); void keydown (int16_t pitch, uint8_t velocity, unsigned nTG);
@ -359,6 +362,10 @@ private:
bool m_bLoadPerformanceBusy; bool m_bLoadPerformanceBusy;
bool m_bLoadPerformanceBankBusy; bool m_bLoadPerformanceBankBusy;
bool m_bSaveAsDeault; bool m_bSaveAsDeault;
unsigned m_nClockCounter;
unsigned long m_mClockTime;
unsigned m_nBPM;
}; };
#endif #endif

@ -35,7 +35,7 @@ LOGMODULE ("uimenu");
const CUIMenu::TMenuItem CUIMenu::s_MenuRoot[] = const CUIMenu::TMenuItem CUIMenu::s_MenuRoot[] =
{ {
{"MiniDexed JN", MenuHandler, s_MainMenu}, {"MiniDexed", MenuHandler, s_MainMenu},
{0} {0}
}; };
@ -653,7 +653,7 @@ void CUIMenu::MenuHandler (CUIMenu *pUIMenu, TMenuEvent Event)
{ {
pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pUI->DisplayWrite (
pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name, pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name,
"", to_string(pUIMenu->m_pMiniDexed->getTempo()).c_str(),
pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name, pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name,
pUIMenu->m_nCurrentSelection > 0, pUIMenu->m_nCurrentSelection > 0,
!!pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection+1].Name); !!pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection+1].Name);
@ -1195,6 +1195,8 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event)
case MenuEventUpdate: case MenuEventUpdate:
break; break;
case MenuEventPressAndStepDown:
nValue -= rParam.Increment * 9;
case MenuEventStepDown: case MenuEventStepDown:
nValue -= rParam.Increment; nValue -= rParam.Increment;
if (nValue < rParam.Minimum) if (nValue < rParam.Minimum)
@ -1204,6 +1206,8 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event)
pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType); pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType);
break; break;
case MenuEventPressAndStepUp:
nValue += rParam.Increment * 9;
case MenuEventStepUp: case MenuEventStepUp:
nValue += rParam.Increment; nValue += rParam.Increment;
if (nValue > rParam.Maximum) if (nValue > rParam.Maximum)
@ -1213,11 +1217,6 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event)
pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType); pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType);
break; break;
case MenuEventPressAndStepDown:
case MenuEventPressAndStepUp:
pUIMenu->TGShortcutHandler (Event);
return;
default: default:
return; return;
} }
@ -1330,6 +1329,8 @@ void CUIMenu::EditSendFXParameter (CUIMenu *pUIMenu, TMenuEvent Event)
case MenuEventUpdate: case MenuEventUpdate:
break; break;
case MenuEventPressAndStepDown:
nValue -= rParam.Increment * 9;
case MenuEventStepDown: case MenuEventStepDown:
nValue -= rParam.Increment; nValue -= rParam.Increment;
if (nValue < rParam.Minimum) if (nValue < rParam.Minimum)
@ -1339,6 +1340,8 @@ void CUIMenu::EditSendFXParameter (CUIMenu *pUIMenu, TMenuEvent Event)
pUIMenu->m_pMiniDexed->SetSendFXParameter (nParam, nValue, nFXType); pUIMenu->m_pMiniDexed->SetSendFXParameter (nParam, nValue, nFXType);
break; break;
case MenuEventPressAndStepUp:
nValue += rParam.Increment * 9;
case MenuEventStepUp: case MenuEventStepUp:
nValue += rParam.Increment; nValue += rParam.Increment;
if (nValue > rParam.Maximum) if (nValue > rParam.Maximum)

Loading…
Cancel
Save