SDK-free MIDI/SysEx packet translation for the AAX runtime. More...
#include <pulp/midi/buffer.hpp>#include <pulp/midi/message.hpp>#include <array>#include <cstdint>#include <span>#include <vector>Go to the source code of this file.
Classes | |
| struct | pulp::format::aax::MidiPacketBytes |
| SDK-free mirror of the fields of AAX_CMidiPacket this layer needs. More... | |
Namespaces | |
| namespace | pulp |
| namespace | pulp::format |
| What the product grants a device: the quota table indexed by capability tier and live thermal state. | |
| namespace | pulp::format::aax |
Functions | |
| void | pulp::format::aax::decode_midi_packets (std::span< const MidiPacketBytes > packets, midi::MidiBuffer &out) |
Decode a stream of AAX-style packets into out (short messages plus reassembled SysEx). | |
| std::vector< MidiPacketBytes > | pulp::format::aax::fragment_sysex (std::span< const uint8_t > payload, uint32_t timestamp) |
Fragment one full F0..F7 SysEx payload into consecutive 4-byte packets that all share timestamp — the inverse of decode's reassembly. | |
SDK-free MIDI/SysEx packet translation for the AAX runtime.
AAX delivers MIDI as a stream of fixed 4-byte AAX_CMidiPacket entries: short channel-voice/system messages are 1..3 bytes in a single packet, and a system-exclusive run is split across consecutive packets with F0 in the first and F7 in the last (continuation packets carry no status byte). Getting that reassembly — and the inverse fragmentation on output — right is the most fragile, regression-prone part of the AAX adapter, but it lived inline in aax_runtime.cpp against AAX_* types and could only be compiled (let alone tested) on a machine with the developer-supplied AAX SDK.
This header lifts that logic into pure functions over a minimal, SDK-independent packet struct so the state machine can be unit-tested without the SDK. aax_runtime.cpp translates AAX_CMidiPacket <-> these structs and delegates here, so the tested code is the shipping code.