48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
|
|
namespace Xybrid::Data {
|
|
class CommandPort;
|
|
}
|
|
|
|
namespace Xybrid::NodeLib {
|
|
class ParamReader;
|
|
class CommandReader {
|
|
friend class ParamReader;
|
|
uint8_t* data;
|
|
size_t dataSize;
|
|
size_t cur = static_cast<size_t>(-1);
|
|
public:
|
|
CommandReader(Data::CommandPort*);
|
|
CommandReader(std::shared_ptr<Data::CommandPort> p) : CommandReader(p.get()) { }
|
|
|
|
operator bool() const;
|
|
CommandReader& operator++();
|
|
|
|
// data access
|
|
inline uint16_t noteId() const { return reinterpret_cast<uint16_t&>(data[cur]); }
|
|
inline int16_t note() const { return reinterpret_cast<int16_t&>(data[cur+2]); }
|
|
inline uint8_t numParams() const { return data[cur+4]; }
|
|
inline uint8_t param(uint8_t num) const { return data[cur+5+num*2]; }
|
|
inline uint8_t val(uint8_t num) const { return data[cur+6+num*2]; }
|
|
};
|
|
class ParamReader {
|
|
CommandReader cr;
|
|
int16_t pn = -1;
|
|
int16_t pmax = 0;
|
|
public:
|
|
ParamReader(const CommandReader&);
|
|
|
|
operator bool() const;
|
|
ParamReader& operator++();
|
|
|
|
// data access
|
|
inline uint8_t param() const { return cr.param(static_cast<uint8_t>(pn)); }
|
|
inline uint8_t val() const { return cr.val(static_cast<uint8_t>(pn)); }
|
|
|
|
int16_t next(bool acceptsTweens, uint8_t = 1) const;
|
|
int16_t tween() const;
|
|
};
|
|
}
|