14 auto result = std::fmod( t, 1.0 );
23 constexpr
explicit pulse_t(
double pulse_width ) noexcept : pulse_width_( pulse_width )
30 return ( t < pulse_width_ ) ? 1 : 0;
40 std::array< double, N > sample;
41 typename std::array< double, N >::size_type counter = 0;
42 std::generate( begin( sample ), end( sample ),
43 [&counter] {
return std::sin( 2 * M_PI *
double( counter++ ) / N ); } );
47 inline double sine(
double t )
49 constexpr
auto sample_rate = 4 * 44100u;
50 static const auto sample = create_sine_sample< sample_rate >();
51 return sample[ std::size_t( t * sample_rate ) % sample_rate ];
57 std::array< double, N > sample;
58 typename std::array< double, N >::size_type counter = 0;
59 std::generate( begin( sample ), end( sample ),
60 [&counter] {
return std::cos( 2 * M_PI *
double( counter++ ) / N ); } );
66 constexpr
auto sample_rate = 4 * 44100u;
67 static const auto sample = create_cosine_sample< sample_rate >();
68 return sample[ std::size_t( t * sample_rate ) % sample_rate ];
71 inline double sinc(
double cutoff,
int i )
79 return -
sine( cutoff * -i ) / ( M_PI * i );
81 return sine( cutoff * i ) / ( M_PI * i );
84 inline double square(
double t ) noexcept
92 const auto value = -1 + 4 * std::fmod( t, 0.5 );
93 return t < 0.5 ? value : -value;
96 inline double saw(
double t ) noexcept
104 constexpr
explicit exp_t(
double scale ) noexcept : scale_{scale}
120 constexpr
explicit ramp_t(
double slope ) noexcept : slope_{slope}
127 return ( t > ( 1 / slope_ ) ) ? 0 : ( slope_ * t );
136 using clock = std::chrono::system_clock;
138 static const auto seed =
139 clock::from_time_t( std::time(
nullptr ) ).time_since_epoch().count();
140 static std::minstd_rand engine( seed );
141 static std::uniform_real_distribution< double > distribution{};
143 return distribution( engine, std::uniform_real_distribution< double >::param_type{
144 -1, 1 + std::numeric_limits< double >::epsilon()} );