Etterna 0.74.4
Loading...
Searching...
No Matches
HSDensity.h
1#pragma once
2#include "../../PatternModHelpers.h"
3
8{
9 const CalcPatternMod _pmod = HSDensity;
10 const std::string name = "HSDensityMod";
11 const int _tap_size = quad;
12
13#pragma region params
14
15 float min_mod = 1.F;
16 float max_mod = 1.F;
17 float base = 0.F;
18
19 float single_scaler = 2.F;
20 float jump_scaler = 1.2F;
21 float hand_scaler = 0.95F;
22 float quad_scaler = 0.95F;
23
24 const std::vector<std::pair<std::string, float*>> _params{
25 { "min_mod", &min_mod },
26 { "max_mod", &max_mod },
27 { "base", &base },
28
29 { "single_scaler", &single_scaler },
30 { "jump_scaler", &jump_scaler },
31 { "hand_scaler", &hand_scaler },
32 { "quad_scaler", &quad_scaler },
33 };
34#pragma endregion params and param map
35
36 float pmod = neutral;
37
38 auto operator()(const metaItvInfo& mitvi) -> float
39 {
40 const auto& itvi = mitvi._itvi;
41 if (itvi.total_taps == 0) {
42 return neutral;
43 }
44
45 const auto& t_taps = static_cast<float>(itvi.total_taps);
46 auto a0 =
47 static_cast<float>(static_cast<float>(itvi.taps_by_size[single]) *
48 single_scaler) /
49 t_taps;
50 auto a1 = static_cast<float>(
51 static_cast<float>(itvi.taps_by_size[jump]) * jump_scaler) /
52 t_taps;
53 auto a2 = static_cast<float>(
54 static_cast<float>(itvi.taps_by_size[hand]) * hand_scaler) /
55 t_taps;
56 auto a3 = static_cast<float>(
57 static_cast<float>(itvi.taps_by_size[quad]) * quad_scaler) /
58 t_taps;
59
60 auto aaa = a0 + a1 + a2 + a3;
61
62 pmod = std::clamp(base + fastsqrt(aaa), min_mod, max_mod);
63
64 return pmod;
65 }
66};
Definition HSDensity.h:8
Definition MetaIntervalInfo.h:20