sequencer
lfo.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <cmath>
6 #include <limits>
7 #include <utility>
8 
9 namespace sequencer::midi
10 {
11  enum class lfo_mode
12  {
13  triangular = 0,
14  sine,
15  square,
16  saw,
17  exp,
18  ramp,
19  random
20  };
21 
22  template < class T >
23  T lfo_impl( double pos, double period_length, double speed, double phase, T min, T max,
24  lfo_mode mode )
25  {
26  period_length /= std::abs( speed );
27  pos += phase * period_length;
28  pos = std::fmod( pos, period_length ) / period_length;
29  if ( speed < 0 )
30  {
31  pos = std::fmod( 1 - pos, period_length ) - std::numeric_limits< double >::epsilon();
32  }
33  auto value = 0.0;
34  switch ( mode )
35  {
37  value = wave_form::triangular( pos );
38  break;
39  case lfo_mode::sine:
40  value = wave_form::sine( pos );
41  break;
42  case lfo_mode::square:
43  value = wave_form::square( pos );
44  break;
45  case lfo_mode::saw:
46  value = wave_form::saw( pos );
47  break;
48  case lfo_mode::exp:
49  value = wave_form::exp_t{8}( pos );
50  break;
51  case lfo_mode::ramp:
52  value = wave_form::ramp_t{4.0 / 3}( pos );
53  break;
54  case lfo_mode::random:
55  value = wave_form::random();
56  break;
57  }
58  return 0.5 * ( max + min + ( max - min ) * value );
59  }
60 
61  template < class T >
62  T lfo( std::size_t pulse_count, std::size_t pulses_per_quarter_note, int speed, int phase,
63  T min, T max, lfo_mode mode )
64  {
65  const auto period_length = 4 * pulses_per_quarter_note * 128;
66  pulse_count %= std::size_t( period_length );
67  return lfo_impl< T >( pulse_count, period_length, speed, phase / 128.0, min, max, mode );
68  }
69 } // namespace sequencer::midi
T lfo_impl(double pos, double period_length, double speed, double phase, T min, T max, lfo_mode mode)
Definition: lfo.hpp:23
Definition: wave_form.hpp:101
Definition: wave_form.hpp:117
T lfo(std::size_t pulse_count, std::size_t pulses_per_quarter_note, int speed, int phase, T min, T max, lfo_mode mode)
Definition: lfo.hpp:62
Definition: clock.hpp:13
lfo_mode
Definition: lfo.hpp:11