sequencer
pattern.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <vector>
6 
7 namespace sequencer::midi
8 {
9  template < class Track >
10  class pattern_t
11  {
12  public:
13  using value_type = Track;
14  using size_type = typename std::vector< value_type >::size_type;
15 
16  explicit pattern_t( size_type size, size_type track_size )
17  : tracks_( size, Track( track_size ) )
18  {
19  }
20 
22  {
23  return tracks_[ i ];
24  }
25 
26  const value_type& operator[]( size_type i ) const
27  {
28  return tracks_[ i ];
29  }
30 
31  auto begin()
32  {
33  return tracks_.begin();
34  }
35 
36  auto begin() const
37  {
38  return tracks_.begin();
39  }
40 
41  auto end()
42  {
43  return tracks_.end();
44  }
45 
46  auto end() const
47  {
48  return tracks_.end();
49  }
50 
51  size_type size() const noexcept
52  {
53  return tracks_.size();
54  }
55 
56  void set_steps( std::size_t new_steps, std::size_t copy_offset = 0 )
57  {
58  for ( auto& track : tracks_ )
59  {
60  track.set_steps( new_steps, copy_offset );
61  }
62  }
63 
64  void set_steps_per_beat( std::size_t steps )
65  {
66  for ( auto& track : tracks_ )
67  {
68  track.set_steps_per_beat( steps );
69  }
70  }
71 
72  void set_pulses_per_quarter_note( std::size_t pulses_per_quarter )
73  {
74  for ( auto& track : tracks_ )
75  {
76  track.set_pulses_per_quarter_note( pulses_per_quarter );
77  }
78  }
79 
80  constexpr void set_loop_length( std::size_t loop_length ) noexcept
81  {
82  for ( auto& track : tracks_ )
83  {
84  track.set_loop_length( loop_length );
85  }
86  }
87 
88  constexpr void set_speed_multiplier( double speed ) noexcept
89  {
90  for ( auto& track : tracks_ )
91  {
92  track.set_speed_multiplier( speed );
93  }
94  }
95 
96  template < class Sender >
97  void send_messages( message_t< 1 > message, const Sender& sender )
98  {
99  for ( auto& track : tracks_ )
100  {
101  track.send_messages( message, sender );
102  }
103  }
104 
105  private:
106  std::vector< value_type > tracks_;
107  };
108 
109  template < class Track >
111  make_pattern( std::size_t number_of_tracks, std::size_t number_of_steps,
112  std::size_t pulses_per_quarter_note = default_pulses_per_quarter_note ) noexcept
113  {
114  auto pattern = pattern_t< Track >{number_of_tracks, number_of_steps};
115 
116  std::uint8_t channel = 0;
117  for ( auto& track : pattern )
118  {
119  track.set_channel( channel++ );
120  track.set_pulses_per_quarter_note( pulses_per_quarter_note );
121  };
122 
123  return pattern;
124  }
125 
126 } // namespace sequencer::midi
typename std::vector< value_type >::size_type size_type
Definition: pattern.hpp:14
pattern_t< Track > make_pattern(std::size_t number_of_tracks, std::size_t number_of_steps, std::size_t pulses_per_quarter_note=default_pulses_per_quarter_note) noexcept
Definition: pattern.hpp:111
void set_pulses_per_quarter_note(std::size_t pulses_per_quarter)
Definition: pattern.hpp:72
auto end() const
Definition: pattern.hpp:46
void set_steps(std::size_t new_steps, std::size_t copy_offset=0)
Definition: pattern.hpp:56
value_type & operator[](size_type i)
Definition: pattern.hpp:21
size_type size() const noexcept
Definition: pattern.hpp:51
Track value_type
Definition: pattern.hpp:13
std::conditional_t< greater_than< number_of_bytes, 0 >::value, std::array< std::byte, number_of_bytes >, std::vector< std::byte > > message_t
Definition: message_type.hpp:18
auto end()
Definition: pattern.hpp:41
constexpr void set_speed_multiplier(double speed) noexcept
Definition: pattern.hpp:88
auto begin()
Definition: pattern.hpp:31
pattern_t(size_type size, size_type track_size)
Definition: pattern.hpp:16
void set_steps_per_beat(std::size_t steps)
Definition: pattern.hpp:64
Definition: clock.hpp:13
Definition: pattern.hpp:10
constexpr void set_loop_length(std::size_t loop_length) noexcept
Definition: pattern.hpp:80
void send_messages(message_t< 1 > message, const Sender &sender)
Definition: pattern.hpp:97
auto begin() const
Definition: pattern.hpp:36
const value_type & operator[](size_type i) const
Definition: pattern.hpp:26
constexpr auto default_pulses_per_quarter_note
Definition: constants.hpp:10