205 const std::string name =
"CJ_Static";
209 float static_ms_weight = 0.65F;
212 float base_tap_scaler = 1.2F;
213 float huge_anchor_scaler = 1.15F;
214 float small_anchor_scaler = 1.15F;
215 float ccj_scaler = 1.25F;
216 float cct_scaler = 1.5F;
217 float ccn_scaler = 1.15F;
218 float ccb_scaler = 1.25F;
220 int mediterranean = 10;
222 const std::vector<std::pair<std::string, float*>> _params{
223 {
"static_ms_weight", &static_ms_weight },
224 {
"min_ms", &min_ms },
225 {
"base_tap_scaler", &base_tap_scaler },
226 {
"huge_anchor_scaler", &huge_anchor_scaler },
227 {
"small_anchor_scaler", &small_anchor_scaler },
228 {
"chord-chord-jack_scaler", &ccj_scaler },
229 {
"chord-chord-tap_scaler", &cct_scaler },
230 {
"chord-chord-no-anchors_scaler", &ccn_scaler },
231 {
"chordjacks_beginning_scaler", &ccb_scaler },
234#pragma endregion params and param map
237 void update_flags(
const unsigned& row_notes,
const int& row_count)
239 is_cj = last_row_count > 1 && row_count > 1;
240 was_cj = last_row_count > 1 && last_last_row_count > 1;
242 is_scj = (row_count == 1 && last_row_count > 1) &&
243 ((row_notes & last_row_notes) != 0u);
245 is_actually_continuing_jack = ((row_notes & last_row_notes) != 0u);
247 carpathian_basin_capsized_boat_chord_bonk.push_back(row_notes ==
250 if (carpathian_basin_capsized_boat_chord_bonk.size() > mediterranean) {
251 carpathian_basin_capsized_boat_chord_bonk.erase(
252 carpathian_basin_capsized_boat_chord_bonk.begin());
255 is_at_least_3_note_anch =
256 ((row_notes & last_row_notes) & last_last_row_notes) != 0u;
258 last_last_row_count = last_row_count;
259 last_row_count = row_count;
261 last_last_row_notes = last_row_notes;
262 last_row_notes = row_notes;
264 last_was_3_note_anch = is_at_least_3_note_anch;
266 if (is_actually_continuing_jack) {
273 void advance_base(
const float& any_ms,
Calc& calc)
275 if (row_counter >= max_rows_for_single_interval) {
280 float pewpew = base_tap_scaler;
287 int laguardiaairport = 0;
288 for (
int i = 0; i < carpathian_basin_capsized_boat_chord_bonk.size();
290 laguardiaairport += carpathian_basin_capsized_boat_chord_bonk[i];
293 pewpew *= std::pow(1.025F, laguardiaairport);
299 const auto ms = std::max(min_ms, any_ms * pewpew);
305 auto get_itv_diff(
Calc& calc)
const ->
float
307 if (row_counter == 0) {
312 std::unordered_map<int, int> mode;
313 std::vector<float> static_ms;
314 for (
int i = 0; i < row_counter; ++i) {
315 const auto v =
static_cast<int>(calc.
cj_static.at(i));
316 static_ms.push_back(calc.
cj_static.at(i));
321 for (
auto it = mode.begin(); it != mode.end(); it++) {
322 if (it->second > modefreq) {
324 modefreq = it->second;
327 for (
auto i = 0; i < static_ms.size(); i++) {
329 static_ms.at(i) = weighted_average(static_ms.at(i),
330 static_cast<float>(modev),
335 const auto ms_total = sum(static_ms);
336 const auto ms_mean = ms_total /
static_cast<float>(row_counter);
337 return ms_to_scaled_nps(ms_mean);
349 is_at_least_3_note_anch =
false;
350 last_was_3_note_anch =
false;
352 is_actually_continuing_jack =
false;
355 last_last_row_count = 0;
358 last_last_row_notes = 0U;
362 carpathian_basin_capsized_boat_chord_bonk.clear();
371 bool is_at_least_3_note_anch =
false;
372 bool last_was_3_note_anch =
false;
374 bool is_actually_continuing_jack =
false;
376 int last_row_count = 0;
377 int last_last_row_count = 0;
379 unsigned last_row_notes = 0U;
380 unsigned last_last_row_notes = 0U;
384 std::vector<int> carpathian_basin_capsized_boat_chord_bonk =
392 const std::string name =
"TC_Static";
396 float tc_base_weight = 4.F;
397 float nps_base_weight = 9.F;
398 float rm_base_weight = 1.F;
400 float balance_comp_window = 36.F;
401 float chaos_comp_window = 4.F;
402 float tc_static_base_window = 2.F;
405 float balance_power = 2.F;
406 float min_balance_ratio = 0.2F;
407 float balance_ratio_scaler = 1.F;
409 const std::vector<std::pair<std::string, float*>> _params{
410 {
"tc_base_weight", &tc_base_weight },
411 {
"nps_base_weight", &nps_base_weight },
412 {
"rm_base_weight", &rm_base_weight },
414 {
"balance_comp_window", &balance_comp_window },
415 {
"chaos_comp_window", &chaos_comp_window },
416 {
"tc_static_base_window", &tc_static_base_window },
417 {
"balance_power", &balance_power },
418 {
"min_balance_ratio", &min_balance_ratio },
419 {
"balance_ratio_scaler", &balance_ratio_scaler },
422#pragma endregion params and param map
426 static const unsigned trill_window = 3;
427 std::array<std::pair<col_type, float>, techyo::trill_window> mw_dt{};
433 const float& row_time)
435 if (row_counter >= max_rows_for_single_interval) {
444 auto chaos_comp = calc_chaos_comp(seq, ct, calc, hand, row_time);
452 void advance_rm_comp(
const float& rm_diff)
454 rm_itv_max_diff = std::max(rm_itv_max_diff, rm_diff);
457 void advance_jack_comp(
const float& hardest_itv_jack_ms) {
458 static const auto jack_base_scale = 1.01F;
459 jack_itv_diff = ms_to_scaled_nps(hardest_itv_jack_ms) * jack_base_scale;
463 [[nodiscard]]
auto get_itv_rma_diff()
const ->
float
465 return rm_itv_max_diff;
469 [[nodiscard]]
auto get_itv_jack_diff()
const ->
float
471 return jack_itv_diff;
476 [[nodiscard]]
auto get_itv_diff(
const float& nps_base,
Calc& calc)
const
479 auto rmbase = rm_itv_max_diff;
480 const auto nps_biased_chaos_base = weighted_average(
481 get_tc_base(calc), nps_base, tc_base_weight, nps_base_weight);
482 if (rmbase >= nps_biased_chaos_base) {
487 rmbase = weighted_average(
488 rmbase, nps_biased_chaos_base, rm_base_weight, 1.F);
490 return std::max(nps_biased_chaos_base, rmbase);
510 rm_itv_max_diff = 0.F;
512 balance_ratios.fill(0);
520 rm_itv_max_diff = 0.F;
526 mw_dt.fill({ col_empty, ms_init });
527 tb_static.fill(ms_init);
539 std::array<int, max_rows_for_single_interval> count_left{};
540 std::array<int, max_rows_for_single_interval> count_right{};
543 std::array<float, max_rows_for_single_interval> balance_ratios{};
546 std::array<float, max_rows_for_single_interval> tb_static{};
547 std::array<float, max_rows_for_single_interval> flammity{};
553 float rm_itv_max_diff = 0.F;
554 float jack_itv_diff = 0.F;
558 [[nodiscard]]
auto get_tc_base(
Calc& calc)
const ->
float
560 if (row_counter == 0) {
565 for (
auto i = 0; i < row_counter; ++i) {
569 const auto ms_mean = ms_total /
static_cast<float>(row_counter);
570 return ms_to_scaled_nps(ms_mean);
575 auto get_tb_base(
Calc& calc)
const ->
float
577 if (row_counter < 3) {
582 for (
auto i = 0; i < row_counter; ++i) {
583 ms_total += tb_static.at(i);
585 const auto ms_mean = ms_total /
static_cast<float>(row_counter);
586 return ms_to_scaled_nps(ms_mean);
593 auto get_itv_flam_factor()
const ->
float
595 if (row_counter == 0) {
600 for (
auto i = 0; i < row_counter; ++i) {
601 total += flammity.at(i);
604 const auto mean = total /
static_cast<float>(row_counter);
612 float calc_balance_comp()
const {
615 get_total_for_windowf(count_left, (
unsigned)balance_comp_window);
617 get_total_for_windowf(count_right, (
unsigned)balance_comp_window);
621 if (left == 0.F || right == 0.F) {
630 const auto bal_power =
631 std::clamp(
static_cast<int>(std::max(balance_power, 2.F)) % 2 == 0
633 : balance_power - 1.F,
636 const auto bal_factor = std::pow(2.F, bal_power);
638 const auto high = left > right ? left : right;
639 const auto low = left > right ? right : left;
641 const auto x = low / high;
642 const auto y = (-bal_factor * std::pow(x - 0.5F, bal_power)) + 1;
651 Calc& calc,
const int& hand,
const float& row_time)
653 const auto a = seq.get_sc_ms_now(ct);
655 if (ct == col_ohjump) {
656 b = seq.get_sc_ms_now(ct,
false);
658 b = seq.get_cc_ms_now();
665 const auto c = (a + b) / 2;
671 seq.
_mw_sc_ms[col_left].get_cv_of_window((
unsigned)chaos_comp_window);
674 seq.
_mw_sc_ms[col_right].get_cv_of_window((
unsigned)chaos_comp_window);
680 const auto oioi = 0.5F;
681 const auto ioio = 0.5F;
682 pineapple = std::clamp(pineapple + oioi, oioi, ioio + oioi);
683 porcupine = std::clamp(porcupine + oioi, oioi, ioio + oioi);
684 sequins = std::clamp(sequins + oioi, oioi, ioio + oioi);
687 const auto scoliosis = seq.
_mw_sc_ms[col_left].get_now();
689 const auto poliosis = seq.
_mw_sc_ms[col_right].get_now();
692 if (ct == col_left) {
693 obliosis = poliosis / scoliosis;
695 obliosis = scoliosis / poliosis;
701 obliosis = std::clamp(obliosis, 1.F, 10.F);
708 auto pewp = fastsqrt(div_high_by_low(scoliosis, poliosis) - 1.F);
714 std::array<float, 4> a;
726 const auto vertebrae = std::clamp(
727 ((pineapple + porcupine + sequins) / 3.F), oioi, ioio + oioi);
731 return c / vertebrae;
734 void advance_trill_base(
Calc& calc)
736 auto flamentation = .5F;
737 auto trill_ms_value = ms_init;
739 auto& a = mw_dt.at(0);
740 if (a.first == col_init) {
743 auto& b = mw_dt.at(1);
744 auto& c = mw_dt.at(2);
746 auto flam_of_the_trill = ms_init;
747 auto third_tap = ms_init;
749 if (b.second == 0.F && a.first != b.first) {
751 flam_of_the_trill = 0.F;
752 third_tap = c.second * 2.F;
753 }
else if (c.second == 0.F && b.first != c.first) {
755 flam_of_the_trill = 0.F;
756 third_tap = b.second * 2.F;
760 if (a.first == c.first && a.first != b.first) {
762 flam_of_the_trill = std::min(b.second, c.second);
763 third_tap = std::max(b.second, c.second);
764 }
else if (a.first == c.first) {
768 flam_of_the_trill = 0.F;
769 third_tap = c.second;
771 if (a.first != b.first) {
773 flam_of_the_trill = b.second;
774 third_tap = c.second;
777 flam_of_the_trill = c.second;
778 third_tap = b.second;
783 if (flam_of_the_trill == 0.F && third_tap == 0.F) {
786 trill_ms_value = 0.1F;
791 const auto flam_ms_depressor = 0.F;
792 auto ratio = div_low_by_high(
793 std::max(flam_of_the_trill - flam_ms_depressor, 0.F),
795 flamentation = std::clamp(std::pow(ratio, 0.125F), 0.F, 1.F);
796 trill_ms_value = (flam_of_the_trill + third_tap) / 2.F;
800 flammity.at(row_counter) = flamentation;
801 tb_static.at(row_counter) = trill_ms_value;
807 void increment_column_counters(
const col_type& ct)
811 insert(count_left, 1);
812 insert(count_right, 0);
816 insert(count_left, 0);
817 insert(count_right, 1);
821 insert(count_left, 1);
822 insert(count_right, 1);
826 insert(count_left, 0);
827 insert(count_right, 0);
833 float get_total_for_windowf(
834 const std::array<int, max_rows_for_single_interval>& arr,
const unsigned window)
const
837 auto i = max_rows_for_single_interval;
838 while (i > max_rows_for_single_interval - (
int)window) {
845 template <
typename T>
846 void insert(std::array<T, max_rows_for_single_interval>& arr,
849 for (
auto i = 1; i < max_rows_for_single_interval; i++) {
850 arr.at(i - 1) = arr.at(i);
852 arr.at(max_rows_for_single_interval - 1) = value;
855 void process_mw_dt(
const col_type& ct,
const float ms_now)
858 if (ct == col_ohjump) {
859 for (
auto i = 1; i < trill_window; i++) {
860 arr.at(i - 1) = arr.at(i);
862 arr.at(trill_window - 1) = { col_left, ms_now };
864 for (
auto i = 1; i < trill_window; i++) {
865 arr.at(i - 1) = arr.at(i);
867 arr.at(trill_window - 1) = { col_right, 0.F };
869 for (
auto i = 1; i < trill_window; i++) {
870 arr.at(i - 1) = arr.at(i);
872 arr.at(trill_window - 1) = { ct, ms_now };