MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
InputBinding.cpp
Go to the documentation of this file.
1#include "InputBinding.hpp"
2
3namespace MayaFlux::Core {
4
5InputBinding InputBinding::hid(uint32_t device_id)
6{
7 return { .backend = InputType::HID, .device_id = device_id };
8}
9
10InputBinding InputBinding::midi(uint32_t device_id, std::optional<uint8_t> channel)
11{
12 return {
14 .device_id = device_id,
15 .midi_channel = channel
16 };
17}
18
19InputBinding InputBinding::osc(const std::string& pattern)
20{
21 return {
23 .device_id = 0,
24 .osc_address_pattern = pattern.empty() ? std::nullopt : std::optional(pattern)
25 };
26}
27
29{
30 return { .backend = InputType::SERIAL, .device_id = device_id };
31}
32
33InputBinding InputBinding::hid_by_vid_pid(uint16_t vid, uint16_t pid)
34{
35 return {
37 .device_id = 0,
38 .hid_vendor_id = vid,
39 .hid_product_id = pid
40 };
41}
42
44 std::optional<uint8_t> cc_number,
45 std::optional<uint8_t> channel,
46 uint32_t device_id)
47{
48 return {
50 .device_id = device_id,
51 .midi_channel = channel,
52 .midi_message_type = 0xB0, // Control Change
53 .midi_cc_number = cc_number
54 };
55}
56
58 std::optional<uint8_t> channel,
59 uint32_t device_id)
60{
61 return {
63 .device_id = device_id,
64 .midi_channel = channel,
65 .midi_message_type = 0x90 // Note On
66 };
67}
68
70 std::optional<uint8_t> channel,
71 uint32_t device_id)
72{
73 return {
75 .device_id = device_id,
76 .midi_channel = channel,
77 .midi_message_type = 0x80 // Note Off
78 };
79}
80
82 std::optional<uint8_t> channel,
83 uint32_t device_id)
84{
85 return {
87 .device_id = device_id,
88 .midi_channel = channel,
89 .midi_message_type = 0xE0 // Pitch Bend
90 };
91}
92
94{
95 midi_channel = channel;
96 return *this;
97}
98
100{
101 midi_cc_number = cc;
102 return *this;
103}
104
106{
107 osc_address_pattern = pattern;
108 return *this;
109}
110
111// ────────────────────────────────────────────────────────────────────────────
112// InputDeviceInfo Implementation (inline)
113// ────────────────────────────────────────────────────────────────────────────
114
116{
117 return InputBinding {
119 .device_id = id
120 };
121}
122
123InputBinding InputDeviceInfo::to_binding_midi(std::optional<uint8_t> channel) const
124{
125 return InputBinding {
127 .device_id = id,
128 .midi_channel = channel
129 };
130}
131
132InputBinding InputDeviceInfo::to_binding_osc(const std::string& pattern) const
133{
134 return InputBinding {
136 .device_id = id,
137 .osc_address_pattern = pattern.empty() ? std::nullopt : std::optional(pattern)
138 };
139}
140
141InputValue InputValue::make_scalar(double v, uint32_t dev_id, InputType src)
142{
143 return {
145 .data = v,
146 .timestamp_ns = static_cast<uint64_t>(
147 std::chrono::steady_clock::now().time_since_epoch().count()),
148 .device_id = dev_id,
149 .source_type = src
150 };
151}
152
153InputValue InputValue::make_vector(std::vector<double> v, uint32_t dev_id, InputType src)
154{
155 return {
157 .data = std::move(v),
158 .timestamp_ns = static_cast<uint64_t>(
159 std::chrono::steady_clock::now().time_since_epoch().count()),
160 .device_id = dev_id,
161 .source_type = src
162 };
163}
164
165InputValue InputValue::make_bytes(std::vector<uint8_t> v, uint32_t dev_id, InputType src)
166{
167 return {
168 .type = Type::BYTES,
169 .data = std::move(v),
170 .timestamp_ns = static_cast<uint64_t>(
171 std::chrono::steady_clock::now().time_since_epoch().count()),
172 .device_id = dev_id,
173 .source_type = src
174 };
175}
176
177InputValue InputValue::make_midi(uint8_t status, uint8_t d1, uint8_t d2, uint32_t dev_id)
178{
179 return {
180 .type = Type::MIDI,
181 .data = MIDIMessage { .status = status, .data1 = d1, .data2 = d2 },
182 .timestamp_ns = static_cast<uint64_t>(
183 std::chrono::steady_clock::now().time_since_epoch().count()),
184 .device_id = dev_id,
186 };
187}
188
189InputValue InputValue::make_osc(std::string addr, std::vector<OSCArg> args, uint32_t dev_id)
190{
191 return {
192 .type = Type::OSC,
193 .data = OSCMessage { .address = std::move(addr), .arguments = std::move(args) },
194 .timestamp_ns = static_cast<uint64_t>(
195 std::chrono::steady_clock::now().time_since_epoch().count()),
196 .device_id = dev_id,
198 };
199}
200
201} // namespace MayaFlux::Core
InputType
Input backend type enumeration.
@ OSC
Open Sound Control (network)
@ HID
Generic HID devices (game controllers, custom hardware)
@ MIDI
MIDI controllers and instruments.
@ SERIAL
Serial port communication (Arduino, etc.)
static InputBinding hid_by_vid_pid(uint16_t vid, uint16_t pid)
Bind to HID device by vendor/product ID.
InputBinding & with_osc_pattern(const std::string &pattern)
Add OSC address pattern filter.
std::optional< uint8_t > midi_cc_number
Match specific CC number.
InputType backend
Which backend type.
static InputBinding midi_note_on(std::optional< uint8_t > channel={}, uint32_t device_id=0)
Bind to MIDI Note On messages.
static InputBinding midi_cc(std::optional< uint8_t > cc_number={}, std::optional< uint8_t > channel={}, uint32_t device_id=0)
Bind to MIDI Control Change messages.
static InputBinding midi(uint32_t device_id=0, std::optional< uint8_t > channel={})
Bind to MIDI device.
static InputBinding midi_pitch_bend(std::optional< uint8_t > channel={}, uint32_t device_id=0)
Bind to MIDI Pitch Bend messages.
std::optional< std::string > osc_address_pattern
Match OSC address prefix.
InputBinding & with_midi_channel(uint8_t channel)
Add MIDI channel filter.
std::optional< uint8_t > midi_channel
Match specific MIDI channel (1-16)
static InputBinding serial(uint32_t device_id=0)
Bind to Serial device.
static InputBinding midi_note_off(std::optional< uint8_t > channel={}, uint32_t device_id=0)
Bind to MIDI Note Off messages.
uint32_t device_id
Specific device (0 = any device)
InputBinding & with_midi_cc(uint8_t cc)
Add MIDI CC number filter.
static InputBinding osc(const std::string &pattern="")
Bind to OSC messages.
static InputBinding hid(uint32_t device_id=0)
Bind to HID device (any or specific)
Specifies what input an InputNode wants to receive.
InputBinding to_binding() const
Create a binding to this specific device.
uint32_t id
Unique device identifier within backend.
InputBinding to_binding_osc(const std::string &pattern) const
InputType backend_type
Which backend manages this device.
InputBinding to_binding_midi(std::optional< uint8_t > channel) const
Create a binding to this device with additional filters.
uint8_t status
Status byte (channel + message type)
std::string address
OSC address pattern.
uint32_t device_id
Source device identifier.
static InputValue make_bytes(std::vector< uint8_t > v, uint32_t dev_id, InputType src)
static InputValue make_midi(uint8_t status, uint8_t d1, uint8_t d2, uint32_t dev_id)
@ OSC
Structured OSC message.
@ MIDI
Structured MIDI message.
@ VECTOR
Multiple float values (e.g., accelerometer xyz)
@ SCALAR
Single normalized float [-1.0, 1.0] or [0.0, 1.0].
@ BYTES
Raw byte data (HID reports, sysex)
static InputValue make_osc(std::string addr, std::vector< OSCArg > args, uint32_t dev_id)
InputType source_type
Backend that generated this value.
static InputValue make_scalar(double v, uint32_t dev_id, InputType src)
static InputValue make_vector(std::vector< double > v, uint32_t dev_id, InputType src)
Generic input value container.