sequencer
device_spec.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <any>
4 #include <cstdint>
5 #include <ostream>
6 #include <string>
7 #include <vector>
8 
9 #define SEQUENCER_DEVICE_CC_VALUES \
10  X( std::int16_t, min, false ) \
11  X( std::int16_t, max, false ) \
12  X( std::int16_t, value, false ) \
13  X( std::uint8_t, cc_msb, false ) \
14  X( std::uint8_t, cc_lsb, true ) \
15  X( std::uint8_t, decimals, true )
16 
17 #define SEQUENCER_DEVICE_CC_ENTRIES \
18  X( std::string, name, false ) \
19  SEQUENCER_DEVICE_CC_VALUES \
20  X( std::vector< std::string >, str_map, true ) \
21  X( std::vector< int >, map, true )
22 
23 namespace sequencer::midi
24 {
25 #define X( type, name, is_optional ) type name{};
27  {
29  };
30 #undef X
31 
32 #define X( type, name, is_optional ) \
33  os << ( ( is_optional ) ? sub_sep : sep ) << " " << #name ": " << int( entry.name );
34  inline std::ostream& operator<<( std::ostream& os, const device_entry_t& entry )
35  {
36  constexpr auto sep = ";";
37  constexpr auto sub_sep = ",";
38  os << "name: " << entry.name;
40  if ( !entry.str_map.empty() )
41  {
42  os << sep << "str_map: " << entry.str_map.front();
43  for ( decltype( entry.str_map.size() ) i = 1; i < entry.str_map.size(); ++i )
44  {
45  os << sub_sep << " " << entry.str_map[ i ];
46  }
47  }
48  if ( !entry.map.empty() )
49  {
50  os << sep << "map: " << int( entry.map.front() );
51  for ( decltype( entry.map.size() ) i = 1; i < entry.map.size(); ++i )
52  {
53  os << sub_sep << " " << int( entry.map[ i ] );
54  }
55  }
56  return os;
57  }
58 #undef X
59 
60  struct section_t
61  {
62  explicit section_t( const std::string& name ) : name( name )
63  {
64  }
65 
66  explicit section_t( std::string&& name ) : name( std::move( name ) )
67  {
68  }
69 
70  std::string name;
71  std::vector< device_entry_t > entries{};
72  };
73 
74  inline std::ostream& operator<<( std::ostream& os, const section_t& section )
75  {
76  os << "section: " << section.name << "\n";
77  for ( const auto& entry : section.entries )
78  {
79  os << entry << "\n";
80  }
81  return os;
82  }
83 
84 } // namespace sequencer::midi
Definition: device_spec.hpp:26
section_t(std::string &&name)
Definition: device_spec.hpp:66
Definition: beat_duration.hpp:106
std::ostream & operator<<(std::ostream &os, const device_entry_t &entry)
Definition: device_spec.hpp:34
#define SEQUENCER_DEVICE_CC_VALUES
Definition: device_spec.hpp:9
Definition: device_spec.hpp:60
Definition: clock.hpp:13
section_t(const std::string &name)
Definition: device_spec.hpp:62
std::vector< device_entry_t > entries
Definition: device_spec.hpp:71
#define SEQUENCER_DEVICE_CC_ENTRIES
Definition: device_spec.hpp:17
std::string name
Definition: device_spec.hpp:70