63 std::unique_ptr<metaHandInfo> _last_mhi;
64 std::unique_ptr<metaHandInfo> _mhi;
104 _last_mhi = std::make_unique<metaHandInfo>(calc);
105 _mhi = std::make_unique<metaHandInfo>(calc);
109 const std::array<std::vector<int>, NUM_Skillset> pmods = { {
214 const std::array<float, NUM_Skillset> basescalers = { 0.F, 0.91F, 0.75F,
219 const std::array<std::vector<int>, NUM_Skillset>& get_pmods()
const override
223 const std::array<float, NUM_Skillset>& get_basescalers()
const override
232 const float& adj_npsbase,
234 std::array<float, NUM_Skillset>& pmod_product_cur_interval)
override
244 case Skill_Jumpstream: {
246 std::max<float>(_calc.
pmod_vals.at(hand).at(HS).at(itv), 1.F);
247 *adj_diff /= fastsqrt(
248 _calc.
pmod_vals.at(hand).at(OHJumpMod).at(itv) * 0.95F);
253 pmod_product_cur_interval[Skill_Handstream];
254 *stam_base = std::max<float>(a, b);
256 case Skill_Handstream: {
260 auto a = adj_npsbase;
263 pmod_product_cur_interval[Skill_Jumpstream];
264 *stam_base = std::max<float>(a, b);
266 case Skill_JackSpeed:
268 case Skill_Chordjack:
279 basescalers.at(Skill_Chordjack) *
280 pmod_product_cur_interval[Skill_Chordjack];
282 case Skill_Technical:
285 pmod_product_cur_interval.at(ss) * basescalers.at(ss) /
287 fastpow(_calc.
pmod_vals.at(hand).at(CJ).at(itv) + 0.05F,
291 fastsqrt(_calc.
pmod_vals.at(hand).at(OHJumpMod).at(itv));
298#pragma region hand agnostic pmod loop
300 void full_agnostic_reset()
override
308 _last_mri.get()->reset();
311 void setup_agnostic_pmods()
override
322 void advance_agnostic_sequencing()
override
324 _s.advance_sequencing(_mri->ms_now, _mri->notes);
325 _fj.advance_sequencing(_mri->ms_now, _mri->notes);
326 _tt.advance_sequencing(_mri->ms_now, _mri->notes);
327 _tt2.advance_sequencing(_mri->ms_now, _mri->notes);
330 void set_agnostic_pmods(
const int& itv)
override
337 PatternMods::set_agnostic(_s._pmod, _s(_mitvi), itv, _calc);
338 PatternMods::set_agnostic(_js._pmod, _js(_mitvi), itv, _calc);
339 PatternMods::set_agnostic(_hs._pmod, _hs(_mitvi), itv, _calc);
340 PatternMods::set_agnostic(_cj._pmod, _cj(_mitvi), itv, _calc);
341 PatternMods::set_agnostic(_cjd._pmod, _cjd(_mitvi), itv, _calc);
342 PatternMods::set_agnostic(_hsd._pmod, _hsd(_mitvi), itv, _calc);
343 PatternMods::set_agnostic(_fj._pmod, _fj(), itv, _calc);
344 PatternMods::set_agnostic(_tt._pmod, _tt(), itv, _calc);
345 PatternMods::set_agnostic(_tt2._pmod, _tt2(), itv, _calc);
350#pragma region hand dependent pmod loop
357 _ohj.advance_sequencing(_mhi->_ct, _mhi->_bt);
358 _cjohj.advance_sequencing(_mhi->_ct, _mhi->_bt);
359 _chain.advance_sequencing(
361 _oht.advance_sequencing(_mhi->_mt, _seq.
_mw_any_ms);
362 _voht.advance_sequencing(_mhi->_mt, _seq.
_mw_any_ms);
363 _rm.advance_sequencing(_mhi->_ct, _mhi->_bt, _mhi->_mt, _seq.
_as);
364 _wrr.advance_sequencing(_mhi->_bt,
368 _seq.get_sc_ms_now(_mhi->_ct));
369 _wrjt.advance_sequencing(
370 _mhi->_bt, _mhi->_mt, _mhi->_last_mt, _seq.
_mw_any_ms);
371 _wrjj.advance_sequencing(_mhi->_ct, row_time);
373 _roll.advance_sequencing(_mhi->_ct, row_time);
374 _rolljs.advance_sequencing(_mhi->_ct, row_time);
375 _mj.advance_sequencing(_mhi->_ct, _seq.get_sc_ms_now(_mhi->_ct));
378 void setup_dependent_mods()
override
392 void set_dependent_pmods(
const int& itv)
override
394 PatternMods::set_dependent(hand, _ohj._pmod, _ohj(_mitvhi), itv, _calc);
395 PatternMods::set_dependent(
396 hand, _chain._pmod, _chain(_mitvhi), itv, _calc);
397 PatternMods::set_dependent(
398 hand, _cjohj._pmod, _cjohj(_mitvhi), itv, _calc);
399 PatternMods::set_dependent(
400 hand, _oht._pmod, _oht(_mitvhi._itvhi), itv, _calc);
401 PatternMods::set_dependent(
402 hand, _voht._pmod, _voht(_mitvhi._itvhi), itv, _calc);
403 PatternMods::set_dependent(
404 hand, _bal._pmod, _bal(_mitvhi._itvhi), itv, _calc);
405 PatternMods::set_dependent(
406 hand, _roll._pmod, _roll(_mitvhi._itvhi), itv, _calc);
407 PatternMods::set_dependent(
408 hand, _rolljs._pmod, _rolljs(_mitvhi._itvhi), itv, _calc);
409 PatternMods::set_dependent(
410 hand, _ch._pmod, _ch(_mitvhi._itvhi.
get_taps_nowi()), itv, _calc);
411 PatternMods::set_dependent(
412 hand, _rm._pmod, _rm(_mitvhi._itvhi.
get_taps_nowi()), itv, _calc);
413 PatternMods::set_dependent(
414 hand, _wrb._pmod, _wrb(_mitvhi._itvhi), itv, _calc);
415 PatternMods::set_dependent(
416 hand, _wrr._pmod, _wrr(_mitvhi._itvhi), itv, _calc);
417 PatternMods::set_dependent(
418 hand, _wrjt._pmod, _wrjt(_mitvhi._itvhi), itv, _calc);
419 PatternMods::set_dependent(
420 hand, _wrjj._pmod, _wrjj(_mitvhi._itvhi), itv, _calc);
421 PatternMods::set_dependent(
422 hand, _wra._pmod, _wra(_mitvhi._itvhi, _seq.
_as), itv, _calc);
423 PatternMods::set_dependent(
424 hand, _mj._pmod, _mj(_mitvhi._itvhi), itv, _calc);
437 _rolljs.full_reset();
452 _last_mhi->full_reset();
456 void handle_dependent_interval_end(
const int& itv)
override
466 set_dependent_pmods(itv);
470 set_sequenced_base_diffs(itv);
472 _diffz.interval_end();
478 const int& jack_counter,
479 const float& row_time,
484 ms_to_scaled_nps(_seq.
_as.get_lowest_jack_ms()) *
485 basescalers[Skill_JackSpeed] };
486 if (std::isnan(thing.second)) {
491 _calc.
jack_diff.at(hand).push_back(thing);
498 row_time, _seq.get_mw_sc_ms(ct).get_cv_of_window(4));
502 row_time, _seq.get_mw_sc_ms(ct).get_cv_of_window(4));
506 row_time, _seq.get_mw_sc_ms(ct).get_cv_of_window(4));
508 row_time, _seq.get_mw_sc_ms(ct).get_cv_of_window(4));
517 _diffz._cj.advance_base(any_ms, _calc);
520 _diffz._tc.advance_base(_seq, ct, _calc, hand, row_time);
521 _diffz._tc.advance_rm_comp(_rm.get_highest_anchor_difficulty());
522 _diffz._tc.advance_jack_comp(_seq.
_as.get_lowest_jack_ms());
525 void set_sequenced_base_diffs(
const int& itv)
const override
530 _diffz._tc.get_itv_jack_diff();
533 _diffz._cj.get_itv_diff(_calc);
538 _diffz._tc.get_itv_diff(
543 _diffz._tc.get_itv_rma_diff();
546 void run_dependent_pmod_loop()
override
548 setup_dependent_mods();
550 for (
const auto& ids : _calc.hand_col_masks) {
551 auto row_time = s_init;
552 auto last_row_time = s_init;
553 auto any_ms = ms_init;
565 std::vector<std::pair<float, float>>());
578 for (
auto itv = 0; itv < _calc.
numitv; ++itv) {
579 auto jack_counter = 0;
580 for (
auto row = 0; row < _calc.
itv_size.at(itv); ++row) {
582 const auto& ri = _calc.
adj_ni.at(itv).at(row);
583 row_time = ri.row_time;
584 row_notes = ri.row_notes;
585 const auto row_count = ri.row_count;
588 any_ms = ms_from(row_time, last_row_time);
594 ct = determine_col_type(row_notes, ids);
600 if (ct == col_empty) {
601 _rm.advance_off_hand_sequencing();
602 _mj.advance_off_hand_sequencing();
603 if (row_count == 2) {
604 _rm.advance_off_hand_sequencing();
610 _diffz._cj.update_flags(row_notes & ids,
611 std::popcount(row_notes & ids));
615 _seq.advance_sequencing(ct, row_time, any_ms);
621 (*_mhi)(*_last_mhi, ct);
624 _mitvhi._itvhi.set_col_taps(ct);
634 ct, itv, jack_counter, row_time, any_ms);
639 if (_mhi->_bt != base_type_init) {
640 ++_mitvhi._base_types.at(_mhi->_bt);
641 ++_mitvhi._meta_types.at(_mhi->_mt);
645 std::swap(_last_mhi, _mhi);
646 last_row_time = row_time;
652 handle_dependent_interval_end(itv);
654 PatternMods::run_dependent_smoothing_pass(_calc.
numitv, _calc);
666#if !defined(STANDALONE_CALC) && !defined(PHPCALC)
667 const std::string get_calc_param_xml()
const override
669 return "Save/CalcParams_4k.xml";
672 void load_calc_params_internal(
const XNode& params)
const override {
674 load_params_for_mod(¶ms, _diffz._cj._params, _diffz._cj.name);
675 load_params_for_mod(¶ms, _diffz._tc._params, _diffz._tc.name);
678 load_params_for_mod(¶ms, _s._params, _s.name);
679 load_params_for_mod(¶ms, _js._params, _js.name);
680 load_params_for_mod(¶ms, _hs._params, _hs.name);
681 load_params_for_mod(¶ms, _cj._params, _cj.name);
682 load_params_for_mod(¶ms, _cjd._params, _cjd.name);
683 load_params_for_mod(¶ms, _hsd._params, _hsd.name);
684 load_params_for_mod(¶ms, _ohj._params, _ohj.name);
685 load_params_for_mod(¶ms, _cjohj._params, _cjohj.name);
686 load_params_for_mod(¶ms, _chain._params, _chain.name);
687 load_params_for_mod(¶ms, _bal._params, _bal.name);
688 load_params_for_mod(¶ms, _oht._params, _oht.name);
689 load_params_for_mod(¶ms, _voht._params, _voht.name);
690 load_params_for_mod(¶ms, _ch._params, _ch.name);
691 load_params_for_mod(¶ms, _rm._params, _rm.name);
692 load_params_for_mod(¶ms, _roll._params, _roll.name);
693 load_params_for_mod(¶ms, _rolljs._params, _rolljs.name);
694 load_params_for_mod(¶ms, _wrb._params, _wrb.name);
695 load_params_for_mod(¶ms, _wrr._params, _wrr.name);
696 load_params_for_mod(¶ms, _wrjt._params, _wrjt.name);
697 load_params_for_mod(¶ms, _wrjj._params, _wrjj.name);
698 load_params_for_mod(¶ms, _wra._params, _wra.name);
699 load_params_for_mod(¶ms, _mj._params, _mj.name);
700 load_params_for_mod(¶ms, _fj._params, _fj.name);
701 load_params_for_mod(¶ms, _tt._params, _tt.name);
702 load_params_for_mod(¶ms, _tt2._params, _tt2.name);
705 XNode* make_param_node_internal(
XNode* calcparams)
const override
708 calcparams->AppendChild(
709 make_mod_param_node(_diffz._cj._params, _diffz._cj.name));
710 calcparams->AppendChild(
711 make_mod_param_node(_diffz._tc._params, _diffz._tc.name));
714 calcparams->AppendChild(make_mod_param_node(_s._params, _s.name));
715 calcparams->AppendChild(make_mod_param_node(_js._params, _js.name));
716 calcparams->AppendChild(make_mod_param_node(_hs._params, _hs.name));
717 calcparams->AppendChild(make_mod_param_node(_cj._params, _cj.name));
718 calcparams->AppendChild(make_mod_param_node(_cjd._params, _cjd.name));
719 calcparams->AppendChild(make_mod_param_node(_hsd._params, _hsd.name));
720 calcparams->AppendChild(make_mod_param_node(_ohj._params, _ohj.name));
721 calcparams->AppendChild(
722 make_mod_param_node(_cjohj._params, _cjohj.name));
723 calcparams->AppendChild(
724 make_mod_param_node(_chain._params, _chain.name));
725 calcparams->AppendChild(make_mod_param_node(_bal._params, _bal.name));
726 calcparams->AppendChild(make_mod_param_node(_oht._params, _oht.name));
727 calcparams->AppendChild(make_mod_param_node(_voht._params, _voht.name));
728 calcparams->AppendChild(make_mod_param_node(_ch._params, _ch.name));
729 calcparams->AppendChild(make_mod_param_node(_rm._params, _rm.name));
730 calcparams->AppendChild(make_mod_param_node(_roll._params, _roll.name));
731 calcparams->AppendChild(make_mod_param_node(_rolljs._params, _rolljs.name));
732 calcparams->AppendChild(make_mod_param_node(_wrb._params, _wrb.name));
733 calcparams->AppendChild(make_mod_param_node(_wrr._params, _wrr.name));
734 calcparams->AppendChild(make_mod_param_node(_wrjt._params, _wrjt.name));
735 calcparams->AppendChild(make_mod_param_node(_wrjj._params, _wrjj.name));
736 calcparams->AppendChild(make_mod_param_node(_wra._params, _wra.name));
737 calcparams->AppendChild(make_mod_param_node(_mj._params, _mj.name));
738 calcparams->AppendChild(make_mod_param_node(_fj._params, _fj.name));
739 calcparams->AppendChild(make_mod_param_node(_tt._params, _tt.name));
740 calcparams->AppendChild(make_mod_param_node(_tt2._params, _tt2.name));