#pragma once #include #include #include #include #include "FrequencyAnalyzer.hpp" namespace Amuencha { class Model { public: halp_meta(name, "Amuencha") halp_meta(category, "Audio") halp_meta(c_name, "amuencha") halp_meta(uuid, "b37351b4-7b8d-4150-9e1c-708eec9182b2") // This one will be memcpy'd as it is a trivial type struct processor_to_ui { int min; int max; std::vector reassigned_frequencies; std::vector power_spectrum; }; std::function send_message; // Define inputs and outputs ports. // See the docs at https://github.com/celtera/avendish struct ins { halp::fixed_audio_bus<"Input", float, 1> audio; struct : halp::hslider_i32<"Min", halp::range{.min = 0, .max = 127, .init = 24}> { void update(Model& self) { self.send_message({.min = this->value, .max = self.inputs.max}); } } min; struct : halp::hslider_i32<"Min", halp::range{.min = 0, .max = 127, .init = 72}> { void update(Model& self) { self.send_message({.min = self.inputs.min, .max = this->value}); } } max; halp::spinbox_i32<"Periods", halp::range{.min = 0, .max = 99, .init = 30}> periods; } inputs; void process_message(const std::vector& frequencies) { analyzer.setup(sampling_rate, frequencies, [&] (const std::vector& r_f, const std::vector& p_s) { send_message({.min = inputs.min, .max = inputs.max, .reassigned_frequencies = r_f, .power_spectrum = p_s}); }, inputs.periods); analyzer.start(QThread::NormalPriority); } struct outs { halp::midi_bus<"Output"> midi; } outputs; using setup = halp::setup; void prepare(halp::setup info); // Do our processing for N samples using tick = halp::tick; // Defined in the .cpp void operator()(halp::tick t); // UI is defined in another file to keep things clear. struct ui; private: float sampling_rate; FrequencyAnalyzer analyzer; }; }