Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
mpe_expression.hpp
Go to the documentation of this file.
1#pragma once
2
33
34#include <pulp/midi/message.hpp>
36
37#include <algorithm>
38#include <cmath>
39#include <cstdint>
40
42
46inline std::uint8_t to_7bit(double norm) noexcept {
47 const double clamped = std::clamp(norm, 0.0, 1.0);
48 return static_cast<std::uint8_t>(
49 std::clamp<int>(static_cast<int>(clamped * 127.0 + 0.5), 0, 127));
50}
51
58inline midi::MidiEvent pitch_bend_from_semitones(std::uint8_t channel,
59 double semitones) {
60 const double bend_norm = std::clamp(
61 semitones / static_cast<double>(
63 -1.0, 1.0);
64 const int bend14 = static_cast<int>(std::lround(8192.0 + bend_norm * 8191.0));
66 channel, static_cast<std::uint16_t>(std::clamp(bend14, 0, 16383)));
67}
68
71inline midi::MidiEvent channel_pressure(std::uint8_t channel, double norm) {
72 return midi::MidiEvent{
73 choc::midi::ShortMessage(
74 static_cast<std::uint8_t>(0xD0 | (channel & 0x0F)),
75 to_7bit(norm), 0),
76 0, 0.0};
77}
78
80inline constexpr std::uint8_t kTimbreController = 74;
81
83inline midi::MidiEvent timbre_cc(std::uint8_t channel, double norm) {
84 return midi::MidiEvent::cc(channel, kTimbreController, to_7bit(norm));
85}
86
87} // namespace pulp::format::mpe
static constexpr float kDefaultMemberBendSemitones
Default member-channel pitch-bend range (MPE spec).
Definition mpe_voice_tracker.hpp:73
MPE (MIDI Polyphonic Expression) voice tracker.
Definition mpe_expression.hpp:41
constexpr std::uint8_t kTimbreController
MPE timbre controller.
Definition mpe_expression.hpp:80
midi::MidiEvent timbre_cc(std::uint8_t channel, double norm)
Per-note timbre as CC 74.
Definition mpe_expression.hpp:83
std::uint8_t to_7bit(double norm) noexcept
Quantize a normalized [0,1] axis value to a 7-bit MIDI data byte.
Definition mpe_expression.hpp:46
midi::MidiEvent pitch_bend_from_semitones(std::uint8_t channel, double semitones)
Per-note pitch as a channel-wide 14-bit pitch bend.
Definition mpe_expression.hpp:58
midi::MidiEvent channel_pressure(std::uint8_t channel, double norm)
Per-note pressure as channel pressure (status 0xD0).
Definition mpe_expression.hpp:71
Timestamped MIDI event combining a choc::midi::ShortMessage with timing info.
Definition message.hpp:32
static MidiEvent cc(uint8_t channel, uint8_t controller, uint8_t value)
Create a Control Change event.
Definition message.hpp:64
static MidiEvent pitch_bend(uint8_t channel, uint16_t value)
Create a Pitch Bend event.
Definition message.hpp:73