#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)},
// m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(i, 0), 440.0) );
//}
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(0, 0), 939.85) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(0, 10), 704.09) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(0, 20), 469.92) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(0, 30), 352.04) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(0, 40), 279.42) );
+ srand (time(NULL));
+
+ 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) {
+ 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) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(40, 20), 352.04) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(50, 10), 279.42) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(10, 10), 1054.94) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(20, 10), 704.09) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(30, 10), 527.47) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(40, 10), 418.65) );
- m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(50, 10), 313.64) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(50, 10), 1054.94) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(40, 20), 704.09) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(30, 30), 527.47) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(20, 40), 418.65) );
+ // m_dots.emplace_back( std::make_unique<Dot>(m_surface->at(10, 50), 313.64) );
m_audioThread = std::thread( [this]{audioLoop();} );
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;
void Synthesizer::audioLoop()
{
stk::PRCRev effect0(0.5);
- stk::Echo effect;
+ stk::Echo echo1;
+ stk::Echo echo2{4000};
+ 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);
}
// frames = effect0.tick(frames);
-// frames = effect.tick(frames);
+ frames = echo1.tick(frames);
+ // frames = echo2.tick(frames);
+ // frames = echo3.tick(frames);
+
frames = chorus.tick(frames);
m_dac->tick(frames);