// AUTOGENERATED — do not edit. Source: schemas/modes/verb_fx.json. Run `bun run codegen/generate.ts` to regenerate. #ifndef NISPS_GENERATED_VERB_FX_SCHEMA_HPP #define NISPS_GENERATED_VERB_FX_SCHEMA_HPP #include "schema_types.hpp" #include "../../ml/mlp.hpp" namespace nisps::modes::generated { inline constexpr std::string_view kVerbFxModeId = "verb_fx"; inline constexpr std::string_view kVerbFxEngineId = "verb_fx"; inline constexpr std::array kVerbFxInputChannels = {{ "joy_x", "joy_y", "joy_z", "joy_w", }}; inline constexpr std::array kVerbFxHiddenLayers = {{ 10u, 14u, 18u, }}; inline constexpr MLConfig kVerbFxMLConfig = { 4u, 47u, 0.6f, }; inline constexpr std::size_t kVerbFxParamCount = 47u; inline constexpr std::array kVerbFxParams = {{ Param{ "fb_delay_xfade", "Bank/Delay XFade", 0.0f, 1.0f, 0.0f, Curve::linear, "routing", }, Param{ "lp0_fb", "LP Comb 0 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp0_cutoff", "LP Comb 0 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp1_fb", "LP Comb 1 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp1_cutoff", "LP Comb 1 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp2_fb", "LP Comb 2 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp2_cutoff", "LP Comb 2 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp3_fb", "LP Comb 3 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp3_cutoff", "LP Comb 3 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp4_fb", "LP Comb 4 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp4_cutoff", "LP Comb 4 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp5_fb", "LP Comb 5 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp5_cutoff", "LP Comb 5 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp6_fb", "LP Comb 6 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp6_cutoff", "LP Comb 6 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp7_fb", "LP Comb 7 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "lp7_cutoff", "LP Comb 7 Cutoff", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "allp0_fb", "Allpass 0 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "allp1_fb", "Allpass 1 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "allp2_fb", "Allpass 2 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "allp3_fb", "Allpass 3 FB", 0.0f, 1.0f, 0.5f, Curve::linear, "verb", }, Param{ "fbank_f0", "Filterbank Freq 0", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f1", "Filterbank Freq 1", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f2", "Filterbank Freq 2", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f3", "Filterbank Freq 3", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f4", "Filterbank Freq 4", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f5", "Filterbank Freq 5", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f6", "Filterbank Freq 6", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_f7", "Filterbank Freq 7", 0.0f, 1.0f, 0.5f, Curve::linear, "filterbank", }, Param{ "fbank_res0", "Filterbank Res 0", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res1", "Filterbank Res 1", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res2", "Filterbank Res 2", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res3", "Filterbank Res 3", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res4", "Filterbank Res 4", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res5", "Filterbank Res 5", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res6", "Filterbank Res 6", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "fbank_res7", "Filterbank Res 7", 0.0f, 1.0f, 0.0f, Curve::linear, "filterbank", }, Param{ "delay0_time", "Long Delay Time", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay0_fb", "Long Delay FB", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay1_time", "Med Delay Time", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay1_fb", "Med Delay FB", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay2_time", "Short Delay Time", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay2_fb", "Short Delay FB", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "verb_vs_delay", "Verb vs Delay", 0.0f, 1.0f, 0.5f, Curve::linear, "routing", }, Param{ "delay_to_verb", "Delay→Verb Send", 0.0f, 1.0f, 0.0f, Curve::linear, "routing", }, Param{ "delay_morph", "Delay Morph", 0.0f, 1.0f, 0.5f, Curve::linear, "delays", }, Param{ "delay_blend", "Delay Blend", 0.0f, 1.0f, 0.0f, Curve::linear, "delays", }, }}; inline constexpr std::size_t kVerbFxVoiceSpaceCount = 12u; inline constexpr std::array kVerbFxVoiceSpaces = {{ "Default", "Resonant", "Soft", "Cathedral", "Shimmer", "Chamber", "Metallic", "Granular", "Diffuse", "Dark", "Bright", "Harmonic", }}; inline constexpr std::array kVerbFxCurveOverrides = {{ CurveOverride{1u, 29u, Curve::sqrt}, // Resonant.fbank_res0 CurveOverride{1u, 30u, Curve::sqrt}, // Resonant.fbank_res1 CurveOverride{1u, 31u, Curve::sqrt}, // Resonant.fbank_res2 CurveOverride{1u, 32u, Curve::sqrt}, // Resonant.fbank_res3 CurveOverride{1u, 33u, Curve::sqrt}, // Resonant.fbank_res4 CurveOverride{1u, 34u, Curve::sqrt}, // Resonant.fbank_res5 CurveOverride{1u, 35u, Curve::sqrt}, // Resonant.fbank_res6 CurveOverride{1u, 36u, Curve::sqrt}, // Resonant.fbank_res7 CurveOverride{2u, 1u, Curve::square}, // Soft.lp0_fb CurveOverride{2u, 3u, Curve::square}, // Soft.lp1_fb CurveOverride{2u, 5u, Curve::square}, // Soft.lp2_fb CurveOverride{2u, 7u, Curve::square}, // Soft.lp3_fb CurveOverride{2u, 9u, Curve::square}, // Soft.lp4_fb CurveOverride{2u, 11u, Curve::square}, // Soft.lp5_fb CurveOverride{2u, 13u, Curve::square}, // Soft.lp6_fb CurveOverride{2u, 15u, Curve::square}, // Soft.lp7_fb CurveOverride{2u, 17u, Curve::square}, // Soft.allp0_fb CurveOverride{2u, 18u, Curve::square}, // Soft.allp1_fb CurveOverride{2u, 19u, Curve::square}, // Soft.allp2_fb CurveOverride{2u, 20u, Curve::square}, // Soft.allp3_fb CurveOverride{2u, 29u, Curve::square}, // Soft.fbank_res0 CurveOverride{2u, 30u, Curve::square}, // Soft.fbank_res1 CurveOverride{2u, 31u, Curve::square}, // Soft.fbank_res2 CurveOverride{2u, 32u, Curve::square}, // Soft.fbank_res3 CurveOverride{2u, 33u, Curve::square}, // Soft.fbank_res4 CurveOverride{2u, 34u, Curve::square}, // Soft.fbank_res5 CurveOverride{2u, 35u, Curve::square}, // Soft.fbank_res6 CurveOverride{2u, 36u, Curve::square}, // Soft.fbank_res7 CurveOverride{2u, 38u, Curve::square}, // Soft.delay0_fb CurveOverride{2u, 40u, Curve::square}, // Soft.delay1_fb CurveOverride{2u, 42u, Curve::square}, // Soft.delay2_fb CurveOverride{3u, 1u, Curve::sqrt}, // Cathedral.lp0_fb CurveOverride{3u, 3u, Curve::sqrt}, // Cathedral.lp1_fb CurveOverride{3u, 5u, Curve::sqrt}, // Cathedral.lp2_fb CurveOverride{3u, 7u, Curve::sqrt}, // Cathedral.lp3_fb CurveOverride{3u, 9u, Curve::sqrt}, // Cathedral.lp4_fb CurveOverride{3u, 11u, Curve::sqrt}, // Cathedral.lp5_fb CurveOverride{3u, 13u, Curve::sqrt}, // Cathedral.lp6_fb CurveOverride{3u, 15u, Curve::sqrt}, // Cathedral.lp7_fb CurveOverride{3u, 17u, Curve::sqrt}, // Cathedral.allp0_fb CurveOverride{3u, 18u, Curve::sqrt}, // Cathedral.allp1_fb CurveOverride{3u, 19u, Curve::sqrt}, // Cathedral.allp2_fb CurveOverride{3u, 20u, Curve::sqrt}, // Cathedral.allp3_fb CurveOverride{3u, 37u, Curve::sqrt}, // Cathedral.delay0_time CurveOverride{3u, 38u, Curve::sqrt}, // Cathedral.delay0_fb CurveOverride{3u, 39u, Curve::sqrt}, // Cathedral.delay1_time CurveOverride{3u, 40u, Curve::sqrt}, // Cathedral.delay1_fb CurveOverride{3u, 41u, Curve::sqrt}, // Cathedral.delay2_time CurveOverride{3u, 42u, Curve::sqrt}, // Cathedral.delay2_fb CurveOverride{3u, 43u, Curve::square}, // Cathedral.verb_vs_delay CurveOverride{4u, 1u, Curve::sqrt}, // Shimmer.lp0_fb CurveOverride{4u, 3u, Curve::sqrt}, // Shimmer.lp1_fb CurveOverride{4u, 5u, Curve::sqrt}, // Shimmer.lp2_fb CurveOverride{4u, 7u, Curve::sqrt}, // Shimmer.lp3_fb CurveOverride{4u, 9u, Curve::sqrt}, // Shimmer.lp4_fb CurveOverride{4u, 11u, Curve::sqrt}, // Shimmer.lp5_fb CurveOverride{4u, 13u, Curve::sqrt}, // Shimmer.lp6_fb CurveOverride{4u, 15u, Curve::sqrt}, // Shimmer.lp7_fb CurveOverride{4u, 17u, Curve::sqrt}, // Shimmer.allp0_fb CurveOverride{4u, 18u, Curve::sqrt}, // Shimmer.allp1_fb CurveOverride{4u, 19u, Curve::sqrt}, // Shimmer.allp2_fb CurveOverride{4u, 20u, Curve::sqrt}, // Shimmer.allp3_fb CurveOverride{4u, 29u, Curve::sqrt}, // Shimmer.fbank_res0 CurveOverride{4u, 30u, Curve::sqrt}, // Shimmer.fbank_res1 CurveOverride{4u, 31u, Curve::sqrt}, // Shimmer.fbank_res2 CurveOverride{4u, 32u, Curve::sqrt}, // Shimmer.fbank_res3 CurveOverride{4u, 33u, Curve::sqrt}, // Shimmer.fbank_res4 CurveOverride{4u, 34u, Curve::sqrt}, // Shimmer.fbank_res5 CurveOverride{4u, 35u, Curve::sqrt}, // Shimmer.fbank_res6 CurveOverride{4u, 36u, Curve::sqrt}, // Shimmer.fbank_res7 CurveOverride{4u, 38u, Curve::sqrt}, // Shimmer.delay0_fb CurveOverride{4u, 40u, Curve::sqrt}, // Shimmer.delay1_fb CurveOverride{4u, 42u, Curve::sqrt}, // Shimmer.delay2_fb CurveOverride{4u, 43u, Curve::square}, // Shimmer.verb_vs_delay CurveOverride{5u, 1u, Curve::square}, // Chamber.lp0_fb CurveOverride{5u, 3u, Curve::square}, // Chamber.lp1_fb CurveOverride{5u, 5u, Curve::square}, // Chamber.lp2_fb CurveOverride{5u, 7u, Curve::square}, // Chamber.lp3_fb CurveOverride{5u, 9u, Curve::square}, // Chamber.lp4_fb CurveOverride{5u, 11u, Curve::square}, // Chamber.lp5_fb CurveOverride{5u, 13u, Curve::square}, // Chamber.lp6_fb CurveOverride{5u, 15u, Curve::square}, // Chamber.lp7_fb CurveOverride{5u, 17u, Curve::square}, // Chamber.allp0_fb CurveOverride{5u, 18u, Curve::square}, // Chamber.allp1_fb CurveOverride{5u, 19u, Curve::square}, // Chamber.allp2_fb CurveOverride{5u, 20u, Curve::square}, // Chamber.allp3_fb CurveOverride{5u, 29u, Curve::square}, // Chamber.fbank_res0 CurveOverride{5u, 30u, Curve::square}, // Chamber.fbank_res1 CurveOverride{5u, 31u, Curve::square}, // Chamber.fbank_res2 CurveOverride{5u, 32u, Curve::square}, // Chamber.fbank_res3 CurveOverride{5u, 33u, Curve::square}, // Chamber.fbank_res4 CurveOverride{5u, 34u, Curve::square}, // Chamber.fbank_res5 CurveOverride{5u, 35u, Curve::square}, // Chamber.fbank_res6 CurveOverride{5u, 36u, Curve::square}, // Chamber.fbank_res7 CurveOverride{5u, 37u, Curve::square}, // Chamber.delay0_time CurveOverride{5u, 38u, Curve::square}, // Chamber.delay0_fb CurveOverride{5u, 39u, Curve::square}, // Chamber.delay1_time CurveOverride{5u, 40u, Curve::square}, // Chamber.delay1_fb CurveOverride{5u, 41u, Curve::square}, // Chamber.delay2_time CurveOverride{5u, 42u, Curve::square}, // Chamber.delay2_fb CurveOverride{6u, 17u, Curve::sqrt}, // Metallic.allp0_fb CurveOverride{6u, 18u, Curve::sqrt}, // Metallic.allp1_fb CurveOverride{6u, 19u, Curve::sqrt}, // Metallic.allp2_fb CurveOverride{6u, 20u, Curve::sqrt}, // Metallic.allp3_fb CurveOverride{6u, 29u, Curve::sqrt}, // Metallic.fbank_res0 CurveOverride{6u, 30u, Curve::square}, // Metallic.fbank_res1 CurveOverride{6u, 31u, Curve::sqrt}, // Metallic.fbank_res2 CurveOverride{6u, 32u, Curve::square}, // Metallic.fbank_res3 CurveOverride{6u, 33u, Curve::sqrt}, // Metallic.fbank_res4 CurveOverride{6u, 34u, Curve::square}, // Metallic.fbank_res5 CurveOverride{6u, 35u, Curve::sqrt}, // Metallic.fbank_res6 CurveOverride{6u, 36u, Curve::square}, // Metallic.fbank_res7 CurveOverride{7u, 1u, Curve::square}, // Granular.lp0_fb CurveOverride{7u, 3u, Curve::square}, // Granular.lp1_fb CurveOverride{7u, 5u, Curve::square}, // Granular.lp2_fb CurveOverride{7u, 7u, Curve::square}, // Granular.lp3_fb CurveOverride{7u, 9u, Curve::square}, // Granular.lp4_fb CurveOverride{7u, 11u, Curve::square}, // Granular.lp5_fb CurveOverride{7u, 13u, Curve::square}, // Granular.lp6_fb CurveOverride{7u, 15u, Curve::square}, // Granular.lp7_fb CurveOverride{7u, 17u, Curve::square}, // Granular.allp0_fb CurveOverride{7u, 18u, Curve::square}, // Granular.allp1_fb CurveOverride{7u, 19u, Curve::square}, // Granular.allp2_fb CurveOverride{7u, 20u, Curve::square}, // Granular.allp3_fb CurveOverride{7u, 29u, Curve::square}, // Granular.fbank_res0 CurveOverride{7u, 30u, Curve::square}, // Granular.fbank_res1 CurveOverride{7u, 31u, Curve::square}, // Granular.fbank_res2 CurveOverride{7u, 32u, Curve::square}, // Granular.fbank_res3 CurveOverride{7u, 33u, Curve::square}, // Granular.fbank_res4 CurveOverride{7u, 34u, Curve::square}, // Granular.fbank_res5 CurveOverride{7u, 35u, Curve::square}, // Granular.fbank_res6 CurveOverride{7u, 36u, Curve::square}, // Granular.fbank_res7 CurveOverride{7u, 38u, Curve::square}, // Granular.delay0_fb CurveOverride{7u, 40u, Curve::square}, // Granular.delay1_fb CurveOverride{7u, 42u, Curve::sqrt}, // Granular.delay2_fb CurveOverride{7u, 43u, Curve::sqrt}, // Granular.verb_vs_delay CurveOverride{7u, 45u, Curve::square}, // Granular.delay_morph CurveOverride{7u, 46u, Curve::sqrt}, // Granular.delay_blend CurveOverride{8u, 0u, Curve::sqrt}, // Diffuse.fb_delay_xfade CurveOverride{8u, 17u, Curve::sqrt}, // Diffuse.allp0_fb CurveOverride{8u, 18u, Curve::sqrt}, // Diffuse.allp1_fb CurveOverride{8u, 19u, Curve::sqrt}, // Diffuse.allp2_fb CurveOverride{8u, 20u, Curve::sqrt}, // Diffuse.allp3_fb CurveOverride{8u, 29u, Curve::square}, // Diffuse.fbank_res0 CurveOverride{8u, 30u, Curve::square}, // Diffuse.fbank_res1 CurveOverride{8u, 31u, Curve::square}, // Diffuse.fbank_res2 CurveOverride{8u, 32u, Curve::square}, // Diffuse.fbank_res3 CurveOverride{8u, 33u, Curve::square}, // Diffuse.fbank_res4 CurveOverride{8u, 34u, Curve::square}, // Diffuse.fbank_res5 CurveOverride{8u, 35u, Curve::square}, // Diffuse.fbank_res6 CurveOverride{8u, 36u, Curve::square}, // Diffuse.fbank_res7 CurveOverride{8u, 38u, Curve::sqrt}, // Diffuse.delay0_fb CurveOverride{8u, 40u, Curve::sqrt}, // Diffuse.delay1_fb CurveOverride{8u, 42u, Curve::sqrt}, // Diffuse.delay2_fb CurveOverride{9u, 21u, Curve::square}, // Dark.fbank_f0 CurveOverride{9u, 22u, Curve::square}, // Dark.fbank_f1 CurveOverride{9u, 23u, Curve::square}, // Dark.fbank_f2 CurveOverride{9u, 24u, Curve::square}, // Dark.fbank_f3 CurveOverride{9u, 25u, Curve::square}, // Dark.fbank_f4 CurveOverride{9u, 26u, Curve::square}, // Dark.fbank_f5 CurveOverride{9u, 27u, Curve::square}, // Dark.fbank_f6 CurveOverride{9u, 28u, Curve::square}, // Dark.fbank_f7 CurveOverride{9u, 29u, Curve::sqrt}, // Dark.fbank_res0 CurveOverride{9u, 30u, Curve::sqrt}, // Dark.fbank_res1 CurveOverride{9u, 31u, Curve::sqrt}, // Dark.fbank_res2 CurveOverride{9u, 32u, Curve::sqrt}, // Dark.fbank_res3 CurveOverride{9u, 33u, Curve::square}, // Dark.fbank_res4 CurveOverride{9u, 34u, Curve::square}, // Dark.fbank_res5 CurveOverride{9u, 35u, Curve::square}, // Dark.fbank_res6 CurveOverride{9u, 36u, Curve::square}, // Dark.fbank_res7 CurveOverride{10u, 21u, Curve::sqrt}, // Bright.fbank_f0 CurveOverride{10u, 22u, Curve::sqrt}, // Bright.fbank_f1 CurveOverride{10u, 23u, Curve::sqrt}, // Bright.fbank_f2 CurveOverride{10u, 24u, Curve::sqrt}, // Bright.fbank_f3 CurveOverride{10u, 25u, Curve::sqrt}, // Bright.fbank_f4 CurveOverride{10u, 26u, Curve::sqrt}, // Bright.fbank_f5 CurveOverride{10u, 27u, Curve::sqrt}, // Bright.fbank_f6 CurveOverride{10u, 28u, Curve::sqrt}, // Bright.fbank_f7 CurveOverride{10u, 29u, Curve::square}, // Bright.fbank_res0 CurveOverride{10u, 30u, Curve::square}, // Bright.fbank_res1 CurveOverride{10u, 31u, Curve::square}, // Bright.fbank_res2 CurveOverride{10u, 32u, Curve::square}, // Bright.fbank_res3 CurveOverride{10u, 33u, Curve::sqrt}, // Bright.fbank_res4 CurveOverride{10u, 34u, Curve::sqrt}, // Bright.fbank_res5 CurveOverride{10u, 35u, Curve::sqrt}, // Bright.fbank_res6 CurveOverride{10u, 36u, Curve::sqrt}, // Bright.fbank_res7 CurveOverride{11u, 29u, Curve::sqrt}, // Harmonic.fbank_res0 CurveOverride{11u, 30u, Curve::sqrt}, // Harmonic.fbank_res1 CurveOverride{11u, 31u, Curve::sqrt}, // Harmonic.fbank_res2 CurveOverride{11u, 32u, Curve::sqrt}, // Harmonic.fbank_res3 CurveOverride{11u, 33u, Curve::sqrt}, // Harmonic.fbank_res4 CurveOverride{11u, 34u, Curve::sqrt}, // Harmonic.fbank_res5 CurveOverride{11u, 35u, Curve::sqrt}, // Harmonic.fbank_res6 CurveOverride{11u, 36u, Curve::sqrt}, // Harmonic.fbank_res7 }}; inline constexpr UIConfig kVerbFxUI = { PrimaryInput::Joystick, true, false, }; using VerbFxMLP = ::nisps::ml::MLP; inline constexpr ::nisps::ParamSchema kVerbFxSchema = { kVerbFxModeId, kVerbFxEngineId, std::span(kVerbFxInputChannels), kVerbFxMLConfig.input_size, std::span(kVerbFxHiddenLayers), kVerbFxMLConfig.output_size, kVerbFxMLConfig.default_spread, std::span(kVerbFxParams), std::span(kVerbFxVoiceSpaces), std::span(kVerbFxCurveOverrides), kVerbFxUI, }; } // namespace nisps::modes::generated #endif // NISPS_GENERATED_VERB_FX_SCHEMA_HPP