#include "Sine.hpp" namespace muz { /*explicit*/ Sine::Sine(AudioConf const& conf, std::unique_ptr freq, std::unique_ptr amplitude) : m_conf { conf } , m_freq { std::move(freq) } , m_amplitude { std::move(amplitude) } { for (size_t i=0; i(m_conf.channels()); i++) { m_phases.push_back(0.0f); } } /*virtual*/ Sine::~Sine() { } std::vector Sine::next() /*override*/ { assert(m_freq); assert(m_amplitude); std::vector out; auto freqs = m_freq->next(); auto amps = m_amplitude->next(); if (freqs.size() != amps.size() || freqs.size() != m_phases.size()) { throw signal_error {"cannot generate sine: channel number mismatch"}; } for (size_t i=0; i(m_conf.channels()); i++) { float const value = amps[i] * std::sin(m_phases[i]); m_phases[i] += 2 * M_PI * freqs[i] / static_cast(m_conf.samplerate()); out.push_back(value); } return out; } }