121 lines
2.7 KiB
C++
121 lines
2.7 KiB
C++
/*
|
|
* DISTRHO Cardinal Plugin
|
|
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 3 of
|
|
* the License, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* For a full copy of the GNU General Public License see the LICENSE file.
|
|
*/
|
|
|
|
/**
|
|
* This file is an edited version of VCVRack's midi.hpp
|
|
* Copyright (C) 2016-2021 VCV.
|
|
*
|
|
* This program is free software: you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 3 of
|
|
* the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "choc/choc_SmallVector.h"
|
|
|
|
namespace rack {
|
|
/** Abstraction for all MIDI drivers in Rack */
|
|
namespace midi {
|
|
|
|
|
|
struct Message {
|
|
/** Initialized to 3 empty bytes. */
|
|
choc::SmallVector<uint8_t, 3> bytes;
|
|
/** The Engine frame timestamp of the Message.
|
|
For output messages, the frame when the message was generated.
|
|
For input messages, the frame when it is intended to be processed.
|
|
-1 for undefined, to be sent or processed immediately.
|
|
*/
|
|
int64_t frame = -1;
|
|
|
|
Message() {
|
|
bytes.resize(3);
|
|
}
|
|
|
|
int getSize() const {
|
|
return bytes.size();
|
|
}
|
|
void setSize(int size) {
|
|
bytes.resize(size);
|
|
}
|
|
|
|
uint8_t getChannel() const {
|
|
if (bytes.size() < 1)
|
|
return 0;
|
|
return bytes[0] & 0xf;
|
|
}
|
|
void setChannel(uint8_t channel) {
|
|
if (bytes.size() < 1)
|
|
return;
|
|
bytes[0] = (bytes[0] & 0xf0) | (channel & 0xf);
|
|
}
|
|
|
|
uint8_t getStatus() const {
|
|
if (bytes.size() < 1)
|
|
return 0;
|
|
return bytes[0] >> 4;
|
|
}
|
|
void setStatus(uint8_t status) {
|
|
if (bytes.size() < 1)
|
|
return;
|
|
bytes[0] = (bytes[0] & 0xf) | (status << 4);
|
|
}
|
|
|
|
uint8_t getNote() const {
|
|
if (bytes.size() < 2)
|
|
return 0;
|
|
return bytes[1];
|
|
}
|
|
void setNote(uint8_t note) {
|
|
if (bytes.size() < 2)
|
|
return;
|
|
bytes[1] = note & 0x7f;
|
|
}
|
|
|
|
uint8_t getValue() const {
|
|
if (bytes.size() < 3)
|
|
return 0;
|
|
return bytes[2];
|
|
}
|
|
void setValue(uint8_t value) {
|
|
if (bytes.size() < 3)
|
|
return;
|
|
bytes[2] = value & 0x7f;
|
|
}
|
|
|
|
std::string toString() const;
|
|
|
|
int64_t getFrame() const {
|
|
return frame;
|
|
}
|
|
|
|
void setFrame(int64_t frame) {
|
|
this->frame = frame;
|
|
}
|
|
};
|
|
|
|
|
|
/* NOTE all the other MIDI stuff (drivers, ports etc) is purposefully missing here, unwanted in Cardinal
|
|
*/
|
|
struct Port;
|
|
|
|
|
|
} // namespace midi
|
|
} // namespace rack
|