X-Git-Url: http://git.treefish.org/~alex/seamulator.git/blobdiff_plain/ba8f356e863ed4a418f93c155e64eecaea0819bf..refs/heads/noise:/src/synthesizer.cpp diff --git a/src/synthesizer.cpp b/src/synthesizer.cpp index b2254c0..fb920ae 100644 --- a/src/synthesizer.cpp +++ b/src/synthesizer.cpp @@ -31,16 +31,18 @@ #include #include +#include + #include "watersurface.h" -using namespace std::placeholders; +using namespace Eigen; Synthesizer::Synthesizer(ConstWaterSurfacePtr surface) : m_surface{std::move(surface)}, m_startTime{std::chrono::system_clock::now()}, m_lastRuntime{getRuntime()} { - stk::Stk::setSampleRate( 44100.0 ); + stk::Stk::setSampleRate( 48000.0 ); stk::Stk::showWarnings( true ); m_dac = std::make_unique(2); @@ -55,17 +57,28 @@ Synthesizer::Synthesizer(ConstWaterSurfacePtr surface) : // m_dots.emplace_back( std::make_unique(m_surface->at(i, 0), 440.0) ); //} - m_dots.emplace_back( std::make_unique(m_surface->at(0, 0), 939.85) ); - m_dots.emplace_back( std::make_unique(m_surface->at(0, 10), 704.09) ); - m_dots.emplace_back( std::make_unique(m_surface->at(0, 20), 469.92) ); - m_dots.emplace_back( std::make_unique(m_surface->at(0, 30), 352.04) ); - m_dots.emplace_back( std::make_unique(m_surface->at(0, 40), 279.42) ); + srand (time(NULL)); + + const std::vector 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 pos = + { rand() % m_surface->size(), rand() % m_surface->size() }; + m_posDots.emplace_back( + PosDot{pos, std::make_unique(m_surface->at(pos[0], pos[1]), frequency)} ); + } + + // m_dots.emplace_back( std::make_unique(m_surface->at(10, 50), 939.85) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(20, 40), 704.09) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(30, 30), 469.92) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(40, 20), 352.04) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(50, 10), 279.42) ); - m_dots.emplace_back( std::make_unique(m_surface->at(10, 10), 1054.94) ); - m_dots.emplace_back( std::make_unique(m_surface->at(20, 10), 704.09) ); - m_dots.emplace_back( std::make_unique(m_surface->at(30, 10), 527.47) ); - m_dots.emplace_back( std::make_unique(m_surface->at(40, 10), 418.65) ); - m_dots.emplace_back( std::make_unique(m_surface->at(50, 10), 313.64) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(50, 10), 1054.94) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(40, 20), 704.09) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(30, 30), 527.47) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(20, 40), 418.65) ); + // m_dots.emplace_back( std::make_unique(m_surface->at(10, 50), 313.64) ); m_audioThread = std::thread( [this]{audioLoop();} ); @@ -115,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; @@ -172,20 +185,43 @@ void Synthesizer::tick() 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 dotDist; + + for (std::size_t dotIdx = 0; dotIdx < m_posDots.size(); ++dotIdx) { + auto& posDot = m_posDots[dotIdx]; + const Vector2d pos( static_cast(posDot.pos[0]) / m_surface->size(), + static_cast(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);