9 const CalcPatternMod _pmod = Minijack;
10 const std::string name =
"MinijackMod";
15 float max_mod = 1.25F;
18 float mj_scaler = 2.6F;
19 float mj_buffer = 0.3F;
21 const std::vector<std::pair<std::string, float*>> _params{
22 {
"min_mod", &min_mod },
23 {
"max_mod", &max_mod },
26 {
"minijack_scaler", &mj_scaler },
27 {
"minijack_buffer", &mj_buffer },
29#pragma endregion params and param map
38 const float minijack_speed_increase_factor = 1.9F;
42 const float minijack_confirmation_factor = 1.3F;
45 const float dont_care_threshold = 500.F;
48 const float slow_minijack_cutoff_ms = 149.5F;
54 int left_since_last_right = 0;
55 int right_since_last_left = 0;
60 int off_since_last_on = 0;
63#pragma region generic functions
69 left_ms.fill(ms_init);
70 right_ms.fill(ms_init);
73 off_hand_notes.fill(0);
74 left_since_last_right = 0;
75 right_since_last_left = 0;
76 off_since_last_on = 0;
79 void reset_mw_for_ct(
const col_type& ct) {
82 left_ms.fill(ms_init);
86 right_ms.fill(ms_init);
90 left_ms.fill(ms_init);
91 right_ms.fill(ms_init);
104 if (max != ms_init) {
105 auto i = max_moving_window_size;
107 const auto recent_ms = mv[--i];
108 const auto last_ms = mv[--i];
109 const auto last_last_ms = mv[--i];
113 if (last_ms > slow_minijack_cutoff_ms) {
121 if (last_ms == min &&
122 recent_ms > last_ms * minijack_confirmation_factor &&
123 last_last_ms > last_ms * minijack_speed_increase_factor) {
126 if (mwOffTapCounts[max_moving_window_size - 2] == 0) {
129 if (off_hand_notes[max_moving_window_size - 2] == 0) {
137 void advance_sequencing(
const col_type& ct,
152 if (right_since_last_left > 0 || left_since_last_right > 0) {
153 right_notes(right_since_last_left);
155 left_since_last_right++;
156 right_since_last_left = 0;
158 commit_off_hand_taps();
159 minijack_check(left_ms, right_notes);
165 if (left_since_last_right > 0 || right_since_last_left > 0) {
166 left_notes(left_since_last_right);
168 right_since_last_left++;
169 left_since_last_right = 0;
171 commit_off_hand_taps();
172 minijack_check(right_ms, left_notes);
178 left_notes(left_since_last_right);
179 right_notes(right_since_last_left);
180 left_since_last_right = 0;
181 right_since_last_left = 0;
184 commit_off_hand_taps();
185 minijack_check(left_ms, right_notes);
186 minijack_check(right_ms, left_notes);
194 void advance_off_hand_sequencing() {
198 void commit_off_hand_taps() {
199 off_hand_notes(off_since_last_on);
200 off_since_last_on = 0;
210 const auto mj = (
static_cast<float>(minijacks) + mj_buffer) * mj_scaler;
213 pmod = base + mj / taps;
215 pmod = std::clamp(pmod, min_mod, max_mod);