2 changed files with 179 additions and 0 deletions
@ -0,0 +1,119 @@ |
|||||
|
#include "utils.hh" |
||||
|
|
||||
|
namespace Heck { |
||||
|
|
||||
|
void GetMidiTypeAsString(const ld::MidiEvent& msg, char* str) |
||||
|
{ |
||||
|
switch (msg.type) { |
||||
|
case ld::NoteOff: |
||||
|
strcpy(str, "NoteOff"); |
||||
|
break; |
||||
|
case ld::NoteOn: |
||||
|
strcpy(str, "NoteOn"); |
||||
|
break; |
||||
|
case ld::PolyphonicKeyPressure: |
||||
|
strcpy(str, "PolyKeyPres."); |
||||
|
break; |
||||
|
case ld::ControlChange: |
||||
|
strcpy(str, "CC"); |
||||
|
break; |
||||
|
case ld::ProgramChange: |
||||
|
strcpy(str, "Prog. Change"); |
||||
|
break; |
||||
|
case ld::ChannelPressure: |
||||
|
strcpy(str, "Chn. Pressure"); |
||||
|
break; |
||||
|
case ld::PitchBend: |
||||
|
strcpy(str, "PitchBend"); |
||||
|
break; |
||||
|
case ld::SystemCommon: |
||||
|
strcpy(str, "Sys. Common"); |
||||
|
break; |
||||
|
case ld::SystemRealTime: |
||||
|
strcpy(str, "Sys. Realtime"); |
||||
|
break; |
||||
|
case ld::ChannelMode: |
||||
|
strcpy(str, "Chn. Mode"); |
||||
|
break; |
||||
|
default: |
||||
|
strcpy(str, "Unknown"); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void GetMidiRTTypeAsString(const ld::MidiEvent& msg, char* str) |
||||
|
{ |
||||
|
switch (msg.srt_type) { |
||||
|
case ld::TimingClock: |
||||
|
strcpy(str, "TimingClock"); |
||||
|
break; |
||||
|
case ld::SRTUndefined0: |
||||
|
strcpy(str, "SRTUndefined0"); |
||||
|
break; |
||||
|
case ld::Start: |
||||
|
strcpy(str, "Start"); |
||||
|
break; |
||||
|
case ld::Continue: |
||||
|
strcpy(str, "Continue"); |
||||
|
break; |
||||
|
case ld::Stop: |
||||
|
strcpy(str, "Stop"); |
||||
|
break; |
||||
|
case ld::SRTUndefined1: |
||||
|
strcpy(str, "SRTUndefined1"); |
||||
|
break; |
||||
|
case ld::ActiveSensing: |
||||
|
strcpy(str, "ActiveSensing"); |
||||
|
break; |
||||
|
case ld::Reset: |
||||
|
strcpy(str, "Reset"); |
||||
|
break; |
||||
|
case ld::SystemRealTimeLast: |
||||
|
strcpy(str, "SystemRealTimeLast"); |
||||
|
break; |
||||
|
default: |
||||
|
strcpy(str, "Unknown"); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
float scalen_min_max(float val, float min, float max) |
||||
|
{ |
||||
|
float range = max - min; |
||||
|
float ret = min + (val * range); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
float scalen_center_range(float val, float center, float range) |
||||
|
{ |
||||
|
float min = center - (range / 2); |
||||
|
float ret = min + (val * range); |
||||
|
return ret; |
||||
|
} |
||||
|
} // namespace Heck
|
||||
|
|
||||
|
namespace Heck { |
||||
|
void SWTimer::set_period(u32 time_units) |
||||
|
{ |
||||
|
time_period_ = time_units; |
||||
|
} |
||||
|
|
||||
|
void SWTimer::set_callback(const Callback& cb) |
||||
|
{ |
||||
|
callback_ = cb; |
||||
|
} |
||||
|
|
||||
|
bool SWTimer::is_it_already_time_again(u32 time_now) |
||||
|
{ |
||||
|
if (time_now - time_last_exec_ >= time_period_) { |
||||
|
time_last_exec_ = time_now; |
||||
|
if (callback_) { |
||||
|
//todo: constexpr if metrics
|
||||
|
callback_(); |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} // namespace Heck
|
@ -0,0 +1,60 @@ |
|||||
|
#ifndef HECK_DAISY_UTILS_HH |
||||
|
#define HECK_DAISY_UTILS_HH |
||||
|
|
||||
|
#include "daisy_seed.h" |
||||
|
#include "types.hh" |
||||
|
|
||||
|
namespace Heck { |
||||
|
void GetMidiTypeAsString(const ld::MidiEvent& msg, char* str); |
||||
|
void GetMidiRTTypeAsString(const ld::MidiEvent& msg, char* str); |
||||
|
|
||||
|
float scalen_min_max(float val, float min, float max); |
||||
|
float scalen_center_range(float val, float center, float range); |
||||
|
} // namespace Heck
|
||||
|
|
||||
|
|
||||
|
namespace Heck { |
||||
|
class SWTimer { |
||||
|
public: |
||||
|
using Callback = std::function<void(void)>; |
||||
|
|
||||
|
void set_period(u32 time_units); |
||||
|
void set_callback(const Callback& cb); |
||||
|
bool is_it_already_time_again(u32 time_now); |
||||
|
|
||||
|
private: |
||||
|
Callback callback_{}; |
||||
|
u32 time_last_exec_{}; |
||||
|
u32 time_period_{}; |
||||
|
}; |
||||
|
} // namespace Heck
|
||||
|
|
||||
|
namespace Heck { |
||||
|
template<typename T> class Observer { |
||||
|
|
||||
|
public: |
||||
|
bool on_change(T val_new, std::function<void(T val_current)> fn) |
||||
|
{ |
||||
|
if (val_new != val_current_) { |
||||
|
val_current_ = val_new; |
||||
|
fn(val_current_); |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
bool on_change_fuzzy(T val_new, T min_deviation, std::function<void(T val_current)> fn) |
||||
|
{ |
||||
|
if (std::abs(val_new - val_current_) >= min_deviation) { |
||||
|
val_current_ = val_new; |
||||
|
fn(val_current_); |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
static inline T val_current_{}; |
||||
|
}; |
||||
|
} // namespace Heck
|
||||
|
#endif // HECK_DAISY_UTILS_HH
|
Loading…
Reference in new issue