NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
snd_MmlParser.h
1#ifndef NW4R_SND_MML_PARSER_H
2#define NW4R_SND_MML_PARSER_H
3
4/*******************************************************************************
5 * headers
6 */
7
8#include <types.h>
9
10#include "nw4r/snd/snd_MmlSeqTrack.h"
11
12/*******************************************************************************
13 * classes and functions
14 */
15
16// forward declarations
17namespace nw4r { namespace snd { namespace detail { class Channel; }}}
18namespace nw4r { namespace snd { namespace detail { class SeqPlayer; }}}
19namespace nw4r { namespace snd { namespace detail { class SeqTrack; }}}
20
21namespace nw4r { namespace snd { namespace detail
22{
23 // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x31383
25 {
26 // enums
27 private:
28 // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x31279
29 enum SeqArgType
30 {
31 SEQ_ARG_NONE,
32
33 SEQ_ARG_U8,
34 SEQ_ARG_S16,
35 SEQ_ARG_VMIDI,
36 SEQ_ARG_RANDOM,
37 SEQ_ARG_VARIABLE,
38 };
39
40 enum MmlCommand
41 {
42 MML_CMD_MIN = 0x80, // <80 -> MML note, not a command
43 MML_CMD_MAX = 0xff,
44
45 MML_CMD_MASK = 0x80,
46 MML_CMD_SET_MASK = 0xf0,
47
48 MML_WAIT = 0x80,
49 MML_SET_PRGNO,
50
51 MML_OPEN_TRACK = 0x88,
52 MML_JUMP,
53 MML_CALL,
54
55 MML_ARG_1_RANDOM = 0xa0,
56 MML_ARG_1_VARIABLE,
57 MML_EXEC_IF,
58 MML_ARG_2_S16,
59 MML_ARG_2_RANDOM,
60 MML_ARG_2_VARIABLE,
61
62 MML_SET_TIMEBASE = 0xb0,
63 MML_SET_ENV_HOLD,
64 MML_SET_MONOPHONIC,
65 MML_SET_TRACK_VELOCITY_RANGE,
66 MML_SET_BIQUAD_TYPE,
67 MML_SET_BIQUAD_VALUE,
68
69 MML_SET_PAN = 0xc0,
70 MML_SET_TRACK_VOLUME,
71 MML_SET_PLAYER_VOLUME,
72 MML_SET_TRANSPOSE,
73 MML_SET_PITCH_BEND,
74 MML_SET_BEND_RANGE,
75 MML_SET_PRIORITY,
76 MML_SET_NOTE_WAIT,
77 MML_SET_TIE,
78 MML_SET_PORTAMENTO,
79 MML_SET_LFO_DEPTH,
80 MML_SET_LFO_SPEED,
81 MML_SET_LFO_TARGET,
82 MML_SET_LFO_RANGE,
83 MML_SET_PORTASPEED,
84 MML_SET_PORTATIME,
85
86 MML_SET_ATTACK = 0xd0,
87 MML_SET_DECAY,
88 MML_SET_SUSTAIN,
89 MML_SET_RELEASE,
90 MML_LOOP_START,
91 MML_SET_TRACK_VOLUME2,
92 MML_PRINT_VAR,
93 MML_SET_SURROUND_PAN,
94 MML_SET_LPF_FREQ,
95 MML_SET_FX_SEND_A,
96 MML_SET_FX_SEND_B,
97 MML_SET_MAIN_SEND,
98 MML_SET_INIT_PAN,
99 MML_SET_MUTE,
100 MML_SET_FX_SEND_C,
101 MML_SET_DAMPER,
102
103 MML_SET_LFO_DELAY = 0xe0,
104 MML_SET_TEMPO,
105 MML_SET_E2,
106 MML_SET_SWEEP_PITCH,
107
108 MML_RESET_ADSR = 0xfb,
109 MML_LOOP_END,
110 MML_RET,
111 MML_ALLOC_TRACK,
112 MML_EOF
113 };
114
115 enum MmlExCommand
116 {
117 MML_EX_COMMAND = 0xf0,
118
119 MML_EX_CMD_MAX = 0xffff,
120
121 MML_EX_ARITHMETIC = 0x80,
122 MML_EX_SET = 0x80,
123 MML_EX_APL,
124 MML_EX_AMI,
125 MML_EX_AMU,
126 MML_EX_ADV,
127 MML_EX_ALS,
128 MML_EX_RND,
129 MML_EX_AAD,
130 MML_EX_AOR,
131 MML_EX_AER,
132 MML_EX_ACO,
133 MML_EX_AMD,
134
135 MML_EX_LOGIC = 0x90,
136 MML_EX_EQ = 0x90,
137 MML_EX_GE,
138 MML_EX_GT,
139 MML_EX_LE,
140 MML_EX_LT,
141 MML_EX_NE,
142
143 MML_EX_USERPROC = 0xe0,
144 };
145
146 // methods
147 public:
148 // virtual function ordering
149 // vtable MmlParser
150 virtual void CommandProc(MmlSeqTrack *track, ulong command,
151 s32 commandArg1, s32 commandArg2) const;
152 virtual Channel *NoteOnCommandProc(MmlSeqTrack *track, int key,
153 int velocity, s32 length,
154 bool tieFlag) const;
155
156 // methods
157 MmlSeqTrack::ParseResult Parse(MmlSeqTrack *track, bool doNoteOn) const;
158
159 s16 volatile *GetVariablePtr(SeqPlayer *player, SeqTrack *track,
160 int varNo) const;
161
162 static void EnablePrintVar(bool enable)
163 {
164 mPrintVarEnabledFlag = enable;
165 }
166
167 static ulong ParseAllocTrack(void const *baseAddress, ulong seqOffset,
168 ulong *allocTrack);
169
170 private:
171 u8 ReadByte(byte_t const **ptr) const { return *(*ptr)++; }
172 u16 Read16(byte_t const **ptr) const;
173 ulong Read24(byte_t const **ptr) const;
174 s32 ReadVar(byte_t const **ptr) const;
175 s32 ReadArg(byte_t const **ptr, SeqPlayer *player, SeqTrack *track,
176 SeqArgType argType) const;
177
178 // static members
179 public:
180 static int const TEMPO_MAX = 1023;
181 static int const TEMPO_MIN = 0;
182 static int const CALL_STACK_DEPTH = 3;
183 static int const SURROUND_PAN_CENTER;
184 static int const PAN_CENTER = 64;
185
186 private:
187 static bool mPrintVarEnabledFlag;
188
189 // members
190 private:
191 /* vtable */ // size 0x04, offset 0x00
192 }; // size 0x04
193}}} // namespace nw4r::snd::detail
194
195#endif // NW4R_SND_MML_PARSER_H