24 const std::array<std::vector<int>, NUM_Skillset> pmods = { {
61 const std::array<float, NUM_Skillset> basescalers = {
62 0.F, 1.F, 1.F, 1.F, 0.93F, 1.F, 1.F, 1.F
66 const std::array<std::vector<int>, NUM_Skillset>& get_pmods()
const override
70 const std::array<float, NUM_Skillset>& get_basescalers()
const override
79 const float& adj_npsbase,
81 std::array<float, NUM_Skillset>& pmod_product_cur_interval)
override
86 case Skill_Jumpstream: {
90 pmod_product_cur_interval[Skill_Handstream];
91 *stam_base = std::max<float>(a, b);
93 case Skill_Handstream: {
97 pmod_product_cur_interval[Skill_Jumpstream];
98 *stam_base = std::max<float>(a, b);
100 case Skill_JackSpeed:
102 case Skill_Chordjack:
104 case Skill_Technical: {
107 pmod_product_cur_interval.at(ss) * basescalers.at(ss) /
109 fastpow(_calc.
pmod_vals.at(hand).at(CJ).at(itv) + 0.05F,
118 virtual void apply_keymode_multipliers(
119 std::vector<float>& cur_iteration_skillset_vals)
const
128 for (
auto& hand : both_hands) {
129 for (
auto& base : {TechBase}) {
132 std::fill(v.begin(), v.end(), 0.F);
145 full_agnostic_reset();
146 reset_row_sequencing();
148 run_agnostic_pmod_loop();
149 run_dependent_pmod_loop();
152 virtual void full_agnostic_reset()
154 _gchordstream.full_reset();
159 _last_mri.get()->reset();
162 virtual void setup_agnostic_pmods()
167 virtual void advance_agnostic_sequencing()
169 _hb.advance_sequencing(_mri->notes, _calc);
172 virtual void set_agnostic_pmods(
const int& itv)
174 PatternMods::set_agnostic(
175 _gchordstream._pmod, _gchordstream(_mitvi), itv, _calc);
176 PatternMods::set_agnostic(_cj._pmod, _cj(_mitvi), itv, _calc);
177 PatternMods::set_agnostic(_hb._pmod, _hb(), itv, _calc);
180 virtual void run_agnostic_pmod_loop()
182 setup_agnostic_pmods();
184 for (
auto itv = 0; itv < _calc.
numitv; ++itv) {
185 for (
auto row = 0; row < _calc.
itv_size.at(itv); ++row) {
187 const auto& ri = _calc.
adj_ni.at(itv).at(row);
189 *_last_mri, _mitvi, ri.row_time, ri.row_count, ri.row_notes);
191 advance_agnostic_sequencing();
196 swap(_mri, _last_mri);
200 set_agnostic_pmods(itv);
203 _mitvi.handle_interval_end();
206 PatternMods::run_agnostic_smoothing_pass(_calc.
numitv, _calc);
209 PatternMods::bruh_they_the_same(_calc.
numitv, _calc);
213 virtual void reset_row_sequencing()
218 virtual void setup_dependent_mods()
223 virtual void set_dependent_pmods(
const int& itv)
225 PatternMods::set_dependent(
226 hand, _gstream._pmod, _gstream(_mitvghi), itv, _calc);
227 PatternMods::set_dependent(
228 hand, _gbracketing._pmod, _gbracketing(_mitvghi), itv, _calc);
229 PatternMods::set_dependent(
230 hand, _hsw._pmod, _hsw(_mitvghi), itv, _calc);
233 virtual void full_hand_reset()
237 _gstream.full_reset();
238 _gbracketing.full_reset();
245 void set_sequenced_base_diffs(
const int& itv)
const override {
247 _diffz._tc.get_itv_diff(
251 virtual void handle_dependent_interval_end(
const int& itv)
253 set_dependent_pmods(itv);
255 set_sequenced_base_diffs(itv);
258 _diffz.interval_end();
261 virtual void run_dependent_pmod_loop() {
262 setup_dependent_mods();
265 for (
const auto& ids : _calc.hand_col_masks) {
272 auto row_time = s_init;
273 auto last_row_time = s_init;
274 auto any_ms = ms_init;
276 for (
auto itv = 0; itv < _calc.
numitv; ++itv) {
277 for (
auto row = 0; row < _calc.
itv_size.at(itv); row++) {
278 const auto& ri = _calc.
adj_ni.at(itv).at(row);
279 row_time = ri.row_time;
280 row_notes = ri.row_notes;
282 _hsw.advance_sequencing(row_time, row_notes);
284 any_ms = ms_from(row_time, last_row_time);
285 auto masked_notes = row_notes & ids;
287 auto non_empty_cols = find_non_empty_cols(masked_notes);
288 if (non_empty_cols.empty()) {
292 for (
auto& c : non_empty_cols) {
293 lazy_jacks(c, row_time);
297 _mitvghi.handle_row(masked_notes, ids);
302 lazy_jacks.get_lowest_jack_ms(hand, _calc)) *
303 basescalers[Skill_JackSpeed] };
304 if (std::isnan(thing.second)) {
307 _calc.
jack_diff.at(hand).push_back(thing);
309 last_row_time = row_time;
311 handle_dependent_interval_end(itv);
313 PatternMods::run_dependent_smoothing_pass(_calc.
numitv, _calc);
319#if !defined(STANDALONE_CALC) && !defined(PHPCALC)
320 const std::string get_calc_param_xml()
const override
322 return "Save/CalcParams_5k.xml";
325 void load_calc_params_internal(
const XNode& params)
const override
327 load_params_for_mod(¶ms, _cj._params, _cj.name);
328 load_params_for_mod(¶ms, _gbracketing._params, _gbracketing.name);
329 load_params_for_mod(¶ms, _gchordstream._params, _gchordstream.name);
330 load_params_for_mod(¶ms, _gstream._params, _gstream.name);
331 load_params_for_mod(¶ms, _hsw._params, _hsw.name);
334 XNode* make_param_node_internal(
XNode* calcparams)
const override
336 calcparams->AppendChild(
337 make_mod_param_node(_cj._params, _cj.name));
338 calcparams->AppendChild(
339 make_mod_param_node(_gbracketing._params, _gbracketing.name));
340 calcparams->AppendChild(
341 make_mod_param_node(_gchordstream._params, _gchordstream.name));
342 calcparams->AppendChild(
343 make_mod_param_node(_gstream._params, _gstream.name));
344 calcparams->AppendChild(
345 make_mod_param_node(_hsw._params, _hsw.name));