Files
ss/include/nw4r/snd/snd_MmlParser.h
T
2025-05-25 08:53:24 +02:00

196 lines
4.2 KiB
C++

#ifndef NW4R_SND_MML_PARSER_H
#define NW4R_SND_MML_PARSER_H
/*******************************************************************************
* headers
*/
#include "common.h"
#include "nw4r/snd/snd_MmlSeqTrack.h"
/*******************************************************************************
* classes and functions
*/
// forward declarations
namespace nw4r { namespace snd { namespace detail { class Channel; }}}
namespace nw4r { namespace snd { namespace detail { class SeqPlayer; }}}
namespace nw4r { namespace snd { namespace detail { class SeqTrack; }}}
namespace nw4r { namespace snd { namespace detail
{
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x31383
class MmlParser
{
// enums
private:
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x31279
enum SeqArgType
{
SEQ_ARG_NONE,
SEQ_ARG_U8,
SEQ_ARG_S16,
SEQ_ARG_VMIDI,
SEQ_ARG_RANDOM,
SEQ_ARG_VARIABLE,
};
enum MmlCommand
{
MML_CMD_MIN = 0x80, // <80 -> MML note, not a command
MML_CMD_MAX = 0xff,
MML_CMD_MASK = 0x80,
MML_CMD_SET_MASK = 0xf0,
MML_WAIT = 0x80,
MML_SET_PRGNO,
MML_OPEN_TRACK = 0x88,
MML_JUMP,
MML_CALL,
MML_ARG_1_RANDOM = 0xa0,
MML_ARG_1_VARIABLE,
MML_EXEC_IF,
MML_ARG_2_S16,
MML_ARG_2_RANDOM,
MML_ARG_2_VARIABLE,
MML_SET_TIMEBASE = 0xb0,
MML_SET_ENV_HOLD,
MML_SET_MONOPHONIC,
MML_SET_TRACK_VELOCITY_RANGE,
MML_SET_BIQUAD_TYPE,
MML_SET_BIQUAD_VALUE,
MML_SET_PAN = 0xc0,
MML_SET_TRACK_VOLUME,
MML_SET_PLAYER_VOLUME,
MML_SET_TRANSPOSE,
MML_SET_PITCH_BEND,
MML_SET_BEND_RANGE,
MML_SET_PRIORITY,
MML_SET_NOTE_WAIT,
MML_SET_TIE,
MML_SET_PORTAMENTO,
MML_SET_LFO_DEPTH,
MML_SET_LFO_SPEED,
MML_SET_LFO_TARGET,
MML_SET_LFO_RANGE,
MML_SET_PORTASPEED,
MML_SET_PORTATIME,
MML_SET_ATTACK = 0xd0,
MML_SET_DECAY,
MML_SET_SUSTAIN,
MML_SET_RELEASE,
MML_LOOP_START,
MML_SET_TRACK_VOLUME2,
MML_PRINT_VAR,
MML_SET_SURROUND_PAN,
MML_SET_LPF_FREQ,
MML_SET_FX_SEND_A,
MML_SET_FX_SEND_B,
MML_SET_MAIN_SEND,
MML_SET_INIT_PAN,
MML_SET_MUTE,
MML_SET_FX_SEND_C,
MML_SET_DAMPER,
MML_SET_LFO_DELAY = 0xe0,
MML_SET_TEMPO,
MML_SET_E2,
MML_SET_SWEEP_PITCH,
MML_RESET_ADSR = 0xfb,
MML_LOOP_END,
MML_RET,
MML_ALLOC_TRACK,
MML_EOF
};
enum MmlExCommand
{
MML_EX_COMMAND = 0xf0,
MML_EX_CMD_MAX = 0xffff,
MML_EX_ARITHMETIC = 0x80,
MML_EX_SET = 0x80,
MML_EX_APL,
MML_EX_AMI,
MML_EX_AMU,
MML_EX_ADV,
MML_EX_ALS,
MML_EX_RND,
MML_EX_AAD,
MML_EX_AOR,
MML_EX_AER,
MML_EX_ACO,
MML_EX_AMD,
MML_EX_LOGIC = 0x90,
MML_EX_EQ = 0x90,
MML_EX_GE,
MML_EX_GT,
MML_EX_LE,
MML_EX_LT,
MML_EX_NE,
MML_EX_USERPROC = 0xe0,
};
// methods
public:
// virtual function ordering
// vtable MmlParser
virtual void CommandProc(MmlSeqTrack *track, u32 command,
s32 commandArg1, s32 commandArg2) const;
virtual Channel *NoteOnCommandProc(MmlSeqTrack *track, int key,
int velocity, s32 length,
bool tieFlag) const;
// methods
MmlSeqTrack::ParseResult Parse(MmlSeqTrack *track, bool doNoteOn) const;
s16 volatile *GetVariablePtr(SeqPlayer *player, SeqTrack *track,
int varNo) const;
static void EnablePrintVar(bool enable)
{
mPrintVarEnabledFlag = enable;
}
static u32 ParseAllocTrack(void const *baseAddress, u32 seqOffset,
u32 *allocTrack);
private:
u8 ReadByte(byte_t const **ptr) const { return *(*ptr)++; }
u16 Read16(byte_t const **ptr) const;
u32 Read24(byte_t const **ptr) const;
s32 ReadVar(byte_t const **ptr) const;
s32 ReadArg(byte_t const **ptr, SeqPlayer *player, SeqTrack *track,
SeqArgType argType) const;
// static members
public:
static int const TEMPO_MAX = 1023;
static int const TEMPO_MIN = 0;
static int const CALL_STACK_DEPTH = 3;
static int const SURROUND_PAN_CENTER;
static int const PAN_CENTER = 64;
private:
static bool mPrintVarEnabledFlag;
// members
private:
/* vtable */ // size 0x04, offset 0x00
}; // size 0x04
}}} // namespace nw4r::snd::detail
#endif // NW4R_SND_MML_PARSER_H