Etterna 0.75.1
Loading...
Searching...
No Matches
HandBalance.h
1#pragma once
2#include "../../PatternModHelpers.h"
3
6{
7 const CalcPatternMod _pmod = HandBalance;
8 const std::string name = "HandBalance";
9
10#pragma region params
11
12 float min_mod = 0.5F;
13 float max_mod = 1.F;
14
15 float power_scaling = 0.5F;
16
17 const std::vector<std::pair<std::string, float*>> _params{
18 { "min_mod", &min_mod },
19 { "max_mod", &max_mod },
20
21 { "power_scaling", &power_scaling },
22 };
23#pragma endregion params and param map
24
25 float pmod = neutral;
26
27 float left_hand = 0.F;
28 float right_hand = 0.F;
29
30 void full_reset()
31 {
32 pmod = neutral;
33 interval_end();
34 }
35
36 void advance_sequencing(const int& notes, Calc& calc) {
37 left_hand += std::popcount(notes & calc.hand_col_masks.at(0));
38 right_hand += std::popcount(notes & calc.hand_col_masks.at(1));
39 }
40
41 void interval_end() {
42 left_hand = 0;
43 right_hand = 0;
44 }
45
46 auto operator()() -> float
47 {
48 if (left_hand == 0 && right_hand == 0) {
49 return neutral;
50 }
51
52 const auto diff =
53 fabsf(left_hand - right_hand) / ((left_hand + right_hand) / 2.F);
54
55 const auto prop = fastpow(1 - diff, power_scaling);
56
57 pmod = std::clamp(prop, min_mod, max_mod);
58
59 interval_end();
60 return pmod;
61 }
62};
Main driver class for the difficulty calculator as a whole.
Definition MinaCalc.h:82
Hand-Agnostic PatternMod weighing the balance of notes across hands.
Definition HandBalance.h:6