sequencer
trig_condition.hpp
Go to the documentation of this file.
1 #pragma once
2 
5 
6 #include <cassert>
7 #include <chrono>
8 #include <random>
9 #include <type_traits>
10 #include <utility>
11 
12 namespace sequencer::midi
13 {
15 
16  namespace trig_condition
17  {
18  template < int trig, int size >
20  {
21  static_assert( trig > 0 );
22  static_assert( trig <= size );
23 
24  public:
25  bool operator()() const noexcept
26  {
27  const auto result = ( current_++ == ( trig - 1 ) );
28  current_ %= size;
29  return result;
30  }
31 
32  private:
33  mutable int current_{0};
34  };
35 
36  class random
37  {
38  public:
39  explicit random( int percent ) : percent_( percent )
40  {
41  }
42 
43  bool operator()() const
44  {
45  using clock = std::chrono::system_clock;
46 
47  static const auto seed =
48  clock::from_time_t( std::time( nullptr ) ).time_since_epoch().count();
49  static std::minstd_rand engine( seed );
50  static std::uniform_int_distribution< int > distribution{};
51 
52  return distribution( engine, std::uniform_int_distribution< int >::param_type{
53  0, 99} ) < percent_;
54  }
55 
56  private:
57  int percent_{0};
58  };
59  } // namespace trig_condition
60 } // namespace sequencer::midi
bool operator()() const noexcept
Definition: trig_condition.hpp:25
Definition: trig_condition.hpp:36
bool operator()() const
Definition: trig_condition.hpp:43
Definition: clock.hpp:16
Definition: trig_condition.hpp:19
Definition: clock.hpp:13
random(int percent)
Definition: trig_condition.hpp:39