muzgen/lib/Sine.cpp

50 lines
1.1 KiB
C++
Raw Normal View History

#include "Sine.hpp"
namespace muz
{
/*explicit*/ Sine::Sine(AudioConf const& conf,
std::unique_ptr<Signal> freq,
std::unique_ptr<Signal> amplitude)
: m_conf { conf }
, m_freq { std::move(freq) }
, m_amplitude { std::move(amplitude) }
{
for (size_t i=0; i<static_cast<size_t>(m_conf.channels()); i++)
{
m_phases.push_back(0.0f);
}
}
/*virtual*/ Sine::~Sine()
{
}
std::vector<float> Sine::next() /*override*/
{
assert(m_freq);
assert(m_amplitude);
std::vector<float> 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<static_cast<size_t>(m_conf.channels()); i++)
{
float const value = amps[i] * std::sin(m_phases[i]);
m_phases[i] += 2 * M_PI * freqs[i]
/ static_cast<float>(m_conf.samplerate());
out.push_back(value);
}
return out;
}
}