Program Listing for File PDJE_MIDI.hpp

Return to documentation for file (include\input\midi\PDJE_MIDI.hpp)

#pragma once

#include "PDJE_Buffer.hpp"
#include "PDJE_Highres_Clock.hpp"
#include "PDJE_LOG_SETTER.hpp"
#include <libremidi/libremidi.hpp>

#define PDJE_BIT_PARSE_7(N) (N & 0x7F)
#define B_GUARD(B, N)                                                          \
    if (B.size() < N)                                                          \
        return;
namespace PDJE_MIDI {
struct PDJE_API MIDI_EV {
    uint8_t  type;
    uint8_t  ch;
    uint8_t  pos;
    uint16_t value;
    uint64_t highres_time;
    char     port_name[256];
    uint8_t  port_name_len = 0;
};

class MIDI {
  private:
    libremidi::observer                                               obs;
    PDJE_HIGHRES_CLOCK::CLOCK                                         clock;
    std::vector<std::pair<libremidi::midi_in, libremidi::input_port>> midiin;
    std::unordered_map<std::string, std::array<std::array<uint16_t, 32>, 16>>
        __CC_stat;

  public:
    Atomic_Double_Buffer<MIDI_EV>      evlog;
    std::vector<libremidi::input_port> configed_devices;
    void
    Run(const bool CC_LSB_ON = true);

    void
    Config(const libremidi::input_port &midi_dev)
    {
        configed_devices.push_back(midi_dev);
    }

    std::vector<libremidi::input_port>
    GetDevices()
    {
        return obs.get_input_ports();
    }
    MIDI(const int buffer_size = 64);
    ~MIDI() = default;
};
}; // namespace PDJE_MIDI