Files
ss/include/nw4r/snd/snd_SeqTrack.h
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

167 lines
4.1 KiB
C++

#ifndef NW4R_SND_SEQ_TRACK_H
#define NW4R_SND_SEQ_TRACK_H
#include "nw4r/snd/snd_Channel.h"
#include "nw4r/snd/snd_Lfo.h"
#include "nw4r/types_nw4r.h"
#include "rvl/WPAD.h" // IWYU pragma: export
namespace nw4r {
namespace snd {
enum SeqMute {
MUTE_OFF,
MUTE_NO_STOP,
MUTE_RELEASE,
MUTE_STOP
};
enum ParseResult {
PARSE_RESULT_CONTINUE,
PARSE_RESULT_FINISH
};
namespace detail {
class SeqTrack {
public:
static const int VARIABLE_NUM = 16;
static const int PRGNO_MAX = 0xFFFF;
struct ParserTrackParam {
const u8 *baseAddr; // at 0x0
const u8 *currentAddr; // at 0x4
s32 wait; // at 0x8
bool muteFlag; // at 0xC
bool silenceFlag; // at 0xD
bool noteFinishWait; // at 0xE
bool portaFlag; // at 0xF
bool damperFlag; // at 0x10
int bankNo; // at 0x14
int prgNo; // at 0x18
LfoParam lfoParam; // at 0x1C
u8 lfoTarget; // at 0x2C
f32 sweepPitch; // at 0x30
u8 volume; // at 0x34
u8 volume2; // at 0x35
s8 pitchBend; // at 0x36
u8 bendRange; // at 0x37
s8 pan; // at 0x38
s8 initPan; // at 0x39
s8 surroundPan; // at 0x3A
s8 transpose; // at 0x3B
u8 priority; // at 0x3C
u8 portaKey; // at 0x3D
u8 portaTime; // at 0x3E
u8 attack; // at 0x3F
u8 decay; // at 0x40
u8 sustain; // at 0x41
u8 release; // at 0x42
u8 mainSend; // at 0x43
u8 fxSend[AUX_BUS_NUM]; // at 0x44
u8 lpfFreq; // at 0x47
};
public:
SeqTrack();
virtual ~SeqTrack(); // at 0x8
virtual ParseResult Parse(bool doNoteOn) = 0; // at 0xC
bool IsOpened() const {
return mOpenFlag;
}
void SetPlayerTrackNo(int no);
u8 GetPlayerTrackNo() const {
return mPlayerTrackNo;
}
void InitParam();
void SetSeqData(const void *pBase, s32 offset);
void Open();
void Close();
void UpdateChannelLength();
void UpdateChannelRelease(Channel *pChannel);
int ParseNextTick(bool doNoteOn);
void StopAllChannel();
void ReleaseAllChannel(int release);
void PauseAllChannel(bool flag);
void AddChannel(Channel *pChannel);
void UpdateChannelParam();
void FreeAllChannel();
void SetMute(SeqMute mute);
void SetVolume(f32 volume);
void SetPitch(f32 pitch);
ParserTrackParam &GetParserTrackParam() {
return mParserTrackParam;
}
volatile s16 *GetVariablePtr(int i);
SeqPlayer *GetSeqPlayer() {
return mPlayer;
}
void SetSeqPlayer(SeqPlayer *pPlayer) {
mPlayer = pPlayer;
}
Channel *GetLastChannel() const {
return mChannelList;
}
Channel *NoteOn(int key, int velocity, s32 length, bool tie);
private:
static const int DEFAULT_PRIORITY = 64;
static const int DEFAULT_BENDRANGE = 2;
static const int DEFAULT_PORTA_KEY = 60;
static const int DEFAULT_VARIABLE_VALUE = -1;
private:
static void ChannelCallbackFunc(Channel *pDropChannel, Channel::ChannelCallbackStatus status, u32 callbackArg);
private:
u8 mPlayerTrackNo; // at 0x4
bool mOpenFlag; // at 0x5
f32 mExtVolume; // at 0x8
f32 mExtPitch; // at 0xC
f32 mExtPan; // at 0x10
f32 mExtSurroundPan; // at 0x14
f32 mPanRange; // at 0x18
f32 mExtLpfFreq; // at 0x1C
f32 mExtMainSend; // at 0x20
f32 mExtFxSend[AUX_BUS_NUM]; // at 0x24
f32 mExtRemoteSend[WPAD_MAX_CONTROLLERS]; // at 0x30
f32 mExtRemoteFxSend[WPAD_MAX_CONTROLLERS]; // at 0x40
ParserTrackParam mParserTrackParam; // at 0x50
volatile s16 mTrackVariable[VARIABLE_NUM]; // at 0x98
SeqPlayer *mPlayer; // at 0xB8
Channel *mChannelList; // at 0xBC
};
} // namespace detail
} // namespace snd
} // namespace nw4r
#endif