]> git.treefish.org Git - seamulator.git/commitdiff
Distribute dots in space
authorAlexander Schmidt <alex@treefish.org>
Sat, 27 Feb 2021 09:47:43 +0000 (10:47 +0100)
committerAlexander Schmidt <alex@treefish.org>
Sat, 27 Feb 2021 09:47:43 +0000 (10:47 +0100)
include/dot.h
include/posdot.h [new file with mode: 0644]
include/synthesizer.h
src/CMakeLists.txt
src/synthesizer.cpp

index 28792ff9f1385246ee8b41fa6b0b7eeee790b756..4e086bdc6e77678547bd56bd734264cbdd480f22 100644 (file)
@@ -1,3 +1,5 @@
+#pragma once
+
 #include <mutex>
 
 #include "Plucked.h"
diff --git a/include/posdot.h b/include/posdot.h
new file mode 100644 (file)
index 0000000..611c387
--- /dev/null
@@ -0,0 +1,8 @@
+#pragma once
+
+#include "dot.h"
+
+struct PosDot {
+    std::array<int, 2> pos;
+    std::unique_ptr<Dot> dot;
+};
index 5d380539830f4a094c5dcc2cc756672b6ef12926..9dc3b613c80be26ffd90f2b6b20d75b3275cd075 100644 (file)
@@ -31,6 +31,7 @@
 #include "Plucked.h"
 
 #include "dot.h"
+#include "posdot.h"
 
 class Synthesizer {
 
@@ -64,7 +65,7 @@ private:
 
     void audioLoop();
 
-    std::vector<std::unique_ptr<Dot>> m_dots;
+    std::vector<PosDot> m_posDots;
     
     stk::Plucked m_sine1;
     stk::Plucked m_sine2;
index 75990a0ab0033f2764f255f5a5c31ea83349d8bf..41c3754e5f815f8ea0671a66f0b4f89ee626de14 100644 (file)
@@ -9,6 +9,7 @@ find_package(STK REQUIRED)
 find_package(Boost 1.40 COMPONENTS program_options REQUIRED)
 find_package(ALSA REQUIRED)
 find_package(Threads REQUIRED)
+find_package(Eigen3 3.3 REQUIRED NO_MODULE)
 
 include_directories(${seamulator_SOURCE_DIR}/include
                     ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS}
@@ -21,7 +22,7 @@ add_executable(seamulator seamulator.cpp
 
 target_link_libraries(seamulator ${OPENGL_LIBRARIES} ${GLUT_LIBRARY}
                                  ${FFTW_LIBRARIES} ${Boost_LIBRARIES}
-                                 ${STK_LIBRARY} ${ALSA_LIBRARIES} ${})
+                                 ${STK_LIBRARY} ${ALSA_LIBRARIES} Eigen3::Eigen)
 
 
 target_link_libraries(seamulator PRIVATE Threads::Threads)
index 5943b06d400a4cfbb63afff8afdff1b40076add1..8352e7a692dcb17c716187dd9a8b3ddf571eb028 100644 (file)
 #include <PRCRev.h>
 #include <NRev.h>
 
+#include <Eigen/Dense>
+
 #include "watersurface.h"
 
-using namespace std::placeholders;
+using namespace Eigen;
 
 Synthesizer::Synthesizer(ConstWaterSurfacePtr surface) :
     m_surface{std::move(surface)},
@@ -60,9 +62,12 @@ Synthesizer::Synthesizer(ConstWaterSurfacePtr surface) :
     const std::vector<double> frequencies = {939.85, 704.09, 469.92, 352.04, 279.42, 1054.94, 704.09, 527.47, 418.65, 313.64};
 
     for (const auto& frequency : frequencies) {
-        m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(rand() % m_surface->size(), rand() %  m_surface->size()), frequency) );
+        const std::array<int, 2> pos =
+            { rand() % m_surface->size(), rand() %  m_surface->size() };
+        m_posDots.emplace_back(
+            PosDot{pos, std::make_unique<Dot>(m_surface->at(pos[0], pos[1]), frequency)} );
     }
-    
+
     // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(10, 50), 939.85) );
     // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(20, 40), 704.09) );
     // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(30, 30), 469.92) );
@@ -123,8 +128,8 @@ void Synthesizer::tick()
     const auto runtime = getRuntime();
     const auto deltaT = runtime - m_lastRuntime;
 
-    for (auto& dot : m_dots) {
-        dot->advance(deltaT);
+    for (auto& posDot : m_posDots) {
+        posDot.dot->advance(deltaT);
     }
     
 //     const auto posBefore = m_pos;
@@ -185,12 +190,30 @@ void Synthesizer::audioLoop()
     stk::Echo echo3{7000};
     stk::Chorus chorus{6000};
     stk::StkFrames frames(88200, 2);
+
+
+    const Vector2d leftPos{0.0, -1.0};
+    const Vector2d rightPos{1.0, -1.0};
+
+    std::vector<double> dotDist;
+
+    for (std::size_t dotIdx = 0; dotIdx < m_posDots.size(); ++dotIdx) {
+        auto& posDot = m_posDots[dotIdx];
+        const Vector2d pos( static_cast<double>(posDot.pos[0]) / m_surface->size(),
+                            static_cast<double>(posDot.pos[1]) / m_surface->size() );
+        dotDist.emplace_back( (leftPos - pos).squaredNorm() );
+        dotDist.emplace_back( (rightPos - pos).squaredNorm() );
+    }
+
     while (!m_stop) {
         for (int i = 0; i < 88200; i++) {
             frames(i, 0) *= 0;
             frames(i, 1) *= 0;
-            for (std::size_t dotIdx = 0; dotIdx < m_dots.size(); ++dotIdx) {
-                frames(i, dotIdx % 2 == 0 ? 1 : 0) += m_dots[dotIdx]->tick();
+            for (std::size_t dotIdx = 0; dotIdx < m_posDots.size(); ++dotIdx) {
+                const auto tick = m_posDots[dotIdx].dot->tick();
+                frames(i, 0) += tick / dotDist[dotIdx*2];
+                frames(i, 1) += tick / dotDist[dotIdx*2+1];
+                // frames(i, 1) += (1.0 - normPosX) * tick;
             }
             //frames(i,1) = frames(i,0);
         }