50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
|
#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;
|
||
|
}
|
||
|
}
|