stuff-from-scratch/plugins/music/src/midi/MetaMidiEvent.h
2023-12-21 09:18:44 +00:00

75 lines
1.8 KiB
C++

#pragma once
#include "MidiEvent.h"
#include "MidiElements.h"
#include "Memory.h"
#include "String.h"
class MetaMidiEvent : public MidiEvent
{
public:
enum class Type
{
UNSET,
UNKNOWN,
SEQ_NUM,
TEXT,
COPYRIGHT,
TRACK_NAME,
INSTRUMENT_NAME,
LYRIC,
MARKER,
CUE_POINT,
CHANNEL_PREFIX,
END_TRACK,
SET_TEMPO,
SMPTE_OFFSET,
TIME_SIG,
KEY_SIG,
SEQ_CUSTOM
};
private:
static const int META_SEQ_NUM = 0x0;
static const int META_TEXT = 0x1;
static const int META_COPYRIGHT = 0x2;
static const int META_TRACK_NAME = 0x3; // 0000 0011
static const int META_INSTRUMENT_NAME = 0x4;
static const int META_LYRIC = 0x5;
static const int META_MARKER = 0x6;
static const int META_CUE_POINT = 0x7;
static const int META_CHANNEL_PREFIX = 0x20;
static const int META_END_TRACK = 0x2F;
static const int META_SET_TEMPO = 0x51; // 0101 0001
static const int META_SMPTE_OFFSET = 0x54;
static const int META_TIME_SIG = 0x58; // 0101 1000
static const int META_KEY_SIG = 0x59; // 0101 1001
static const int META_SEQ_CUSTOM = 0x7F;
public:
MetaMidiEvent();
static Ptr<MetaMidiEvent> Create();
void SetValue(int value);
void SetType(char c);
Type GetType() const;
void SetLabel(const String& label);
void SetTimeSignature(const MidiTimeSignature& timeSig);
void SetTimeCode(const MidiSmtpeTimecode& timeCode);
void SetKeySignature(const MidiKeySignature& keySig);
private:
Type mType {Type::UNSET};
char mUnKnownMarker{0};
String mLabel;
int mValue { 0 };
MidiTimeSignature mTimeSig;
MidiSmtpeTimecode mTimecode;
MidiKeySignature mKeySig;
};
using MetaMidiEventPtr = Ptr<MetaMidiEvent>;