From 0a68eb577f29e8e2f909e7da33fda5b9b870fce5 Mon Sep 17 00:00:00 2001 From: jnonis Date: Wed, 10 Jul 2024 04:24:55 +0000 Subject: [PATCH] Handle Midi clock and resolve BPM --- src/mididevice.cpp | 8 ++++++-- src/minidexed.cpp | 34 ++++++++++++++++++++++++++++++++++ src/minidexed.h | 7 +++++++ src/uimenu.cpp | 17 ++++++++++------- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/mididevice.cpp b/src/mididevice.cpp index 81314ba..d851b1b 100644 --- a/src/mididevice.cpp +++ b/src/mididevice.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!"); return; - } + }*/ m_MIDISpinLock.Acquire (); @@ -181,6 +181,10 @@ void CMIDIDevice::MIDIMessageHandler (const u8 *pMessage, size_t nLength, unsign LOGNOTE("Master volume: %f",nMasterVolume); m_pSynthesizer->setMasterVolume(nMasterVolume); } + else if (pMessage[0] == MIDI_TIMING_CLOCK) + { + m_pSynthesizer->handleClock(); + } else { // Perform any MiniDexed level MIDI handling before specific Tone Generators diff --git a/src/minidexed.cpp b/src/minidexed.cpp index 0443195..f04702d 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -27,6 +27,7 @@ #include #include #include +#include LOGMODULE ("minidexed"); @@ -61,6 +62,10 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt, { assert (m_pConfig); + m_nClockCounter = 0; + m_mClockTime = 0; + m_nBPM = 120; + for (unsigned i = 0; i < CConfig::ToneGenerators; i++) { m_nVoiceBankID[i] = 0; @@ -721,6 +726,35 @@ void CMiniDexed::SetMIDIChannel (uint8_t uchChannel, unsigned nTG) 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(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(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) { assert (nTG < CConfig::ToneGenerators); diff --git a/src/minidexed.h b/src/minidexed.h index c4f314a..729cc3f 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -81,6 +81,9 @@ public: void SetResonance (int nResonance, unsigned nTG); // 0 .. 99 void SetMIDIChannel (uint8_t uchChannel, unsigned nTG); + unsigned getTempo(void); + void handleClock(void); + void keyup (int16_t pitch, unsigned nTG); void keydown (int16_t pitch, uint8_t velocity, unsigned nTG); @@ -359,6 +362,10 @@ private: bool m_bLoadPerformanceBusy; bool m_bLoadPerformanceBankBusy; bool m_bSaveAsDeault; + + unsigned m_nClockCounter; + unsigned long m_mClockTime; + unsigned m_nBPM; }; #endif diff --git a/src/uimenu.cpp b/src/uimenu.cpp index e25170c..24677e1 100644 --- a/src/uimenu.cpp +++ b/src/uimenu.cpp @@ -35,7 +35,7 @@ LOGMODULE ("uimenu"); const CUIMenu::TMenuItem CUIMenu::s_MenuRoot[] = { - {"MiniDexed JN", MenuHandler, s_MainMenu}, + {"MiniDexed", MenuHandler, s_MainMenu}, {0} }; @@ -653,7 +653,7 @@ void CUIMenu::MenuHandler (CUIMenu *pUIMenu, TMenuEvent Event) { pUIMenu->m_pUI->DisplayWrite ( pUIMenu->m_pParentMenu[pUIMenu->m_nCurrentMenuItem].Name, - "", + to_string(pUIMenu->m_pMiniDexed->getTempo()).c_str(), pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection].Name, pUIMenu->m_nCurrentSelection > 0, !!pUIMenu->m_pCurrentMenu[pUIMenu->m_nCurrentSelection+1].Name); @@ -1195,6 +1195,8 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event) case MenuEventUpdate: break; + case MenuEventPressAndStepDown: + nValue -= rParam.Increment * 9; case MenuEventStepDown: nValue -= rParam.Increment; if (nValue < rParam.Minimum) @@ -1204,6 +1206,8 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType); break; + case MenuEventPressAndStepUp: + nValue += rParam.Increment * 9; case MenuEventStepUp: nValue += rParam.Increment; if (nValue > rParam.Maximum) @@ -1213,11 +1217,6 @@ void CUIMenu::EditTGFXParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetTGFXParameter (nParam, nValue, nTG, nFXType); break; - case MenuEventPressAndStepDown: - case MenuEventPressAndStepUp: - pUIMenu->TGShortcutHandler (Event); - return; - default: return; } @@ -1330,6 +1329,8 @@ void CUIMenu::EditSendFXParameter (CUIMenu *pUIMenu, TMenuEvent Event) case MenuEventUpdate: break; + case MenuEventPressAndStepDown: + nValue -= rParam.Increment * 9; case MenuEventStepDown: nValue -= rParam.Increment; if (nValue < rParam.Minimum) @@ -1339,6 +1340,8 @@ void CUIMenu::EditSendFXParameter (CUIMenu *pUIMenu, TMenuEvent Event) pUIMenu->m_pMiniDexed->SetSendFXParameter (nParam, nValue, nFXType); break; + case MenuEventPressAndStepUp: + nValue += rParam.Increment * 9; case MenuEventStepUp: nValue += rParam.Increment; if (nValue > rParam.Maximum)