/* * DISTRHO Cardinal Plugin * Copyright (C) 2021-2022 Filipe Coelho * * 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 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