2#include <ossia/detail/lockfree_queue.hpp>
3#include <ossia/network/base/device.hpp>
4#include <ossia/network/base/parameter.hpp>
5#include <ossia/network/base/protocol.hpp>
6#include <ossia/network/common/parameter_properties.hpp>
7#include <ossia/network/context_functions.hpp>
8#include <ossia/network/domain/domain.hpp>
9#include <ossia/network/value/value.hpp>
10#include <ossia/protocols/midi/detail/channel.hpp>
12#include <libremidi/api.hpp>
13#include <libremidi/configurations.hpp>
14#include <libremidi/detail/conversion.hpp>
15#include <libremidi/message.hpp>
16#include <libremidi/observer_configuration.hpp>
17#include <libremidi/ump.hpp>
26struct input_configuration;
27struct output_configuration;
30namespace ossia::net::midi
33struct OSSIA_EXPORT midi_info
41 midi_info() =
default;
42 midi_info(
const libremidi::input_port& p,
bool v)
48 midi_info(
const libremidi::output_port& p,
bool v)
55 midi_info(Type t,
const libremidi::port_information& p,
bool v)
63 libremidi::port_information handle{};
67struct midi_protocol_configuration
69 std::string device_name;
70 bool velocity_zero_is_note_off{};
73class OSSIA_EXPORT midi_protocol final
75 ,
public Nano::Observer
78 explicit midi_protocol(
79 ossia::net::network_context_ptr, midi_protocol_configuration,
80 libremidi::input_configuration&, libremidi::input_api_configuration midi_api);
81 explicit midi_protocol(
82 ossia::net::network_context_ptr, midi_protocol_configuration,
83 libremidi::output_configuration&, libremidi::output_api_configuration midi_api);
86 bool set_info(midi_info);
87 midi_info get_info()
const;
89 int64_t get_timestamp() const noexcept;
92 get_midi_port_name(
ossia::net::device_base* dev, const midi_info& info);
94 static std::vector<midi_info> scan(libremidi::API = libremidi::API::UNSPECIFIED);
96 void push_value(const libremidi::message&);
97 void push_value(const libremidi::ump&);
99 void enable_registration();
101 bool learning() const;
102 void set_learning(
bool);
104 libremidi::midi_in* midi_in() const noexcept {
return m_input.get(); }
106 ossia::spsc_queue<libremidi::ump> messages;
109 ossia::net::network_context_ptr m_context;
110 std::unique_ptr<libremidi::midi_in> m_input;
111 std::unique_ptr<libremidi::midi_out> m_output;
113 std::array<midi_channel, 16> m_channels;
115 midi_protocol_configuration m_config{};
117 midi_device* m_dev{};
119 std::atomic_bool m_learning{};
121 friend class midi_device;
122 friend class midi_parameter;
130 void register_parameter(midi_parameter& adrs);
131 void unregister_parameter(midi_parameter& adrs);
139 void midi_callback(libremidi::message&&);
140 void on_learn(
const libremidi::message& m);
142 libremidi::midi1_to_midi2 to_midi2;
Root of a device tree.
Definition ossia/network/base/device.hpp:58
The node_base class.
Definition node.hpp:48
The parameter_base class.
Definition ossia/network/base/parameter.hpp:48
The protocol_base class.
Definition protocol.hpp:40
The value class.
Definition value.hpp:173
void(* value_callback)(void *, const opp::value &)
container for a value callback
Definition ossia-cpp98.hpp:474
Full information about a parameter.
Definition parameter_data.hpp:61