From eaf8314a68071938e20ce9d7a757d719ae0675a7 Mon Sep 17 00:00:00 2001 From: thibaudk Date: Wed, 30 Oct 2024 13:07:46 +0000 Subject: [PATCH] [display] first working extremly dirty poc --- Amuencha/AmuenchaModel.hpp | 8 ++++---- Amuencha/AmuenchaUi.hpp | 19 ++++++++++++++----- Amuencha/SpiralDisplay.cpp | 5 +++++ Amuencha/SpiralDisplay.hpp | 11 ++++++----- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Amuencha/AmuenchaModel.hpp b/Amuencha/AmuenchaModel.hpp index c2b9703..b19dfb0 100644 --- a/Amuencha/AmuenchaModel.hpp +++ b/Amuencha/AmuenchaModel.hpp @@ -58,10 +58,10 @@ public: [&] (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}); + this->send_message({.min = inputs.min, + .max = inputs.max, + .reassigned_frequencies = r_f, + .power_spectrum = p_s}); }, inputs.periods); diff --git a/Amuencha/AmuenchaUi.hpp b/Amuencha/AmuenchaUi.hpp index 95b646a..dd72f2e 100644 --- a/Amuencha/AmuenchaUi.hpp +++ b/Amuencha/AmuenchaUi.hpp @@ -30,20 +30,25 @@ struct Model::ui // Define the communication between UI and processor. struct bus { - std::function&)> send_message; + std::function&&)> send_message; // Set up connections void init(ui& self) { - self.spiral.on_new_frequencies = [&] - { - send_message(self.spiral.get_frequencies()); - }; + self.spiral.set_frequencies_callback( + [&] { this->send_message(self.spiral.get_frequencies()); } + ); } // Receive a message on the UI thread from the processing thread static void process_message(ui& self, const processor_to_ui& msg) { + if (!first_msg) + { + self.spiral.compute_frequencies(); + first_msg = true; + } + // self.spiral.set_min_max_notes(msg.min, msg.max); if (msg.power_spectrum.empty() || @@ -53,6 +58,10 @@ struct Model::ui self.spiral.power_handler(msg.reassigned_frequencies, msg.power_spectrum); } + + static bool first_msg; }; }; } + +inline bool Amuencha::Model::ui::bus::first_msg = false; diff --git a/Amuencha/SpiralDisplay.cpp b/Amuencha/SpiralDisplay.cpp index 8a5f15d..08da440 100644 --- a/Amuencha/SpiralDisplay.cpp +++ b/Amuencha/SpiralDisplay.cpp @@ -29,6 +29,11 @@ std::vector Amuencha::SpiralDisplay::get_frequencies() const noexcept return frequencies; } +void Amuencha::SpiralDisplay::set_frequencies_callback(std::function &&callback) +{ + on_new_frequencies = callback; +} + void Amuencha::SpiralDisplay::compute_frequencies() { // Now the spiral diff --git a/Amuencha/SpiralDisplay.hpp b/Amuencha/SpiralDisplay.hpp index 927502d..492c6c7 100644 --- a/Amuencha/SpiralDisplay.hpp +++ b/Amuencha/SpiralDisplay.hpp @@ -58,7 +58,7 @@ struct SpiralDisplay for (int b{0}; b < display_spectrum.size(); ++b) { - float amplitude = 0.8 / num_octaves * std::min(1.f, display_spectrum[b] * gain); + float amplitude = 0.8 / num_octaves * std::min(1.f, display_spectrum[b] * 100); //if (display_spectrum[b]>0) cout << display_spectrum[b] << endl; // power normalised between 0 and 1 => 0.1 = spiral branch float r = spiral_r_a[b].r + amplitude; @@ -69,8 +69,8 @@ struct SpiralDisplay ctx.line_to(x(p.real()), y(p.imag())); } - for (int b = spiral_positions.size() - 1; b >= 0; --b) - ctx.line_to(x(spiral_positions[b].real()), y(spiral_positions[b].imag())); + // for (int b = spiral_positions.size() - 1; b >= 0; --b) + // ctx.line_to(x(spiral_positions[b].real()), y(spiral_positions[b].imag())); ctx.stroke(); ctx.update(); @@ -78,13 +78,14 @@ struct SpiralDisplay [[nodiscard]] std::vector get_frequencies() const noexcept; - std::function on_new_frequencies; + void set_frequencies_callback(std::function&& callback); // // Callback when the power spectrum is available at the prescribed frequencies // // The ID is that of the caller, setting the color of the display void power_handler(const std::vector& reassigned_frequencies, const std::vector& power_spectrum); + void compute_frequencies(); private: static const constexpr std::string_view note_names[12] {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; @@ -134,7 +135,7 @@ private: return half - y * half; } - void compute_frequencies(); + std::function on_new_frequencies; }; }