Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
midi_binding.hpp
Go to the documentation of this file.
1#pragma once
2
14
15#include <algorithm>
16#include <cmath>
17#include <cstdint>
19#include <pulp/view/widgets.hpp>
20
21namespace pulp::view {
22
23namespace detail {
24inline uint8_t to_cc_value(float normalized) {
25 const float clamped = std::clamp(normalized, 0.0f, 1.0f);
26 return static_cast<uint8_t>(std::lround(clamped * 127.0f));
27}
28} // namespace detail
29
31inline void bind_midi_cc(Knob& knob, midi::MidiControlBus& bus, uint8_t channel, uint8_t cc) {
32 knob.on_change = [&bus, channel, cc](float v) {
33 bus.send_cc(channel, cc, detail::to_cc_value(v));
34 };
35}
36
38inline void bind_midi_cc(Fader& fader, midi::MidiControlBus& bus, uint8_t channel, uint8_t cc) {
39 fader.on_change = [&bus, channel, cc](float v) {
40 bus.send_cc(channel, cc, detail::to_cc_value(v));
41 };
42}
43
45inline void bind_midi_cc(RangeSlider& slider, midi::MidiControlBus& bus, uint8_t channel,
46 uint8_t cc) {
47 slider.on_change = [&bus, channel, cc](float v) {
48 bus.send_cc(channel, cc, detail::to_cc_value(v));
49 };
50}
51
53inline void bind_midi_cc(ToggleButton& button, midi::MidiControlBus& bus, uint8_t channel,
54 uint8_t cc) {
55 button.on_toggle = [&bus, channel, cc](bool on) { bus.send_cc(channel, cc, on ? 127 : 0); };
56}
57
59inline void bind_midi_cc(Toggle& toggle, midi::MidiControlBus& bus, uint8_t channel, uint8_t cc) {
60 toggle.on_toggle = [&bus, channel, cc](bool on) { bus.send_cc(channel, cc, on ? 127 : 0); };
61}
62
64inline void bind_midi_note(ToggleButton& button, midi::MidiControlBus& bus, uint8_t channel,
65 uint8_t note, uint8_t velocity = 100) {
66 button.on_toggle = [&bus, channel, note, velocity](bool on) {
67 if (on)
68 bus.send_note_on(channel, note, velocity);
69 else
70 bus.send_note_off(channel, note);
71 };
72}
73
75inline void bind_midi_note(Toggle& toggle, midi::MidiControlBus& bus, uint8_t channel, uint8_t note,
76 uint8_t velocity = 100) {
77 toggle.on_toggle = [&bus, channel, note, velocity](bool on) {
78 if (on)
79 bus.send_note_on(channel, note, velocity);
80 else
81 bus.send_note_off(channel, note);
82 };
83}
84
85} // namespace pulp::view
Definition midi_control_bus.hpp:27
bool send_cc(uint8_t channel, uint8_t cc, uint8_t value)
Convenience senders (UI thread).
Definition midi_control_bus.hpp:34
bool send_note_on(uint8_t channel, uint8_t note, uint8_t velocity)
Definition midi_control_bus.hpp:37
bool send_note_off(uint8_t channel, uint8_t note)
Definition midi_control_bus.hpp:40
Definition widgets.hpp:1337
Definition widgets.hpp:901
Definition widgets.hpp:1750
std::function< void(float)> on_change
Fired when the value changes — from drag, click, or set_value().
Definition widgets.hpp:1972
Definition widgets.hpp:2383
std::function< void(bool)> on_toggle
Definition widgets.hpp:2462
Definition widgets.hpp:2036
Lock-free publication of MIDI events from a UI control to the audio thread.
Definition accessibility_provider.hpp:65
uint8_t to_cc_value(float normalized)
Definition midi_binding.hpp:24
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
void bind_midi_note(ToggleButton &button, midi::MidiControlBus &bus, uint8_t channel, uint8_t note, uint8_t velocity=100)
Toggle button → MIDI note: note-on while on, note-off when off.
Definition midi_binding.hpp:64
void bind_midi_cc(Knob &knob, midi::MidiControlBus &bus, uint8_t channel, uint8_t cc)
Knob → MIDI CC.
Definition midi_binding.hpp:31
@ fader
Definition design_ir.hpp:261
@ toggle
Definition design_ir.hpp:272
@ knob
Definition design_ir.hpp:260
@ v
Definition input_events.hpp:41
@ on
Definition accessibility.hpp:132