8constexpr float interval_span = 0.5F;
14Smooth(std::vector<float>& input,
16 const int end_interval)
21 for (
auto i = 0; i < end_interval; ++i) {
25 input.at(i) = (f1 + f2 + f3) / 3.F;
33MSSmooth(std::vector<float>& input,
35 const int end_interval)
39 for (
auto i = 0; i < end_interval; ++i) {
42 input.at(i) = (f1 + f2) / 2.F;
46static const std::vector<CalcPatternMod> agnostic_mods = {
47 Stream, JS, HS, CJ, CJDensity, HSDensity,
48 FlamJam, TheThing, TheThing2, GChordStream,
51static const std::vector<CalcPatternMod> dependent_mods = {
55 Chaos, WideRangeBalance,
56 WideRangeRoll, WideRangeJumptrill,
57 WideRangeJJ, WideRangeAnchor,
59 CJOHJump, GStream, GBracketing,
64 static void set_agnostic(
const CalcPatternMod& pmod,
69 calc.
pmod_vals.at(left_hand).at(pmod).at(pos) = val;
72 static void set_dependent(
const int& hand,
73 const CalcPatternMod& pmod,
78 calc.
pmod_vals.at(hand).at(pmod).at(pos) = val;
81 static void run_agnostic_smoothing_pass(
const int& end_itv,
Calc& calc)
83 for (
const auto& pmod : agnostic_mods) {
84 Smooth(calc.
pmod_vals.at(left_hand).at(pmod), neutral, end_itv);
88 static void run_dependent_smoothing_pass(
const int& end_itv,
Calc& calc)
90 for (
const auto& pmod : dependent_mods) {
92 Smooth(h.at(pmod), neutral, end_itv);
97 static void bruh_they_the_same(
const int& end_itv,
Calc& calc)
99 for (
const auto& pmod : agnostic_mods) {
100 for (
auto i = 0; i < end_itv; i++) {
101 calc.
pmod_vals.at(right_hand).at(pmod).at(i) =
102 calc.
pmod_vals.at(left_hand).at(pmod).at(i);
111time_to_itv_idx(
const float& time) ->
int
120 return static_cast<int>((time + 0.0005f) / interval_span);
124itv_idx_to_time(
const int& idx) ->
float
126 return static_cast<float>(idx) * interval_span;
132fast_walk_and_check_for_skip(
const std::vector<NoteInfo>& ni,
135 const float& offset = 0.F) ->
bool
142 if (std::isinf(ni.back().rowTime) || std::isnan(ni.back().rowTime))
148 calc.numitv = time_to_itv_idx(ni.back().rowTime / rate) + 1;
151 if (calc.numitv >=
static_cast<int>(calc.itv_size.size())) {
153 if (calc.numitv >= max_intervals)
156 calc.resize_interval_dependent_vectors(calc.numitv + 2);
161 for (
auto i = 1; i < static_cast<int>(ni.size()); ++i) {
162 if (ni.at(i - 1).rowTime >= ni.at(i).rowTime) {
168 const auto max_keycount_notes = keycount_to_bin(calc.keycount);
169 auto all_columns_without_middle = max_keycount_notes;
170 if (ignore_middle_column) {
171 all_columns_without_middle = mask_to_remove_middle_column(calc.keycount);
173 auto left_hand_mask = left_mask(calc.keycount) & all_columns_without_middle;
174 auto right_hand_mask = right_mask(calc.keycount) & all_columns_without_middle;
177 calc.hand_col_masks = { left_hand_mask, right_hand_mask };
179 calc.col_masks.clear();
180 calc.col_masks.reserve(calc.keycount);
181 for (
unsigned i = 0; i < calc.keycount; i++) {
182 calc.col_masks.push_back(1 << i);
190 auto row_counter = 0;
191 auto scaled_time = 0.F;
195 if (row_counter >= max_rows_for_single_interval) {
202 if (ri.notes < 0 || ri.notes > max_keycount_notes) {
212 scaled_time = (i.rowTime + offset) / rate;
215 itv = time_to_itv_idx(scaled_time);
218 if (itv > last_itv) {
222 if (itv - last_itv > 1) {
223 for (
auto j = last_itv + 1; j < itv; ++j) {
224 calc.itv_size.at(j) = 0;
228 calc.itv_size.at(last_itv) = row_counter;
234 auto& nri = calc.adj_ni.at(itv).at(row_counter);
236 nri.row_notes = ri.notes;
237 nri.row_count = column_count(ri.notes);
238 nri.row_time = scaled_time;
241 nri.hand_counts[left_hand] = std::popcount(ri.notes & left_hand_mask);
242 nri.hand_counts[right_hand] = std::popcount(ri.notes & right_hand_mask);
246 assert(nri.hand_counts[left_hand] + nri.hand_counts[right_hand] ==
254 if (itv - last_itv > 1) {
255 for (
auto j = last_itv + 1; j < itv; ++j) {
256 calc.itv_size.at(j) = 0;
260 calc.itv_size.at(itv) = row_counter;
263 calc.numitv = itv + 1;
Main driver class for the difficulty calculator as a whole.
Definition MinaCalc.h:82
std::array< std::array< std::vector< float >, NUM_CalcPatternMod >, num_hands > pmod_vals
Definition MinaCalc.h:179
Definition UlbuAcolytes.h:63