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}
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)
#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)},
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) );
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;
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);
}