From e13e346ebae132cb8c565c38836fc0e800f88a98 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 27 Sep 2025 15:37:13 +1000 Subject: plugin/cp: O(n) monstercat Closes #708 Looks slightly worse I think, but not by much --- plugin/src/Caelestia/Services/cavaprovider.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/plugin/src/Caelestia/Services/cavaprovider.cpp b/plugin/src/Caelestia/Services/cavaprovider.cpp index 81477d7..d51b7c6 100644 --- a/plugin/src/Caelestia/Services/cavaprovider.cpp +++ b/plugin/src/Caelestia/Services/cavaprovider.cpp @@ -32,18 +32,24 @@ void CavaProcessor::process() { cava_execute(m_in, count, m_out, m_plan); // Apply monstercat filter - for (int i = 0; i < m_bars; i++) { - for (int j = i - 1; j >= 0; j--) { - m_out[j] = std::max(m_out[i] / std::pow(1.5, i - j), m_out[j]); - } - for (int j = i + 1; j < m_bars; j++) { - m_out[j] = std::max(m_out[i] / std::pow(1.5, j - i), m_out[j]); - } + QVector values(m_bars); + + // Left to right pass + const double inv = 1.0 / 1.5; + double carry = 0.0; + for (int i = 0; i < m_bars; ++i) { + carry = std::max(m_out[i], carry * inv); + values[i] = carry; + } + + // Right to left pass and combine + carry = 0.0; + for (int i = m_bars - 1; i >= 0; --i) { + carry = std::max(m_out[i], carry * inv); + values[i] = std::max(values[i], carry); } // Update values - QVector values(m_bars); - std::copy(m_out, m_out + m_bars, values.begin()); if (values != m_values) { m_values = std::move(values); emit valuesChanged(m_values); -- cgit v1.2.3-freya